Files

CoreDNS con Multus: README de Configuración

Este documento explica cómo desplegar un pod de CoreDNS en Kubernetes con Multus CNI para conectarlo a dos redes físicas (bridges) distintas, asignándole una dirección IP en cada una, y usando hostNetwork para exponer el servicio DNS de forma estándar en el host.


Objetivo

  • Desplegar CoreDNS con:

    • IP 192.168.1.100/24 en la red br-admin
    • IP 192.168.200.100/22 en la red br-srv
  • Utilizar hostNetwork: true para que CoreDNS escuche en el puerto 53 real del host

  • Añadir un sidecar de herramientas para inspección de red


¿Por qué Multus?

  • Kubernetes estándar solo permite una interfaz por pod (la principal).
  • Multus permite añadir interfaces adicionales, conectando el pod a varias redes físicas (como bridges de Linux).
  • En este caso, usamos Multus para asignar a CoreDNS dos IPs fijas en dos bridges diferentes, actuando como DNS en ambas redes.

Componentes principales

  1. NetworkAttachmentDefinition para cada bridge físico:

    • br-admin (192.168.1.0/24)
    • br-srv (192.168.200.0/22)
  2. ConfigMap con el Corefile (configuración de CoreDNS)

  3. Pod con:

    • hostNetwork: true
    • Anotación Multus para conectar ambas redes
    • Sidecar de utilidades (busybox)

Paso a paso

1. NetworkAttachmentDefinition

Define una NetworkAttachmentDefinition por red, ejemplo:

br-admin.yaml:

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: br-admin
  namespace: coredns-multus
spec:
  config: '{
    "cniVersion": "0.3.1",
    "type": "bridge",
    "bridge": "br-admin",
    "ipam": {
      "type": "static",
      "addresses": [
        {
          "address": "192.168.1.100/24",
          "gateway": "192.168.1.1"
        }
      ]
    }
  }'

br-srv.yaml igual, cambiando nombre y dirección IP.


2. ConfigMap con Corefile

Ejemplo:

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns-config
  namespace: coredns-multus
data:
  Corefile: |
    .:53 {
        log
        errors
        forward . 8.8.8.8
        cache 30
    }

3. Pod con Multus y sidecar de utilidades

apiVersion: v1
kind: Pod
metadata:
  name: coredns-multus
  namespace: coredns-multus
  annotations:
    k8s.v1.cni.cncf.io/networks: |
      [
        { "name": "br-admin", "namespace": "coredns-multus" },
        { "name": "br-srv", "namespace": "coredns-multus" }
      ]
spec:
  hostNetwork: true
  containers:
    - name: coredns
      image: coredns/coredns:1.11.1
      volumeMounts:
        - name: config-volume
          mountPath: /etc/coredns/Corefile
          subPath: Corefile
      ports:
        - containerPort: 53
          protocol: UDP
        - containerPort: 53
          protocol: TCP
    - name: tools
      image: busybox
      command: [ "sleep", "infinity" ]
  volumes:
    - name: config-volume
      configMap:
        name: coredns-config
  tolerations:
    - operator: "Exists"
  dnsPolicy: "Default"

Comprobación de las interfaces

Desplegar:

kubectl apply -k .     #<-- (hay un kustomization en la carpeta coredns del repositorio)

Comprobación de las interfaces

Para ver las interfaces asignadas por Multus:

kubectl -n coredns-multus exec -it coredns-multus -c tools -- ip a

Deberías ver:

  • La interfaz principal (del host, por hostNetwork)
  • Una interfaz extra con IP 192.168.1.100
  • Otra interfaz extra con IP 192.168.200.100

Notas importantes

  • hostNetwork: true expone el puerto 53 real en el host.
  • La IP principal será la del host, las secundarias las de Multus.
  • Puedes poner el pod en modo Deployment para alta disponibilidad, pero solo una instancia por host con hostNetwork: true.
  • El sidecar puede eliminarse después de la verificación, no es necesario para producción.