外部ロードバランサを使用して Ingress ゲートウェイを公開する

概要

Cloud Service Mesh を使用すると、サービス メッシュの一部として Ingress ゲートウェイをデプロイして管理できます。Cloud Service Mesh を使用してクラスタのロード バランシングをさらに構成するには、外部ロードバランサ(クラスタ外の物理ロードバランサまたはソフトウェア ロードバランサ)を使って Ingress ゲートウェイにトラフィックを送信します。

このページでは、Cloud Service Mesh を使用して外部ロードバランサを構成する方法について説明します。また、複数のバックエンド構成を使用して Ingress を設定することもできます。

始める前に

このドキュメントで説明する手順を完了するには、次のリソースが必要です。

  • Cloud Service Mesh がインストールされている Kubernetes クラスタ。

  • クラスタが実行されているノードにアクセスできる外部ロードバランサ。この外部ロードバランサは、ロードバランサの外部 IP アドレスを使用してクラスタの Ingress ゲートウェイの前に配置されるように構成します。

環境を設定する

使用するクラスタにアクセスできるワークステーションから次のコマンドを実行します。クラスタに固有のクラスタ コンテキストを使用するように、kubectl ツールが構成されていることを確認します。

  1. 環境変数を設定します。

    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. 外部ロードバランサの IP address を設定します。

    export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
    
  3. (省略可)Ingress ゲートウェイ ノードにラベルを付けます。これにより、ゲートウェイがクラスタ内の特定のノードにデプロイされることを保証します。

    kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
    
    • INGRESSGATEWAY_NODE_IP: Ingress ゲートウェイをホストする Kubernetes クラスタ内のノードです。この kubectl コマンドは、使用している Ingress ノードの数だけ実行します。

Ingress ゲートウェイを作成する

このセクションの手順を完了する前に、コントロール プレーンの実装を決定する必要があります。これを行うには、コントロール プレーンの実装を特定するの手順を適用します。

  1. 名前空間を作成します。この名前空間は、Ingress ゲートウェイのデプロイに使用されます。

    kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
    
  1. インジェクションの名前空間を有効にします。手順は、コントロール プレーンの実装によって異なります。

    マネージド(TD)

    1. デフォルトのインジェクション ラベルを名前空間に適用します。
    kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
        istio.io/rev- istio-injection=enabled --overwrite
    

    マネージド(Istiod)

    推奨: 次のコマンドを実行して、デフォルトのインジェクション ラベルを名前空間に適用します。

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

    マネージド Istiod コントロール プレーンを使用している既存のユーザーの場合: デフォルトのインジェクションを使用することをおすすめしますが、リビジョンベースのインジェクションもサポートされています。次の手順を行います。

    1. 利用可能なリリース チャンネルを探すには、次のコマンドを実行します。

      kubectl -n istio-system get controlplanerevision
      

      出力は次のようになります。

      NAME                AGE
      asm-managed-rapid   6d7h
      

      注: 上記のリストに 2 つのコントロール プレーンのリビジョンが表示されている場合は、1 つを削除します。クラスタに複数のコントロール プレーン チャネルを配置することはできません。

      出力で、NAME 列の値は、Cloud Service Mesh バージョンで使用可能なリリース チャンネルに対応するリビジョン ラベルです。

    2. リビジョン ラベルを名前空間に適用します。

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

    クラスタ内

    推奨: 次のコマンドを実行して、デフォルトのインジェクション ラベルを名前空間に適用します。

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

    デフォルトのインジェクションを使用することをおすすめしますが、リビジョンベースのインジェクションがサポートされています。 次の手順を使用します。

    1. 次のコマンドを使用して、istiod のリビジョン ラベルを探します。

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. リビジョン ラベルを名前空間に適用します。次のコマンドで、REVISION_LABEL は前の手順でメモした istiod リビジョン ラベルの値です。

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  2. Ingress ゲートウェイ マニフェスト ファイルを適用します。

    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
    

    予想される出力:

    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. 外部ロードバランサの IP アドレスを使用して ingressgateway サービスにパッチを適用します。

    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. (省略可)Ingress ゲートウェイ ノードラベル アフィニティのパッチを ingressgateway Deployment に適用します。

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

外部ロードバランサを設定する

このセクションでは、外部ロードバランサを構成して、クラスタから Ingress ゲートウェイに接続します。

Ingress ゲートウェイの Service ポート情報を取得する

  1. 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. NodePorts を表示します。

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

外部ロードバランサを構成する

前の手順で表示した NodePorts を使用して、外部ロードバランサと Ingress ゲートウェイの間の接続を構成します。

  1. ロードバランサの構成でヘルスチェックを構成します。

    hosts:    CLUSTER_NODE_IP
    Protocol: HTTP
    Port:     STATUS_PORT
    Path:     /healthz/ready
    
    • CLUSTER_NODE_IP: Ingress ゲートウェイをホストする Kubernetes クラスタ内のノードの IP アドレスです。この IP アドレスは外部ロードバランサから到達可能である必要があります。クラスタノードごとに 1 回、この構成を複数回設定する必要があります。

    • STATUS_PORT: Ingress ゲートウェイのヘルス ステータス API が公開される NodePort です。この情報は前の手順からコピーできます。この値は、クラスタ内のすべてのノードで同じです。

  2. HTTP および HTTPS トラフィックをルーティングするロードバランサ内にノードプールを構成します。ポート 80(HTTP)とポート 443(HTTPS)上のトラフィックには、次の IP:PORT 構成を使用します。

    80  ->  CLUSTER_NODE_IP:HTTP_INGRESS_PORT
    443 ->  CLUSTER_NODE_IP:HTTPS_INGRESS_PORT
    
    • CLUSTER_NODE_IP: Ingress ゲートウェイをホストする Kubernetes クラスタ内のノードの IP アドレスです。この IP アドレスは外部ロードバランサから到達可能である必要があります。クラスタノードごとに 1 回、この構成を複数回設定する必要があります。

    • HTTP_INGRESS_PORT: Ingress ゲートウェイの HTTP トラフィックが公開される NodePort です。この情報は前の手順からコピーできます。この値は、クラスタ内のすべてのノードで同じです。

    • HTTPS_INGRESS_PORT: Ingress ゲートウェイの HTTPS トラフィックが公開される NodePort です。この情報は前の手順からコピーできます。この値は、クラスタ内のすべてのノードで同じです。

設定を確認するには、ロードバランサのヘルスチェックに合格していることを確認します。

次のステップ