Esporre un gateway di ingresso utilizzando un bilanciatore del carico esterno

Panoramica

Con Cloud Service Mesh puoi eseguire il deployment e gestire i gateway di ingresso come parte del tuo mesh di servizi. Puoi configurare ulteriormente il bilanciamento del carico per il tuo cluster con Cloud Service Mesh utilizzando bilanciatori del carico esterni (bilanciatori del carico fisici o software esterni al cluster) per inviare il traffico al gateway di ingresso.

Questa pagina mostra come configurare un bilanciatore del carico esterno con Cloud Service Mesh. In alternativa, puoi configurare l'ingresso con più configurazioni di backend.

Prima di iniziare

Per completare i passaggi descritti in questo documento, sono necessarie le seguenti risorse:

  • Un cluster Kubernetes con Cloud Service Mesh installato.

  • Un bilanciatore del carico esterno che può accedere ai nodi su cui è eseguito il cluster. Configura questo bilanciatore del carico esterno per posizionarsi davanti al gateway di ingresso del tuo cluster tramite External IP Address.

Configura l'ambiente

Esegui i seguenti comandi da una workstation che può accedere al cluster che intendi utilizzare. Assicurati che lo strumento kubectl sia configurato per utilizzare il contesto del cluster specifico del tuo cluster.

  1. Imposta le variabili di ambiente.

    export ASM_INGRESSGATEWAY_NAMESPACE=asm-ingressgateway
    export ASM_INGRESSGATEWAY_DEPLOYMENT_NAME=asm-ingressgateway
    export ASM_INGRESSGATEWAY_SERVICE_NAME=asm-ingressgateway
    export ASM_INGRESSGATEWAY_NODE_LABEL=asm-ingressgateway
    
  2. Imposta IP address del bilanciatore del carico esterno.

    export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
    
  3. [Facoltativo] Etichetta i nodi del gateway di ingresso. In questo modo, il gateway viene disegnato su nodi specifici del cluster.

    kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
    
    • INGRESSGATEWAY_NODE_IP: sono i nodi del tuo cluster Kubernetes che ospitano il gateway di ingresso. Esegui questo comando kubectl per tutti i nodi di ingresso di cui disponi.

Crea il gateway di ingresso

  1. Crea lo spazio dei nomi. Questo spazio dei nomi verrà utilizzato per eseguire il deployment del gateway di ingresso.

    kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
    
  2. Attiva lo spazio dei nomi per l'iniezione. I passaggi dipendono dal tipo di Cloud Service Mesh (gestito o in cluster).

    Gestito

    1. Utilizza il seguente comando per individuare i canali di rilascio disponibili:

      kubectl -n istio-system get controlplanerevision
      

      L'output è simile al seguente:

      NAME                AGE
      asm-managed         6d7h
      asm-managed-rapid   6d7h
      

      Nell'output, il valore nella colonna NAME è l'etichetta di revisione corrispondente al canale di rilascio disponibile per la versione di Cloud Service Mesh.

    2. Applica l'etichetta di revisione allo spazio dei nomi:

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
        istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    All'interno del cluster

    1. Utilizza il seguente comando per individuare l'etichetta di revisione su istiod:

      kubectl get deploy -n istio-system -l app=istiod -o \
        jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. Applica l'etichetta di revisione allo spazio dei nomi. Nel seguente comando, REVISION è il valore dell'etichetta della revisione istiod che hai annotato nel passaggio precedente.

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
        istio-injection- istio.io/rev=REVISION --overwrite
      
  3. Applica il file manifest del gateway di ingresso.

    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} apply --filename https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/ingress-gateway-external-lb/ingress-gateway.yaml
    

    Risultato previsto:

    serviceaccount/asm-ingressgateway created
    role.rbac.authorization.k8s.io/asm-ingressgateway created
    rolebinding.rbac.authorization.k8s.io/asm-ingressgateway created
    deployment.apps/asm-ingressgateway created
    service/asm-ingressgateway created
    poddisruptionbudget.policy/asm-ingressgateway created
    horizontalpodautoscaler.autoscaling/asm-ingressgateway created
    
  4. Esegui la patch del servizio ingressgateway con l'indirizzo IP del bilanciatore del carico esterno.

    cat <<EOF > asm-external-ip-patch.yaml
    spec:
      externalIPs:
        - ${EXTERNAL_LB_IP_ADDRESS}
      loadBalancerIP: ${EXTERNAL_LB_IP_ADDRESS}
    EOF
    
    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --patch "$(cat asm-external-ip-patch.yaml)"
    
  5. [Facoltativo] Esegui la patch del deployment di ingressgateway per l'affinità delle etichette dei nodi del gateway di ingresso.

    cat <<EOF > asm-ingress-node-label-patch.yaml
    spec:
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ${ASM_INGRESSGATEWAY_NODE_LABEL}
                    operator: Exists
    EOF
    
    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch deployment/${ASM_INGRESSGATEWAY_DEPLOYMENT_NAME} --patch "$(cat asm-ingress-node-label-patch.yaml)"
    

