Red de host
Escenario
Kubernetes permite que los pods utilicen directamente la red host/node. Cuando un pod se configura con hostNetwork: true, las aplicaciones que se ejecutan en el pod pueden ver directamente la interfaz de red del host donde se encuentra el pod.
Configuración
Agregue hostNetwork: true a la definición de pod.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
hostNetwork: true
containers:
- image: nginx:alpine
name: nginx
imagePullSecrets:
- name: default-secret
La configuración se realiza correctamente si la IP del pod es la misma que la IP del nodo.
$ kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-6fdf99c8b-6wwft 1/1 Running 0 3m41s 10.1.0.55 10.1.0.55 <none> <none>
Precauciones
Si un pod utiliza la red host, ocupa un puerto host. La IP del pod es la IP del host. Para utilizar la red host, debe confirmar que los pods no entran en conflicto entre sí en términos de los puertos host que ocupan. No utilice la red host a menos que sepa exactamente qué puerto host utiliza cada pod.
Cuando se utiliza la red host, se accede al nodo para acceder a un pod en él. Por lo tanto, es necesario permitir el acceso desde el puerto del grupo de seguridad del nodo. De lo contrario, el acceso falla.
Además, el uso de la red host requiere que reserve puertos host para los pods. Cuando utilice una Deployment para desplegar pods del tipo hostNetwork, asegúrese de que el número de pods no excede el número de nodos. De lo contrario, se programarán varios pods en el nodo y no se iniciarán debido a conflictos de puertos. Por ejemplo, en el ejemplo anterior de nginx YAML, si se despliegan dos pods (configurando replicas a 2) en un clúster con un solo nodo, no se puede crear un pod. Los logs de pod mostrarán que el Nginx no se puede iniciar porque el puerto está ocupado.
No programe varios pods que usen la red host en el mismo nodo. De lo contrario, cuando se crea un Service de ClusterIP para tener acceso a un pod, no se puede tener acceso a la dirección IP del clúster.
$ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/2 2 1 67m $ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-6fdf99c8b-6wwft 1/1 Running 0 67m nginx-6fdf99c8b-rglm7 0/1 CrashLoopBackOff 13 44m $ kubectl logs nginx-6fdf99c8b-rglm7 /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2022/05/11 07:18:11 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address in use) 2022/05/11 07:18:11 [emerg] 1#1: bind() to [::]:80 failed (98: Address in use) nginx: [emerg] bind() to [::]:80 failed (98: Address in use) 2022/05/11 07:18:11 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address in use) 2022/05/11 07:18:11 [emerg] 1#1: bind() to [::]:80 failed (98: Address in use) nginx: [emerg] bind() to [::]:80 failed (98: Address in use) 2022/05/11 07:18:11 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address in use) 2022/05/11 07:18:11 [emerg] 1#1: bind() to [::]:80 failed (98: Address in use) nginx: [emerg] bind() to [::]:80 failed (98: Address in use) 2022/05/11 07:18:11 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address in use) 2022/05/11 07:18:11 [emerg] 1#1: bind() to [::]:80 failed (98: Address in use) nginx: [emerg] bind() to [::]:80 failed (98: Address in use) 2022/05/11 07:18:11 [emerg] 1#1: bind() to 0.0.0.0:80 failed (98: Address in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address in use) 2022/05/11 07:18:11 [emerg] 1#1: bind() to [::]:80 failed (98: Address in use) nginx: [emerg] bind() to [::]:80 failed (98: Address in use) 2022/05/11 07:18:11 [emerg] 1#1: still could not bind() nginx: [emerg] still could not bind()