Un recurso de entrada de Kubernetes proporciona enrutamiento HTTP o HTTPS desde fuera del clúster a uno o varios servicios dentro del clúster. Los clústeres de TKG admiten la entrada a través de controladoras de terceros, como Nginx.

En este tutorial, se demuestra cómo implementar un servicio de entrada de Kubernetes basado en Nginx para enrutar el tráfico externo a los servicios en un clúster de Tanzu Kubernetes. Un servicio de entrada requiere una controladora de entrada. Instalamos la controladora de entrada de Nginx con Helm. Helm es un administrador de paquetes para Kubernetes.

Nota: Existen varias formas de llevar a cabo esta tarea. Los pasos que se indican a continuación corresponden a un enfoque. Otros enfoques pueden ser más adecuados para su entorno en particular.

Requisitos previos

  • Revise el recurso de Entrada en la documentación de Kubernetes.
  • Revise la documentación de la controladora de entrada de Nginx.
  • Aprovisione un clúster de TKG.
  • Habilite la directiva de seguridad de pods, si es necesario.
  • Conéctese al clúster de TKG.

Procedimiento

  1. Para instalar Helm, consulte la documentación.
  2. Instale la controladora de entrada de Nginx con Helm.
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm install ingress-nginx ingress-nginx/ingress-nginx
  3. Compruebe que la controladora de entrada de Nginx esté implementada como un servicio de tipo equilibrador de carga (LoadBalancer).
    kubectl get services
    NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
    ingress-nginx-controller             LoadBalancer   10.16.18.20    10.19.14.76   80:30635/TCP,443:30873/TCP   59m
    ingress-nginx-controller-admission   ClusterIP      10.87.41.25    <none>        443/TCP                      59m
    
  4. Ejecute ping en el equilibrador de carga utilizando la dirección IP externa.
    ping 10.19.14.76
    Pinging 10.19.14.76 with 32 bytes of data:
    Reply from 10.19.14.76: bytes=32 time<1ms TTL=62
    Reply from 10.19.14.76: bytes=32 time=1ms TTL=62
    
  5. Compruebe que la controladora de entrada de Nginx esté en ejecución.
    kubectl get pods
    NAME                                        READY   STATUS    RESTARTS   AGE
    ingress-nginx-controller-7c6c46898c-v6blt   1/1     Running   0          76m
  6. Cree un recurso de entrada con una regla de entrada y una ruta de acceso denominada ingress-hello.yaml.
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-hello
    spec:
      rules:
      - http:
          paths:
          - path: /hello
            backend:
              serviceName: hello
              servicePort: 80
    
    Atención: La API de Kubernetes networking.k8s.io/v1beta1 está obsoleta desde Kubernetes v1.22 en adelante. La nueva API que se utilizará es networking.k8s.io/v1 e implica varios cambios en el manifiesto que se documentan aquí https://kubernetes.io/docs/reference/using-api/deprecation-guide/.
  7. Implemente el recurso ingress-hello.
    kubectl apply -f ingress-hello.yaml
    ingress.networking.k8s.io/ingress-hello created
  8. Compruebe que el recurso de entrada se haya implementado.
    Tenga en cuenta que la dirección IP se asigna a la IP externa de la controladora de entrada.
    kubectl get ingress
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-hello   <none>   *       10.19.14.76     80      51m
  9. Cree una aplicación y un servicio de prueba Hello denominados ingress-hello-test.yaml.
    kind: Service
    apiVersion: v1
    metadata:
      name: hello
    spec:
      selector:
        app: hello
        tier: backend
      ports:
      - protocol: TCP
        port: 80
        targetPort: http
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: hello
          tier: backend
          track: stable
      template:
        metadata:
          labels:
            app: hello
            tier: backend
            track: stable
        spec:
          containers:
            - name: hello
              image: "gcr.io/google-samples/hello-go-gke:1.0"
              ports:
                - name: http
                  containerPort: 80
    
  10. Implemente el recurso ingress-hello-test.
    kubectl apply -f ingress-hello-test.yaml
    service/hello created
    deployment.apps/hello created
  11. Compruebe que la implementación de hello esté disponible.
    kubectl get deployments
    NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
    hello                      3/3     3            3           4m59s
    ingress-nginx-controller   1/1     1            1           3h39m
    
  12. Obtenga la dirección IP pública del equilibrador de carga que utiliza la controladora de entrada de Nginx.
    kubectl get ingress
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-hello   <none>   *       10.19.14.76     80      13m
  13. Con un navegador, desplácese hasta la dirección IP pública y escriba la ruta de entrada.
    http://10.19.14.76/hello
    Se devolverá el mensaje "Hello".
    {"message":"Hello"}

Resultados

El navegador permite acceder externamente a la aplicación de back-end que ofrece el servicio en ejecución dentro del clúster a través de la controladora de entrada con la dirección IP externa del equilibrador de carga.