Soy muy nuevo en kubernetes. Pasé la última semana aprendiendo sobre nodos, pods, clústeres, servicios e implementaciones.
Con eso, estoy tratando de comprender un poco más cómo funciona la red para kubernetes. Solo quiero exponer una página web simple de nginx docker y presionarla desde mi navegador.
Nuestra VPC está configurada con una conexión directa, por lo que puedo acceder a instancias EC2 en sus direcciones IP privadas. También configuré el clúster de EKS usando la interfaz de usuario en aws por ahora como private . Con fines de prueba, agregué mi rango cidr para que se permita en todos los TCP como un grupo de seguridad adicional en la interfaz de usuario del clúster de EKS.
Aquí están mis definiciones básicas de servicio e implementación:
apiVersion: v1 kind: Service metadata: name: testing-nodeport namespace: default labels: infrastructure: fargate app: testing-app spec: type: NodePort selector: app: testing-app ports: - port: 80 targetPort: testing-port protocol: TCP --- apiVersion: apps/v1 kind: Deployment metadata: name: testing-deployment namespace: default labels: infrastructure: fargate app: testing-app spec: replicas: 1 selector: matchLabels: infrastructure: fargate app: testing-app template: metadata: labels: infrastructure: fargate app: testing-app spec: containers: - name: nginx image: nginx:1.14.2 ports: - name: testing-port containerPort: 80Puedo ver que todo funciona correctamente cuando ejecuto:
kubectl get all -n default
Sin embargo, cuando trato de acceder a la dirección IP de NodePort en el puerto 80 , no puedo cargarla desde el navegador.
Puedo acceder al pod si primero configuro un kubectl proxy en la siguiente URL (ya que el proxy se inicia en el puerto 8001 ):
http://localhost:8001/api/v1/namespaces/default/services/testing-nodeport:80/proxy/Estoy bastante perdido en este punto. No sé qué estoy haciendo mal y por qué no puedo acceder a la ventana acoplable nginx básica fuera del comando de proxy kubectl.
¿Qué pasa si usas la opción proxy ? Algo como esto:
kubectl port-forward -n default service/testing-nodeport 3000:80 Forwarding from 127.0.0.1:3000 -> 80 Forwarding from [::1]:3000 -> 80 Después de esto, puede acceder a su servicio K8S desde localhost:3000 . Más información aquí
Imagine que el clúster de kubernetes es como su VPC de AWS. Tiene su propia red interna con IP privadas y conecta todos los POD. Kubernetes solo expone las cosas que solicita explícitamente que se expongan.
El puerto de servicio 80 está disponible dentro del clúster. Entonces, un pod puede hablar con este servicio usando el service name:service port . Pero si necesita acceder desde el exterior, necesita ingress controller / LoadBalancer . También puede utilizar NodePort con fines de prueba. El puerto del nodo será algo mayor que 30000 (dentro de este 30000-32767).
Debería poder acceder a nginx usando node IP:nodeport . Aquí asumí que tiene un grupo de seguridad que abre el puerto del nodo.
Usa este yaml. Actualicé el puerto del nodo para que sea 31000. Puede acceder a nginx en nodeport:31000 . Como mencioné, no puede usar 80 como está dentro del clúster. Si necesita usar 80, entonces necesita un controlador de ingreso.
apiVersion: v1 kind: Service metadata: name: testing-nodeport namespace: default labels: infrastructure: fargate app: testing-app spec: type: NodePort selector: app: testing-app ports: - port: 80 targetPort: testing-port protocol: TCP nodePort: 31000 --- apiVersion: apps/v1 kind: Deployment metadata: name: testing-deployment namespace: default labels: infrastructure: fargate app: testing-app spec: replicas: 1 selector: matchLabels: infrastructure: fargate app: testing-app template: metadata: labels: infrastructure: fargate app: testing-app spec: containers: - name: nginx image: nginx:1.14.2 ports: - name: testing-port containerPort: 80Bien, después de más de 16 horas depurando esto, finalmente descubrí lo que estaba pasando. En fargate no puede configurar los grupos de seguridad por nodo como puede hacerlo con los grupos de nodos administrados. Estaba configurando las reglas del grupo de seguridad en la configuración de "Grupos de seguridad adicionales". Sin embargo, fargate aparentemente ignora por completo esas configuraciones y SOLAMENTE usa el grupo de seguridad de su configuración de "Grupo de seguridad de clúster". Entonces, en la interfaz de usuario de EKS, configuré las reglas correctas en el "Grupo de seguridad del clúster" y ahora puedo acceder a mi módulo directamente en una instancia de Fargate.
Gran ventaja de esto. Use solo "Grupo de seguridad de clúster" para los nodos de Fargate.