外部ロードバランサを使用して 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 ゲートウェイを作成する
このセクションの手順を完了する前に、コントロール プレーンの実装を決定する必要があります。これを行うには、コントロール プレーンの実装を特定するの手順を適用します。
Namespace を作成します。この Namespace は、Ingress ゲートウェイのデプロイに使用されます。
kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
インジェクションの名前空間を有効にします。手順は、コントロール プレーンの実装によって異なります。
マネージド(TD)
- デフォルトのインジェクション ラベルを Namespace に適用します。
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio.io/rev- istio-injection=enabled --overwriteマネージド(Istiod)
推奨: 次のコマンドを実行して、デフォルトのインジェクション ラベルを Namespace に適用します。
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 つ表示されている場合は、一方を削除します。クラスタに複数のコントロール プレーン チャネルを配置することはできません。
出力の
NAME列の値は、Cloud Service Mesh バージョンで使用可能なリリース チャンネルに対応するリビジョン ラベルです。リビジョン ラベルを名前空間に適用します。
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
クラスタ内
推奨: 次のコマンドを実行して、デフォルトのインジェクション ラベルを Namespace に適用します。
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"}'リビジョン ラベルを Namespace に適用します。次のコマンドで、
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 ゲートウェイ ノードラベル アフィニティのパッチを
ingressgatewayDeployment に適用します。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/readyCLUSTER_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_PORTCLUSTER_NODE_IP: Ingress ゲートウェイをホストする Kubernetes クラスタ内のノードの IP アドレスです。この IP アドレスは外部ロードバランサから到達可能である必要があります。クラスタノードごとに 1 回、この構成を複数回設定する必要があります。
HTTP_INGRESS_PORT: Ingress ゲートウェイの HTTP トラフィックが公開されている
NodePortです。この情報は前の手順からコピーできます。この値は、クラスタ内のすべてのノードで同じです。HTTPS_INGRESS_PORT: Ingress ゲートウェイの HTTPS トラフィックが公開されている
NodePortです。この情報は前の手順からコピーできます。この値は、クラスタ内のすべてのノードで同じです。
設定を確認するには、ロードバランサのヘルスチェックに合格していることを確認します。
次のステップ
- ゲートウェイのインストールとアップグレードの詳細を確認する