外部ロードバランサを使用して Ingress ゲートウェイを公開する
概要
Cloud Service Mesh を使用すると、サービス メッシュの一部として Ingress ゲートウェイをデプロイして管理できます。Cloud Service Mesh を使用してクラスタのロード バランシングをさらに構成するには、外部ロードバランサ(クラスタ外の物理ロードバランサまたはソフトウェア ロードバランサ)を使って Ingress ゲートウェイにトラフィックを送信します。
このページでは、Cloud Service Mesh を使用して外部ロードバランサを構成する方法について説明します。また、複数のバックエンド構成を使用して Ingress を設定することもできます。
始める前に
このドキュメントで説明する手順を完了するには、次のリソースが必要です。
Cloud Service Mesh がインストールされている Kubernetes クラスタ。
クラスタが実行されているノードにアクセスできる外部ロードバランサ。この外部ロードバランサは、ロードバランサの外部 IP アドレスを使用してクラスタの Ingress ゲートウェイの前に配置されるように構成します。
環境を設定する
使用するクラスタにアクセスできるワークステーションから次のコマンドを実行します。クラスタに固有のクラスタ コンテキストを使用するように、kubectl
ツールが構成されていることを確認します。
環境変数を設定します。
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
外部ロードバランサの
IP address
を設定します。export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
(省略可)Ingress ゲートウェイ ノードにラベルを付けます。これにより、ゲートウェイがクラスタ内の特定のノードにデプロイされることを保証します。
kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
- INGRESSGATEWAY_NODE_IP: Ingress ゲートウェイをホストする Kubernetes クラスタ内のノードです。この
kubectl
コマンドは、使用している Ingress ノードの数だけ実行します。
- INGRESSGATEWAY_NODE_IP: Ingress ゲートウェイをホストする Kubernetes クラスタ内のノードです。この
Ingress ゲートウェイを作成する
このセクションの手順を完了する前に、コントロール プレーンの実装を決定する必要があります。これを行うには、コントロール プレーンの実装を特定するの手順を適用します。
名前空間を作成します。この名前空間は、Ingress ゲートウェイのデプロイに使用されます。
kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
インジェクションの名前空間を有効にします。手順は、コントロール プレーンの実装によって異なります。
マネージド(TD)
- デフォルトのインジェクション ラベルを名前空間に適用します。
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 コントロール プレーンを使用している既存のユーザーの場合: デフォルトのインジェクションを使用することをおすすめしますが、リビジョンベースのインジェクションもサポートされています。次の手順を行います。
利用可能なリリース チャンネルを探すには、次のコマンドを実行します。
kubectl -n istio-system get controlplanerevision
出力は次のようになります。
NAME AGE asm-managed-rapid 6d7h
注: 上記のリストに 2 つのコントロール プレーンのリビジョンが表示されている場合は、1 つを削除します。クラスタに複数のコントロール プレーン チャネルを配置することはできません。
出力で、
NAME
列の値は、Cloud Service Mesh バージョンで使用可能なリリース チャンネルに対応するリビジョン ラベルです。リビジョン ラベルを名前空間に適用します。
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
デフォルトのインジェクションを使用することをおすすめしますが、リビジョンベースのインジェクションがサポートされています。 次の手順を使用します。
次のコマンドを使用して、
istiod
のリビジョン ラベルを探します。kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
リビジョン ラベルを名前空間に適用します。次のコマンドで、
REVISION_LABEL
は前の手順でメモしたistiod
リビジョン ラベルの値です。kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
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
外部ロードバランサの 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)"
(省略可)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
ポート情報を取得する
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}')
NodePorts
を表示します。echo HTTP_INGRESS_PORT=${HTTP_INGRESS_PORT} echo HTTPS_INGRESS_PORT=${HTTPS_INGRESS_PORT} echo STATUS_PORT=${STATUS_PORT}
外部ロードバランサを構成する
前の手順で表示した NodePorts
を使用して、外部ロードバランサと Ingress ゲートウェイの間の接続を構成します。
ロードバランサの構成でヘルスチェックを構成します。
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
です。この情報は前の手順からコピーできます。この値は、クラスタ内のすべてのノードで同じです。
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
です。この情報は前の手順からコピーできます。この値は、クラスタ内のすべてのノードで同じです。
設定を確認するには、ロードバランサのヘルスチェックに合格していることを確認します。
次のステップ
- ゲートウェイのインストールとアップグレードの詳細を確認する