Configura il bilanciatore del carico esterno

In questa sezione, configurerai il bilanciatore del carico esterno per connettersi al gateway di ingresso dal cluster.

Recupera le informazioni sulla porta Service del gateway di ingresso

  1. Ricevi NodePorts.

    export HTTP_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
    export HTTPS_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
    export STATUS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
    
  2. Visualizza NodePorts.

    echo HTTP_INGRESS_PORT=${HTTP_INGRESS_PORT}
    echo HTTPS_INGRESS_PORT=${HTTPS_INGRESS_PORT}
    echo STATUS_PORT=${STATUS_PORT}
    

Configura il bilanciatore del carico esterno

Utilizza il NodePorts visualizzato nel passaggio precedente per configurare la connettività tra il bilanciatore del carico esterno e il gateway di ingresso.

  1. Configura il controllo di integrità nella configurazione del bilanciatore del carico.

    hosts:    CLUSTER_NODE_IP
    Protocol: HTTP
    Port:     STATUS_PORT
    Path:     /healthz/ready
    
    • CLUSTER_NODE_IP: è l'indirizzo IP dei nodi del cluster Kubernetes che ospita il gateway di ingresso. Questo indirizzo IP deve essere accessibile dal bilanciatore del carico esterno. Potresti dover configurare questa configurazione più volte, una volta per nodo del cluster.

    • STATUS_PORT: è il NodePort tramite il quale viene esposta l'API dello stato di salute del gateway di ingresso. Puoi copiare queste informazioni dal passaggio precedente. Sarà lo stesso per ogni nodo del cluster.

  2. Configura i pool di nodi nel bilanciatore del carico per instradare il traffico HTTP e HTTPS. Utilizza la seguente configurazione IP:PORT per il traffico sulla porta 80 (HTTP) e sulla porta 443 (HTTPS).

    80  ->  CLUSTER_NODE_IP:HTTP_INGRESS_PORT
    443 ->  CLUSTER_NODE_IP:HTTPS_INGRESS_PORT
    
    • CLUSTER_NODE_IP: è l'indirizzo IP dei nodi del cluster Kubernetes che ospita il gateway di ingresso. Questo indirizzo IP deve essere accessibile dal bilanciatore del carico esterno. Potresti dover configurare questa configurazione più volte, una volta per nodo del cluster.

    • HTTP_INGRESS_PORT: è il NodePort tramite il quale viene esposto il traffico HTTP del gateway di ingresso. Puoi copiare queste informazioni dal passaggio precedente. Sarà lo stesso per ogni nodo del cluster.

    • HTTPS_INGRESS_PORT: è il NodePort tramite il quale viene esposto il traffico HTTPS della porta di accesso. Puoi copiare queste informazioni dal passaggio precedente. Sarà lo stesso per ogni nodo del cluster.

Per verificare la configurazione, assicurati che i controlli di integrità sul bilanciatore del carico superino.

Passaggi successivi