From 785848070207dde0f0f24a0deb5b6893197ec973 Mon Sep 17 00:00:00 2001 From: xguefer Date: Fri, 25 Jul 2025 17:26:07 +0200 Subject: [PATCH] =?UTF-8?q?a=C3=B1adida=20documentacion=20del=20ejemplo=20?= =?UTF-8?q?de=20Multus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- coredns/readme.md | 162 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 coredns/readme.md diff --git a/coredns/readme.md b/coredns/readme.md new file mode 100644 index 0000000..cfdead7 --- /dev/null +++ b/coredns/readme.md @@ -0,0 +1,162 @@ +# 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 + +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. +