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: truepara 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
-
NetworkAttachmentDefinition para cada bridge físico:
br-admin(192.168.1.0/24)br-srv(192.168.200.0/22)
-
ConfigMap con el
Corefile(configuración de CoreDNS) -
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: trueexpone 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.