Exposer une passerelle d'entrée à l'aide d'un équilibreur de charge externe

Présentation

Avec Cloud Service Mesh, vous pouvez déployer et gérer des passerelles d'entrée votre maillage de services. Vous pouvez configurer davantage l'équilibrage de charge pour votre cluster avec Cloud Service Mesh à l'aide d'équilibreurs de charge externes (physiques ou des équilibreurs de charge logiciels en dehors du cluster) d'envoyer le trafic de passerelle VPN haute disponibilité.

Cette page vous explique comment configurer un équilibreur de charge externe avec Cloud Service Mesh. Vous pouvez également Configurez une entrée avec plusieurs configurations de backend.

Avant de commencer

Pour suivre la procédure décrite dans ce document, vous avez besoin des ressources suivantes :

  • Un cluster Kubernetes sur lequel Cloud Service Mesh est installé

  • Un équilibreur de charge externe qui peut accéder aux nœuds où se trouve votre cluster en cours d'exécution. Vous configurez cet équilibreur de charge externe de votre cluster via l'adresse IP externe de l'équilibreur de charge.

Configurer votre environnement

Exécutez les commandes suivantes à partir d'une station de travail pouvant accéder au cluster que vous que vous avez l'intention d'utiliser. Assurez-vous que l'outil kubectl est configuré pour utiliser la dans le contexte propre à votre cluster.

  1. Définissez les variables d'environnement.

    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. Définissez le champ IP address de l'équilibreur de charge externe.

    export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
    
  3. [\Facultatif/] Ajoutez un libellé aux nœuds de la passerelle d'entrée. Cela garantit que la passerelle sur des nœuds spécifiques du cluster.

    kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
    
    • INGRESSGATEWAY_NODE_IP: correspond au(x) nœud(s) de votre cluster Kubernetes qui héberge la passerelle d'entrée. Exécutez cette commande kubectl pour en tant que votre nombre de nœuds d'entrée.

Créer la passerelle d'entrée

Avant de suivre les instructions de cette section, vous devez déterminer l'implémentation de votre plan de contrôle. Suivez les instructions fournies dans l’article Pour ce faire, identifiez l'implémentation du plan de contrôle.

  1. Créez l'espace de noms Cet espace de noms sert à déployer le contrôleur d'entrée de passerelle VPN haute disponibilité.

    kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
    
  1. Activez l'espace de noms pour l'injection : Les étapes dépendent de la mise en œuvre du plan de contrôle.

    Géré (TD)

    1. Appliquez l'étiquette d'injection par défaut à l'espace de noms:
    kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
        istio.io/rev- istio-injection=enabled --overwrite
    

    Géré (Istiod)

    Recommandé:Exécutez la commande suivante pour appliquer l'étiquette d'injection par défaut à l'espace de noms:

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

    Si vous êtes un utilisateur existant disposant du plan de contrôle Istiod géré: Nous vous recommandons d'utiliser l'injection par défaut, mais celle basée sur les révisions compatibles. Pour ce faire, procédez comme suit:

    1. Exécutez la commande suivante pour localiser les versions disponibles:

      kubectl -n istio-system get controlplanerevision
      

      Le résultat ressemble à ce qui suit :

      NAME                AGE
      asm-managed-rapid   6d7h
      

      REMARQUE: Si deux révisions du plan de contrôle figurent dans la liste ci-dessus, supprimez-en une. Il n'est pas possible d'avoir plusieurs canaux de plan de contrôle dans le cluster.

      Dans le résultat, la valeur figurant dans la colonne NAME correspond au libellé de révision qui correspond à la version disponible disponible pour la version de Cloud Service Mesh.

    2. Appliquez le libellé de révision à l'espace de noms.

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

    Dans le cluster

    Recommandé:Exécutez la commande suivante pour appliquer l'étiquette d'injection par défaut à l'espace de noms:

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

    Nous vous recommandons d'utiliser l'injection par défaut, mais l'injection basée sur les révisions est compatible: Pour ce faire, procédez comme suit:

    1. Exécutez la commande suivante pour localiser le libellé de révision sur istiod :

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. Appliquez le libellé de révision à l'espace de noms. Dans la commande suivante, REVISION_LABEL correspond à la valeur du libellé de révision istiod que vous avez notée à l'étape précédente.

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  2. Appliquez le fichier manifeste de passerelle d'entrée.

    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
    

    Résultat attendu :

    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. Corrigez le service ingressgateway avec l'adresse IP de l'équilibreur de charge externe.

    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. [Facultatif] Appliquer un correctif au déploiement ingressgateway pour la passerelle d'entrée l'affinité basée sur les étiquettes des nœuds.

    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)"
    

Configurer l'équilibreur de charge externe

Dans cette section, vous allez configurer l'équilibreur de charge externe la passerelle d'entrée du cluster.

Récupérer les informations de port de la passerelle d'entrée Service

  1. Récupérez les 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. Affichez les NodePorts.

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

Configurer l'équilibreur de charge externe

Utilisez le NodePorts affiché à l'étape précédente pour configurer la connectivité. entre l'équilibreur de charge externe et la passerelle d'entrée.

  1. Configurez la vérification d'état dans la configuration de votre équilibreur de charge.

    hosts:    CLUSTER_NODE_IP
    Protocol: HTTP
    Port:     STATUS_PORT
    Path:     /healthz/ready
    
    • CLUSTER_NODE_IP: est l'adresse IP des nœuds de votre Cluster Kubernetes qui héberge la passerelle d'entrée. Cette adresse IP doit être accessibles depuis votre équilibreur de charge externe. Vous devrez peut-être configurer configuration plusieurs fois, une fois par nœud de cluster.

    • STATUS_PORT: est le NodePort par lequel l'entrée l'API d'état de fonctionnement de la passerelle est exposée. Vous pouvez copier ces informations depuis à l'étape précédente. La valeur est la même pour tous les nœuds du cluster.

  2. Configurez des pools de nœuds dans votre équilibreur de charge pour router HTTP et HTTPS du trafic. Utilisez la configuration IP:PORT suivante pour le trafic sur le port 80. (HTTP) et le port 443 (HTTPS).

    80  ->  CLUSTER_NODE_IP:HTTP_INGRESS_PORT
    443 ->  CLUSTER_NODE_IP:HTTPS_INGRESS_PORT
    
    • CLUSTER_NODE_IP: est l'adresse IP des nœuds de votre Cluster Kubernetes qui héberge la passerelle d'entrée. Cette adresse IP doit être accessibles depuis votre équilibreur de charge externe. Vous devrez peut-être configurer configuration plusieurs fois, une fois par nœud de cluster.

    • HTTP_INGRESS_PORT: correspond au NodePort via lequel le le trafic HTTP de la passerelle d'entrée est exposé. Vous pouvez copier ces informations de l'étape précédente. La valeur est identique pour tous les nœuds du cluster.

    • HTTPS_INGRESS_PORT: correspond au NodePort via lequel le le trafic HTTPS de la passerelle d'entrée est exposé. Vous pouvez copier ces informations de l'étape précédente. La valeur est identique pour tous les nœuds du cluster.

Pour vérifier votre configuration, assurez-vous que les vérifications d'état de votre équilibreur de charge sont réussissent.

Étape suivante