Skip to content

Instantly share code, notes, and snippets.

@a0s
Last active April 9, 2026 13:32
Show Gist options
  • Select an option

  • Save a0s/3fe6605203382cfce85573ac6193ab9e to your computer and use it in GitHub Desktop.

Select an option

Save a0s/3fe6605203382cfce85573ac6193ab9e to your computer and use it in GitHub Desktop.
MetalLB + Traefik (CDKTF)
// /**
// * MetalLB
// */
const metallbNamespace = new Namespace(this, "metallb_namespace", {
provider: kubernetesProvider,
metadata: {
name: "metallb",
},
});
const metallb = new Release(this, "metallb", {
provider: helmProvider,
name: "metallb",
chart: "metallb",
repository: "https://metallb.github.io/metallb",
version: "0.14.9",
namespace: metallbNamespace.metadata.name,
});
const addresses = config.serverIps.map((ip) => `${ip}/32`);
const metallbAddressPool = new Manifest(this, "ipaddresspool", {
dependsOn: [metallb],
provider: kubernetesProvider,
manifest: {
apiVersion: "metallb.io/v1beta1",
kind: "IPAddressPool",
metadata: {
name: "metallb",
namespace: metallbNamespace.metadata.name,
},
spec: {
addresses: addresses,
},
},
});
const metallbL2Advertisement = new Manifest(this, "l2advertisement", {
dependsOn: [metallb],
provider: kubernetesProvider,
manifest: {
apiVersion: "metallb.io/v1beta1",
kind: "L2Advertisement",
metadata: {
name: "l2adv",
namespace: metallbNamespace.metadata.name,
},
},
});
/**
* Traefik
*/
new Release(this, "traefik", {
dependsOn: [metallb, metallbL2Advertisement],
provider: helmProvider,
name: "traefik",
chart: "traefik",
repository: "https://traefik.github.io/charts",
version: "v37.0.0",
namespace: "kube-system",
set: [
{ name: "deployment.kind", value: "DaemonSet" },
{ name: "deployment.healthchecksPort", value: "8000" },
{ name: "podDisruptionBudget.enabled", value: "true" },
{ name: "podDisruptionBudget.maxUnavailable", value: "1" },
{ name: "logs.general.level", value: "INFO" },
{
name: "additionalArguments",
value: "{--ping.entrypoint=web,--api.disabledashboardad=true}",
},
{ name: "ingressRoute.dashboard.enabled", value: "false" }, // lets do this manually
{ name: "ports.web.exposedPort", value: "80" },
{ name: "ports.websecure.exposedPort", value: "443" },
{ name: "service.type", value: "LoadBalancer" },
{ name: "service.spec.externalTrafficPolicy", value: "Local" },
{
name: "service.annotations.metallb\\.io/address-pool",
value: Fn.lookupNested(metallbAddressPool.manifest, [
"metadata",
"name",
]),
},
{
name: "service.annotations.metallb\\.io/allow-shared-ip",
value: Fn.lookupNested(metallbAddressPool.manifest, [
"metadata",
"name",
]),
},
],
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment