外部ロードバランサを使用して Ingress ゲートウェイを公開する
概要
Anthos Service Mesh を使用すると、サービス メッシュの一部として Ingress ゲートウェイをデプロイして管理できます。Anthos Service Mesh を使用してクラスタのロード バランシングをさらに構成するには、外部ロードバランサ(クラスタ外の物理ロードバランサまたはソフトウェア ロードバランサ)を使用して、Ingress ゲートウェイにトラフィックを送信します。
このページでは、Anthos Service Mesh を使用して外部ロードバランサを構成する方法について説明します。
始める前に
このドキュメントで説明する手順を完了するには、次のリソースが必要です。
Anthos Service Mesh がインストールされている Kubernetes クラスタ。
クラスタが実行されているノードにアクセスできる外部ロードバランサ。この外部ロードバランサは、
External IP Address
を介してクラスタの 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}
インジェクションの名前空間を有効にします。手順は Anthos Service Mesh のタイプ(マネージドまたはクラスタ内)によって異なります。
マネージド
利用可能なリリース チャンネルを探すには、次のコマンドを使用します。
kubectl -n istio-system get controlplanerevision
出力は次のようになります。
NAME AGE asm-managed 6d7h asm-managed-rapid 6d7h
出力で、
NAME
列の値は、Anthos Service Mesh バージョンで使用可能なリリース チャンネルに対応するリビジョン ラベルです。リビジョン ラベルを名前空間に適用します。
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
クラスタ内
次のコマンドを使用して、
istiod
のリビジョン ラベルを探します。kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
リビジョン ラベルを名前空間に適用します。次のコマンドで、
REVISION
は前の手順でメモしたistiod
リビジョン ラベルの値です。kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION --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
デプロイメントに適用します。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
ビアです。この情報は前の手順からコピーできます。これは、クラスタ内のすべてのノードで同じになります。
設定を確認するには、ロードバランサのヘルスチェックに合格していることを確認します。
次のステップ
- ゲートウェイのインストールとアップグレードの詳細を確認する