Si estas usando minikube tenes que entrar al cluster por ssh para poder ver las reglas de iptables.
Cuando inicias minikube minikube start --nodes 5 -p cluster_name luego de -p es el profile de tu cluster, pone el nombre que creas conveniente. Ejemplo minikube start --nodes 5 -p test
Luego entras por ssh
minikube ssh -p cluster_name en mi caso minikube ssh -p test
Adentro revisas las reglas de iptables con los comandos que paso el profesor:
sudo iptables -t nat -L OUTPUT
output
ChainOUTPUT(policy ACCEPT)target prot opt source destination
KUBE-SERVICES all -- anywhere anywhere /* kubernetes service portals */DOCKER_OUTPUT all -- anywhere host.minikube.internalDOCKER all -- anywhere !localhost/8ADDRTYPE match dst-type LOCAL
sudo iptables -t nat -nL KUBE-SERVICES
output
ChainKUBE-SERVICES(2 references)target prot opt source destination
KUBE-MARK-MASQ tcp --!10.244.0.0/1610.96.0.1/* default/kubernetes:https cluster IP */ tcp dpt:443KUBE-SVC-NPX46M4PTMTKRN6Y tcp --0.0.0.0/010.96.0.1/* default/kubernetes:https cluster IP */ tcp dpt:443KUBE-MARK-MASQ udp --!10.244.0.0/1610.96.0.10/* kube-system/kube-dns:dns cluster IP */ udp dpt:53KUBE-SVC-TCOU7JCQXEZGVUNU udp --0.0.0.0/010.96.0.10/* kube-system/kube-dns:dns cluster IP */ udp dpt:53KUBE-MARK-MASQ tcp --!10.244.0.0/1610.96.0.10/* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:53KUBE-SVC-ERIFXISQEP7F7OF4 tcp --0.0.0.0/010.96.0.10/* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:53KUBE-MARK-MASQ tcp --!10.244.0.0/1610.96.0.10/* kube-system/kube-dns:metrics cluster IP */ tcp dpt:9153KUBE-SVC-JD5MR3NA4I4DYORP tcp --0.0.0.0/010.96.0.10/* kube-system/kube-dns:metrics cluster IP */ tcp dpt:9153KUBE-MARK-MASQ tcp --!10.244.0.0/1610.107.149.250/* default/httpenv cluster IP */ tcp dpt:8888KUBE-SVC-6ZVPY37LGINYSSPR tcp --0.0.0.0/010.107.149.250/* default/httpenv cluster IP */ tcp dpt:8888KUBE-NODEPORTS all --0.0.0.0/00.0.0.0/0/* kubernetes service nodeports; NOTE: this must be the last rule in this chain */ADDRTYPE match dst-type LOCAL
En mi caso voy a ver las reglas de la ip del servicio 10.107.149.250
ChainKUBE-SVC-6ZVPY37LGINYSSPR(1 references)target prot opt source destination
KUBE-SEP-UTACH3V2EFGNGWSL all --0.0.0.0/00.0.0.0/0/* default/httpenv */ statistic mode random probability 0.10000000009KUBE-SEP-OBKCIYINKH75NNAU all --0.0.0.0/00.0.0.0/0/* default/httpenv */ statistic mode random probability 0.11111111101KUBE-SEP-2BAZO7KUFC5W4VUP all --0.0.0.0/00.0.0.0/0/* default/httpenv */ statistic mode random probability 0.12500000000KUBE-SEP-H2O72PL5EVFXTZBK all --0.0.0.0/00.0.0.0/0/* default/httpenv */ statistic mode random probability 0.14285714272KUBE-SEP-BZIDQWP33MHSLDLW all --0.0.0.0/00.0.0.0/0/* default/httpenv */ statistic mode random probability 0.16666666651KUBE-SEP-U4OA2VHREJS6ZEJF all --0.0.0.0/00.0.0.0/0/* default/httpenv */ statistic mode random probability 0.20000000019KUBE-SEP-ZN5OKFENC7VMGVKJ all --0.0.0.0/00.0.0.0/0/* default/httpenv */ statistic mode random probability 0.25000000000KUBE-SEP-KUCY6OLHFSCAHRUH all --0.0.0.0/00.0.0.0/0/* default/httpenv */ statistic mode random probability 0.33333333349KUBE-SEP-2L47EJAEPVOMIKY7 all --0.0.0.0/00.0.0.0/0/* default/httpenv */ statistic mode random probability 0.50000000000KUBE-SEP-AOU4T5P455EZE2YM all --0.0.0.0/00.0.0.0/0/* default/httpenv */
Con ++kubectl get service++ anotamos el cluster ip del servicio.
Vamos a ver las reglas de ip-table (Iptables tiene diferentes tablas: nat, filtros, ro, etc.) del equipo local para ver como hace k8s para anotar este trafico: ++sudo iptables –t nat –L OUTPUT++. Con esto vamos a listar las reglas (el chain) de output.
Vamos a ver que tenemos dos targets: DOCKER (esto lo genera docker internamente) y KUBE-SERVICES (hace las reglas de enrutado outbound salientes de k8s)
Para ver las reglas del chain KUBE-SERVICES: ++sudo iptables –t nat –nL KUBE-SERVICES++ (Vamos a ver muchas reglas y el que administra todas esas reglas es KUBE-PROXY cada vez que creamos un pod o un servicio en nuestro nodo.) Lo importante es que busques la ip que se asigno al servicio cuando se creo y anotar el target del servicio (es el código que esta mas a la izquierda)
++sudo iptables –t nat –nL EL_TARGET_QUE_ANOTAMOS++ nos muestra varios chain enrutados y cada una de las derivaciones de estos son una probabilidad estadística. Cuando se quiere enrutar el trafico, iptables lo hace de manera probabilística.
Para ver hacia donde se dirige este trafico vamos a agarrar uno de los target de los chains: ++sudo iptables –t nat –nL EL_TARGET_QUE_ANOTAMOS++. Esto hace un mascarade y me dice que todo el trafico que yo quiero mandar a esa ip virtual que habíamos copiado tiene que ir al nodo que aparece mas a la derecha y esa es la ip privada de nuestro nodo de k8s que esta registrado.
ENDPOINTS son las direcciones ip de un servicio a las que necesitaríamos acceder en caso de que quisiéramos llegar a ese servicio. Podemos encontrarlos con ++kubectl describe service NOMBRE_DEL_SERVICIO++
Ahí va a aparecer la opción ENDPOINTS donde vamos ver cada una de las direcciones ip de nuestros pods. Para ver mas datos: ++kubectl describe endpoints NOMBRE_DEL_SERVICIO++
Tambien se puede ver con: ++kubectl get endpoints NOMBRE_DEL_SERVICIO –o yaml++
Al comienzo sentí este curso super persado. Pero poco a poco se ha ido dando muy muy bien
¿Te quedaste con dudas sobre qué es IPTABLES?
Acá algo de info: 👇
Iptables es un firewall que se ocupa de controlar el tráfico de datos en nuestra red. Esta utilidad está habilitada como comando en el kernel de linux.
Hay tres reglas muy importantes para el filtrado de datos que tienes que tener en cuenta:
Input: paquetes de datos que entran a nuestra red
Output: paquetes de datos que salen de nuestra red
Forward: paquetes de datos que se redireccionan desde nuestra red
Dentro de cada una puedes habilitar o bloquear tráfico en protocolos de transporte como UDP/TCP (de acuerdo con el modelo OSI).
.
Les dejo algo de información para que chequen por ustedes mismxs.👇
Una especie de whitepaper
Documentación en Arch Linux)
Un breve tutorial en Youtube
Endpoints: Es un recurso de kubernetes que representa las direcciones ip de un servicio a las cuales necesitariamos acceder en el caso de que quisieramos llegar a ese servicio. Además, endpoints es el único recurso en k8s que esta en plural.
Un poco complicado por todos los comandos
excelente explicación :)
Para eliminar el servicio creado el comando seria en este caso:
kubectl delete svc httpenv
o con remplazando "svc" por service, son alias y es lo mismo.
El NodePort también habilita el puerto en el Master?
Los master en kubernetes sólo se ocupan de la administración dentro del clúster, por lo que NodePort solo habilita comunicación con los puertos de los workers, ya que estos son los únicos expuestos al exterior.
Con el enrutado de tráfico se cierra la comprensión sobre el tema de exposición de servicios.
Gracias...!!!