# 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`: ```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: ```yaml 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 ```yaml 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: ```sh kubectl apply -k . #<-- (hay un kustomization en la carpeta coredns del repositorio) ``` --- ## Comprobación de las interfaces Para ver las interfaces asignadas por Multus: ```sh 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.