Esponi un gateway in entrata utilizzando un bilanciatore del carico esterno

Panoramica

Con Cloud Service Mesh puoi eseguire il deployment dei gateway in entrata e gestirli 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 in entrata.

Questa pagina mostra come configurare un bilanciatore del carico esterno con Cloud Service Mesh. In alternativa, puoi configurare il traffico in entrata con più configurazioni di backend.

Prima di iniziare

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

  • Un cluster Kubernetes in cui è installato Cloud Service Mesh.

  • Un bilanciatore del carico esterno che può accedere ai nodi su cui è in esecuzione il cluster. Configuri questo bilanciatore del carico esterno in modo da frontendere il gateway in entrata del cluster utilizzando l'indirizzo IP esterno del bilanciatore del carico.

Configura l'ambiente

Esegui i comandi seguenti 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 per il 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 gateway in entrata. Ciò garantisce il deployment del gateway in nodi specifici del cluster.

    kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
    
    • INGRESSGATEWAY_NODE_IP: corrisponde ai nodi nel cluster Kubernetes che ospitano il gateway in entrata. Esegui questo comando kubectl per tutti i tuoi nodi in entrata.

Crea il gateway in entrata

Prima di completare le istruzioni in questa sezione, devi determinare l'implementazione del piano di controllo. Per farlo, utilizza le istruzioni in Identificare l'implementazione del piano di controllo.

  1. Crea lo spazio dei nomi. Questo spazio dei nomi viene utilizzato per eseguire il deployment del gateway in entrata.

    kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
    
  1. Abilita lo spazio dei nomi per l'inserimento. I passaggi dipendono dall'implementazione del piano di controllo.

    Gestito (TD)

    1. Applica l'etichetta di inserimento predefinita allo spazio dei nomi:
    kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
        istio.io/rev- istio-injection=enabled --overwrite
    

    Gestito (Istiod)

    Consigliato: esegui questo comando per applicare l'etichetta di inserimento predefinita allo spazio dei nomi:

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

    Se sei un utente esistente con il piano di controllo Managed Istiod: ti consigliamo di utilizzare l'inserimento predefinito, ma l'inserimento basato sulle revisioni è supportato. Segui queste istruzioni:

    1. Esegui questo comando per individuare i canali di rilascio disponibili:

      kubectl -n istio-system get controlplanerevision
      

      L'output è simile al seguente:

      NAME                AGE
      asm-managed-rapid   6d7h
      

      NOTA: se nell'elenco precedente sono presenti due revisioni del piano di controllo, rimuovine una. La presenza di più canali del piano di controllo nel cluster non è supportata.

      Nell'output, il valore sotto la colonna NAME è l'etichetta di revisione che corrisponde 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
      

    Nel cluster

    1. Usa questo 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 comando seguente, REVISION_LABEL è il valore dell'etichetta di revisione istiod che hai annotato nel passaggio precedente.

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  2. Applica il file manifest del gateway in entrata.

    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
    

    Output 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
    
  3. Applica la patch al 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)"
    
  4. [Facoltativo] Applica la patch al deployment ingressgateway per l'affinità delle etichette dei nodi del gateway in entrata.

    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 la connessione al gateway in entrata dal cluster.

Recupera le informazioni sulla porta del gateway in entrata Service

  1. Acquista 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. Mostra il 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 l'NodePorts visualizzato nel passaggio precedente per configurare la connettività tra il bilanciatore del carico esterno e il gateway in entrata.

  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 nel cluster Kubernetes che ospita il gateway in entrata. Questo indirizzo IP deve essere raggiungibile dal bilanciatore del carico esterno. Potresti dover configurare questa configurazione più volte, una per nodo del cluster.

    • STATUS_PORT: è il NodePort attraverso il quale viene esposta l'API relativa allo stato di integrità del gateway in entrata. Puoi copiare queste informazioni dal passaggio precedente. Il valore è uguale per tutti i nodi nel cluster.

  2. Configura i pool di nodi nel bilanciatore del carico per il routing del traffico HTTP e HTTPS. Utilizza la seguente configurazione di 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 nel cluster Kubernetes che ospita il gateway in entrata. Questo indirizzo IP deve essere raggiungibile dal bilanciatore del carico esterno. Potresti dover configurare questa configurazione più volte, una per nodo del cluster.

    • HTTP_INGRESS_PORT: è il NodePort attraverso il quale viene esposto il traffico HTTP del gateway in entrata. Puoi copiare queste informazioni dal passaggio precedente. Il valore è uguale per tutti i nodi nel cluster.

    • HTTPS_INGRESS_PORT: è il NodePort attraverso il quale viene esposto il traffico HTTPS del gateway in entrata. Puoi copiare queste informazioni dal passaggio precedente. Il valore è uguale per tutti i nodi nel cluster.

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

Passaggi successivi