Una risorsa di ingresso Kubernetes fornisce il routing HTTP o HTTPS dall'esterno del cluster a uno o più servizi all'interno del cluster. I cluster TKG supportano l'ingresso tramite controller di terze parti, ad esempio Nginx.

In questo tutorial viene illustrato come distribuire un servizio di ingresso Kubernetes basato su NGINX per il routing del traffico esterno ai servizi nel cluster di Tanzu Kubernetes. Un servizio in ingresso richiede un controller in ingresso. NGINX Ingress Controller viene installato utilizzando Helm. Helm è un gestore di pacchetti per Kubernetes.

Nota: Esistono diversi modi per eseguire questa attività. I passaggi descritti di seguito offrono un approccio. In base all'ambiente specifico, l'utente potrebbe ritenere altri approcci più adatti.

Prerequisiti

  • Esaminare la risorsa Ingresso nella documentazione di Kubernetes.
  • Consultare la documentazione di Nginx Ingress Controller.
  • Effettuare il provisioning di un cluster TKG.
  • Abilitare il criterio di sicurezza del pod, se necessario.
  • Connettersi al cluster TKG.

Procedura

  1. Installare Helm facendo riferimento alla documentazione.
  2. Installare NGINX Ingress Controller utilizzando Helm.
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm install ingress-nginx ingress-nginx/ingress-nginx
  3. Verificare che Nginx Ingresso Controller sia distribuito come servizio di tipo 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. Eseguire un ping al bilanciamento del carico utilizzando l'indirizzo IP esterno.
    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. Verificare che Nginx Ingress Controller sia in esecuzione.
    kubectl get pods
    NAME                                        READY   STATUS    RESTARTS   AGE
    ingress-nginx-controller-7c6c46898c-v6blt   1/1     Running   0          76m
  6. Creare una risorsa di ingresso con una regola di ingresso e un percorso denominati 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
    
    Avvertimento: networking.k8s.io/v1beta1 dell'API Kubernetes è obsoleto a partire da Kubernetes v1.22 e versioni successive. La nuova API da utilizzare è networking.k8s.io/v1 e comporta diverse modifiche del manifesto documentate qui https://kubernetes.io/docs/reference/using-api/deprecation-guide/.
  7. Distribuire la risorsa ingress-hello.
    kubectl apply -f ingress-hello.yaml
    ingress.networking.k8s.io/ingress-hello created
  8. Verificare che la risorsa in ingresso sia distribuita.
    Si noti che l'indirizzo IP viene mappato all'IP esterno del controller in ingresso.
    kubectl get ingress
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-hello   <none>   *       10.19.14.76     80      51m
  9. Creare un'app e un servizio di test Hello denominato 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. Distribuire la risorsa ingress-hello-test.
    kubectl apply -f ingress-hello-test.yaml
    service/hello created
    deployment.apps/hello created
  11. Verificare che la distribuzione di hello sia disponibile.
    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. Recuperare l'indirizzo IP pubblico del bilanciamento del carico utilizzato da Nginx Ingress Controller.
    kubectl get ingress
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-hello   <none>   *       10.19.14.76     80      13m
  13. Utilizzando un browser, passare all'IP pubblico e includere il percorso di ingresso.
    http://10.19.14.76/hello
    Viene restituito il messaggio "hello".
    {"message":"Hello"}

risultati

Il browser accede esternamente all'app di back-end, avente come fron-end il servizio in esecuzione all'interno del cluster, tramite il controller di ingresso utilizzando l'indirizzo IP esterno del bilanciamento del carico.