第7章 外部コントロールプレーントポロジー
外部コントロールプレーントポロジーは、コントロールプレーンを別のクラスター上のデータプレーンから分離するために使用します。
7.1. 外部コントロールプレーントポロジーについて リンクのコピーリンクがクリップボードにコピーされました!
外部コントロールプレーントポロジーを使用すると、セキュリティーが向上し、Service Mesh をサービスとしてホストできます。このインストール設定では、1 つのクラスターが Istio コントロールプレーンをホストおよび管理します。アプリケーションは他のクラスターでホストされます。
7.1.1. コントロールプレーンとデータプレーンを別々のクラスターにインストールする リンクのコピーリンクがクリップボードにコピーされました!
コントロールプレーンクラスターと、個別のデータプレーンクラスターに Istio をインストールします。このインストール方法により、セキュリティーが強化されます。
この手順は、複数のデータプレーンクラスターにまたがるメッシュに適用できます。この手順は、同じコントロールプレーンクラスター上に複数のコントロールプレーンを持つ複数のメッシュにも適用できます。
前提条件
- コントロールプレーンクラスターとデータプレーンクラスターに OpenShift Service Mesh Operator をインストールした。
-
この手順を実行するために使用するノートパソコンに
istioctl
をインストールした。
手順
次のコマンドを実行して、すべてのクラスターにインストールする Istio のバージョンを定義する
ISTIO_VERSION
環境変数を作成します。export ISTIO_VERSION=1.24.3
$ export ISTIO_VERSION=1.24.3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、クラスターの名前を定義する
REMOTE_CLUSTER_NAME
環境変数を作成します。export REMOTE_CLUSTER_NAME=cluster1
$ export REMOTE_CLUSTER_NAME=cluster1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、コントロールプレーンクラスター用の
oc
コマンドコンテキストを含む環境変数を設定します。export CTX_CONTROL_PLANE_CLUSTER=<context_name_of_the_control_plane_cluster>
$ export CTX_CONTROL_PLANE_CLUSTER=<context_name_of_the_control_plane_cluster>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、データプレーンクラスター用の
oc
コマンドコンテキストを含む環境変数を設定します。export CTX_DATA_PLANE_CLUSTER=<context_name_of_the_data_plane_cluster>
$ export CTX_DATA_PLANE_CLUSTER=<context_name_of_the_data_plane_cluster>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コントロールプレーンの Ingress ゲートウェイを設定します。
次のコマンドを実行して、
istio-system
というプロジェクトを作成します。oc get project istio-system --context "${CTX_CONTROL_PLANE_CLUSTER}" || oc new-project istio-system --context "${CTX_CONTROL_PLANE_CLUSTER}"
$ oc get project istio-system --context "${CTX_CONTROL_PLANE_CLUSTER}" || oc new-project istio-system --context "${CTX_CONTROL_PLANE_CLUSTER}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Ingress ゲートウェイを管理するための
Istio
リソースをコントロールプレーンクラスターに作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、コントロールプレーンの Ingress ゲートウェイを作成します。
oc --context "${CTX_CONTROL_PLANE_CLUSTER}" apply -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/docs/deployment-models/resources/controlplane-gateway.yaml
$ oc --context "${CTX_CONTROL_PLANE_CLUSTER}" apply -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/main/docs/deployment-models/resources/controlplane-gateway.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Ingress ゲートウェイに割り当てられた IP アドレスを取得します。
oc --context "${CTX_CONTROL_PLANE_CLUSTER}" get svc istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
$ oc --context "${CTX_CONTROL_PLANE_CLUSTER}" get svc istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Ingress ゲートウェイの IP アドレスを環境変数に保存します。
export EXTERNAL_ISTIOD_ADDR=$(oc -n istio-system --context="${CTX_CONTROL_PLANE_CLUSTER}" get svc istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ export EXTERNAL_ISTIOD_ADDR=$(oc -n istio-system --context="${CTX_CONTROL_PLANE_CLUSTER}" get svc istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
データプレーンクラスターに Istio をインストールします。
次のコマンドを実行して、データプレーンクラスターに
external-istiod
というプロジェクトを作成します。oc get project external-istiod --context "${CTX_DATA_PLANE_CLUSTER}" || oc new-project external-istiod --context "${CTX_DATA_PLANE_CLUSTER}"
$ oc get project external-istiod --context "${CTX_DATA_PLANE_CLUSTER}" || oc new-project external-istiod --context "${CTX_DATA_PLANE_CLUSTER}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、データプレーンクラスターに
Istio
リソースを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- この設定は、データプレーンクラスターをメッシュ設定のソースとして指定するものです。
次のコマンドを実行して、データプレーンクラスターに
istio-cni
というプロジェクトを作成します。oc get project istio-cni --context "${CTX_DATA_PLANE_CLUSTER}" || oc new-project istio-cni --context "${CTX_DATA_PLANE_CLUSTER}"
$ oc get project istio-cni --context "${CTX_DATA_PLANE_CLUSTER}" || oc new-project istio-cni --context "${CTX_DATA_PLANE_CLUSTER}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、データプレーンクラスターに
IstioCNI
リソースを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
コントロールプレーンクラスターに外部 Istio コントロールプレーンを設定します。
次のコマンドを実行して、コントロールプレーンクラスターに
external-istiod
というプロジェクトを作成します。oc get project external-istiod --context "${CTX_CONTROL_PLANE_CLUSTER}" || oc new-project external-istiod --context "${CTX_CONTROL_PLANE_CLUSTER}"
$ oc get project external-istiod --context "${CTX_CONTROL_PLANE_CLUSTER}" || oc new-project external-istiod --context "${CTX_CONTROL_PLANE_CLUSTER}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、コントロールプレーンクラスターに
ServiceAccount
リソースを作成します。oc --context="${CTX_CONTROL_PLANE_CLUSTER}" create serviceaccount istiod-service-account -n external-istiod
$ oc --context="${CTX_CONTROL_PLANE_CLUSTER}" create serviceaccount istiod-service-account -n external-istiod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、データプレーンクラスターの API サーバーアドレスを環境変数に保存します。
DATA_PLANE_API_SERVER=https://<hostname_or_IP_address_of_the_API_server_for_the_data_plane_cluster>:6443
$ DATA_PLANE_API_SERVER=https://<hostname_or_IP_address_of_the_API_server_for_the_data_plane_cluster>:6443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、データプレーンクラスターの API サーバーへのアクセスを提供するリモートシークレットを、コントロールプレーンクラスターにインストールします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、コントロールプレーンクラスターに
Istio
リソースを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、データプレーンクラスター上のサイドカープロキシーがコントロールプレーンにアクセスできるように、
Gateway
およびVirtualService
リソースを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、コントロールプレーンクラスター上の
external-istiod
Istio
リソースが "Ready" ステータス条件を返すまで待ちます。oc --context "${CTX_CONTROL_PLANE_CLUSTER}" wait --for condition=Ready istio/external-istiod --timeout=3m
$ oc --context "${CTX_CONTROL_PLANE_CLUSTER}" wait --for condition=Ready istio/external-istiod --timeout=3m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、データプレーンクラスター上の
Istio
リソースが "Ready" ステータス条件を返すまで待ちます。oc --context "${CTX_DATA_PLANE_CLUSTER}" wait --for condition=Ready istio/external-istiod --timeout=3m
$ oc --context "${CTX_DATA_PLANE_CLUSTER}" wait --for condition=Ready istio/external-istiod --timeout=3m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、データプレーンクラスター上の
IstioCNI
リソースが "Ready" ステータス条件を返すまで待ちます。oc --context "${CTX_DATA_PLANE_CLUSTER}" wait --for condition=Ready istiocni/default --timeout=3m
$ oc --context "${CTX_DATA_PLANE_CLUSTER}" wait --for condition=Ready istiocni/default --timeout=3m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
データプレーンクラスターにサンプルアプリケーションをデプロイします。
次のコマンドを実行して、データプレーンクラスターにサンプルアプリケーションの namespace を作成します。
oc --context "${CTX_DATA_PLANE_CLUSTER}" get project sample || oc --context="${CTX_DATA_PLANE_CLUSTER}" new-project sample
$ oc --context "${CTX_DATA_PLANE_CLUSTER}" get project sample || oc --context="${CTX_DATA_PLANE_CLUSTER}" new-project sample
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、サイドカーインジェクションをサポートするために、サンプルアプリケーションの namespace にラベルを付けます。
oc --context="${CTX_DATA_PLANE_CLUSTER}" label namespace sample istio.io/rev=external-istiod
$ oc --context="${CTX_DATA_PLANE_CLUSTER}" label namespace sample istio.io/rev=external-istiod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow helloworld
アプリケーションをデプロイします。以下のコマンドを実行して
helloworld
サービスを作成します。oc --context="${CTX_DATA_PLANE_CLUSTER}" apply \ -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
$ oc --context="${CTX_DATA_PLANE_CLUSTER}" apply \ -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して
helloworld-v1
デプロイメントを作成します。oc --context="${CTX_DATA_PLANE_CLUSTER}" apply \ -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/helloworld/helloworld.yaml \ -l version=v1 -n sample
$ oc --context="${CTX_DATA_PLANE_CLUSTER}" apply \ -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/helloworld/helloworld.yaml \ -l version=v1 -n sample
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のコマンドを実行して、
sleep
アプリケーションをデプロイします。oc --context="${CTX_DATA_PLANE_CLUSTER}" apply \ -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/sleep/sleep.yaml -n sample
$ oc --context="${CTX_DATA_PLANE_CLUSTER}" apply \ -f https://raw.githubusercontent.com/istio/istio/${ISTIO_VERSION}/samples/sleep/sleep.yaml -n sample
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
sample
namespace の Pod にサイドカーが注入されていることを確認します。oc --context="${CTX_DATA_PLANE_CLUSTER}" get pods -n sample
$ oc --context="${CTX_DATA_PLANE_CLUSTER}" get pods -n sample
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ターミナルで次のコマンドを実行すると、
sample
namespace の各 Pod に対して2/2
が返されるはずです。出力例
NAME READY STATUS RESTARTS AGE helloworld-v1-6d65866976-jb6qc 2/2 Running 0 1m sleep-5fcd8fd6c8-mg8n2 2/2 Running 0 1m
NAME READY STATUS RESTARTS AGE helloworld-v1-6d65866976-jb6qc 2/2 Running 0 1m sleep-5fcd8fd6c8-mg8n2 2/2 Running 0 1m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
内部トラフィックがクラスター上のアプリケーションに到達できることを確認します。
次のコマンドを実行して、
sleep
アプリケーションを介してhelloworld
アプリケーションにリクエストを送信できることを確認します。oc exec --context="${CTX_DATA_PLANE_CLUSTER}" -n sample -c sleep deploy/sleep -- curl -sS helloworld.sample:5000/hello
$ oc exec --context="${CTX_DATA_PLANE_CLUSTER}" -n sample -c sleep deploy/sleep -- curl -sS helloworld.sample:5000/hello
Copy to Clipboard Copied! Toggle word wrap Toggle overflow helloworld
アプリケーションからのレスポンスがターミナルに返されるはずです。出力例
Hello version: v1, instance: helloworld-v1-6d65866976-jb6qc
Hello version: v1, instance: helloworld-v1-6d65866976-jb6qc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Ingress ゲートウェイをインストールして、サンプルアプリケーションを外部クライアントに公開します。
次のコマンドを実行して、Ingress ゲートウェイを作成します。
oc --context="${CTX_DATA_PLANE_CLUSTER}" apply
$ oc --context="${CTX_DATA_PLANE_CLUSTER}" apply -f https://raw.githubusercontent.com/istio-ecosystem/sail-operator/refs/heads/main/chart/samples/ingress-gateway.yaml -n sample
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Ingress ゲートウェイが実行中であることを確認します。
oc get pod -l app=istio-ingressgateway -n sample --context="${CTX_DATA_PLANE_CLUSTER}"
$ oc get pod -l app=istio-ingressgateway -n sample --context="${CTX_DATA_PLANE_CLUSTER}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ゲートウェイが実行中であることを確認できる出力がターミナルに返されるはずです。
出力例
NAME READY STATUS RESTARTS AGE istio-ingressgateway-7bcd5c6bbd-kmtl4 1/1 Running 0 8m4s
NAME READY STATUS RESTARTS AGE istio-ingressgateway-7bcd5c6bbd-kmtl4 1/1 Running 0 8m4s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Ingress ゲートウェイを介して
helloworld
アプリケーションを公開します。oc apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/helloworld/helloworld-gateway.yaml -n sample --context="${CTX_DATA_PLANE_CLUSTER}"
$ oc apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/helloworld/helloworld-gateway.yaml -n sample --context="${CTX_DATA_PLANE_CLUSTER}"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、ゲートウェイ URL の環境変数を設定します。
export INGRESS_HOST=$(oc -n sample --context="${CTX_DATA_PLANE_CLUSTER}" get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'); \ export INGRESS_PORT=$(oc -n sample --context="${CTX_DATA_PLANE_CLUSTER}" get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}'); \ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
$ export INGRESS_HOST=$(oc -n sample --context="${CTX_DATA_PLANE_CLUSTER}" get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'); \ export INGRESS_PORT=$(oc -n sample --context="${CTX_DATA_PLANE_CLUSTER}" get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}'); \ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
外部トラフィックがメッシュ上のアプリケーションに到達できることを確認します。
次のコマンドを実行して、ゲートウェイを介して
helloworld
アプリケーションにアクセスできることを確認します。curl -s "http://${GATEWAY_URL}/hello"
$ curl -s "http://${GATEWAY_URL}/hello"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow helloworld
アプリケーションからレスポンスが返されるはずです。出力例
Hello version: v1, instance: helloworld-v1-6d65866976-jb6qc
Hello version: v1, instance: helloworld-v1-6d65866976-jb6qc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow