外部コントロールプレーンによる Istio のインストール
このガイドでは、外部コントロールプレーンのインストール方法と、それに1つ以上のリモートクラスタを接続する方法について説明します。外部コントロールプレーンデプロイメントモデルを使用すると、メッシュオペレータは、メッシュを構成するデータプレーン クラスタ(または複数のクラスタ)とは別に、外部クラスタにコントロールプレーンをインストールして管理できます。このデプロイメントモデルにより、メッシュオペレータとメッシュ管理者の役割が明確に分離されます。メッシュオペレータはIstioコントロールプレーンをインストールおよび管理し、メッシュ管理者はメッシュの設定のみを行う必要があります。
リモートクラスタで実行されているEnvoyプロキシ(サイドカーとゲートウェイ)は、ディスカバリ、CA、インジェクション、検証に必要なエンドポイントを公開するイングレスゲートウェイを介して、外部istiodにアクセスします。
外部コントロールプレーンの設定と管理は、外部クラスタ内のメッシュオペレータによって行われますが、外部コントロールプレーンに接続された最初のリモートクラスタは、メッシュ自体のコンフィグクラスタとして機能します。メッシュ管理者は、コンフィグクラスタを使用して、メッシュサービスに加えて、メッシュリソース(ゲートウェイ、仮想サービスなど)を設定します。上記の図に示すように、外部コントロールプレーンはこの構成にKubernetes APIサーバーからリモートアクセスします。
始める前に
クラスタ
このガイドでは、サポートされているKubernetesバージョン: 1.28、1.29、1.30、1.31のいずれかを備えたKubernetesクラスタが2つ必要です。
最初のクラスタは、external-istiod
名前空間にインストールされた外部コントロールプレーンをホストします。クラスタ間の外部コントロールプレーンへのアクセスを提供するために、istio-system
名前空間にイングレスゲートウェイもインストールされます。
2番目のクラスタは、メッシュアプリケーションワークロードを実行するリモートクラスタです。そのKubernetes APIサーバーは、ワークロードプロキシの設定に外部コントロールプレーン(istiod)が使用するメッシュ設定も提供します。
APIサーバーアクセス
リモートクラスタのKubernetes APIサーバーは、外部コントロールプレーンクラスタからアクセス可能である必要があります。多くのクラウドプロバイダーは、ネットワークロードバランサー(NLB)を介してAPIサーバーを公開的にアクセス可能にしています。APIサーバーに直接アクセスできない場合は、アクセスを有効にするためにインストール手順を変更する必要があります。たとえば、マルチクラスタ構成で使用されるイーストウエストゲートウェイを使用して、APIサーバーへのアクセスを有効にすることもできます。
環境変数
手順を簡素化するために、次の環境変数が使用されます。
変数 | 説明 |
---|---|
CTX_EXTERNAL_CLUSTER | 外部コントロールプレーンクラスタへのアクセスに使用される、デフォルトのKubernetes設定ファイルのコンテキスト名。 |
CTX_REMOTE_CLUSTER | リモートクラスタへのアクセスに使用される、デフォルトのKubernetes設定ファイルのコンテキスト名。 |
REMOTE_CLUSTER_NAME | リモートクラスタの名前。 |
EXTERNAL_ISTIOD_ADDR | 外部コントロールプレーンクラスタ上のイングレスゲートウェイのホスト名。リモートクラスタが外部コントロールプレーンにアクセスするために使用されます。 |
SSL_SECRET_NAME | 外部コントロールプレーンクラスタ上のイングレスゲートウェイのTLS証明書を保持するシークレットの名前。 |
CTX_EXTERNAL_CLUSTER
、CTX_REMOTE_CLUSTER
、およびREMOTE_CLUSTER_NAME
を設定してください。他の変数は後で設定します。
$ export CTX_EXTERNAL_CLUSTER=<your external cluster context>
$ export CTX_REMOTE_CLUSTER=<your remote cluster context>
$ export REMOTE_CLUSTER_NAME=<your remote cluster name>
クラスタ設定
メッシュオペレーター手順
メッシュオペレータは、外部クラスタに外部Istioコントロールプレーンをインストールおよび管理する責任があります。これには、リモートクラスタがコントロールプレーンにアクセスできるようにする外部クラスタへのイングレスゲートウェイの設定、および外部コントロールプレーンを使用するようにリモートクラスタへのサイドカーインジェクタWebhookの設定のインストールが含まれます。
外部クラスタへのゲートウェイの設定
他のクラスタに外部コントロールプレーンポートを公開するイングレスゲートウェイのIstioインストール構成を作成します。
$ cat <<EOF > controlplane-gateway.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: istio-system spec: components: ingressGateways: - name: istio-ingressgateway enabled: true k8s: service: ports: - port: 15021 targetPort: 15021 name: status-port - port: 15012 targetPort: 15012 name: tls-xds - port: 15017 targetPort: 15017 name: tls-webhook EOF
次に、外部クラスタの
istio-system
名前空間にゲートウェイをインストールします。$ istioctl install -f controlplane-gateway.yaml --context="${CTX_EXTERNAL_CLUSTER}"
イングレスゲートウェイが稼働していることを確認するには、次のコマンドを実行します。
$ kubectl get po -n istio-system --context="${CTX_EXTERNAL_CLUSTER}" NAME READY STATUS RESTARTS AGE istio-ingressgateway-9d4c7f5c7-7qpzz 1/1 Running 0 29s istiod-68488cd797-mq8dn 1/1 Running 0 38s
istio-system
名前空間にistiodデプロイメントも作成されていることに気付くでしょう。これは、イングレスゲートウェイの設定に使用され、リモートクラスタで使用されるコントロールプレーンではありません。TLSを使用してパブリックホスト名を使用してIstioイングレスゲートウェイサービスを公開するように環境を設定します。
EXTERNAL_ISTIOD_ADDR
環境変数をホスト名に、SSL_SECRET_NAME
環境変数をTLS証明書を保持するシークレット名に設定します。$ export EXTERNAL_ISTIOD_ADDR=<your external istiod host> $ export SSL_SECRET_NAME=<your external istiod secret>
これらの手順では、適切に署名されたDNS証明書を使用してホスト名で外部クラスタのゲートウェイを公開していると仮定しています。これは、本番環境で推奨される方法です。安全なゲートウェイの公開の詳細については、セキュアイングレス タスクを参照してください。
環境変数は次のようになります。
$ echo "$EXTERNAL_ISTIOD_ADDR" "$SSL_SECRET_NAME" myhost.example.com myhost-example-credential
リモート設定クラスタの設定
remote
プロファイルを使用して、リモートクラスタのIstioインストールを設定します。これにより、ローカルにデプロイされたインジェクタではなく、外部コントロールプレーンのインジェクタを使用するインジェクションWebhookがインストールされます。このクラスタはコンフィグクラスタとしても機能するため、リモートクラスタに必要なIstio CRDとその他のリソースは、global.configCluster
とpilot.configMap
をtrue
に設定することによってもインストールされます。$ cat <<EOF > remote-config-cluster.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: external-istiod spec: profile: remote values: global: istioNamespace: external-istiod configCluster: true pilot: configMap: true istiodRemote: injectionURL: https://${EXTERNAL_ISTIOD_ADDR}:15017/inject/cluster/${REMOTE_CLUSTER_NAME}/net/network1 base: validationURL: https://${EXTERNAL_ISTIOD_ADDR}:15017/validate EOF
適切なDNSホスト名ではなく、
EXTERNAL_ISTIOD_ADDR
にIPアドレスを使用している場合は、URLの代わりに検出アドレスとパスを指定するように構成を変更します。$ sed -i'.bk' \ -e "s|injectionURL: https://${EXTERNAL_ISTIOD_ADDR}:15017|injectionPath: |" \ -e "/istioNamespace:/a\\ remotePilotAddress: ${EXTERNAL_ISTIOD_ADDR}" \ -e '/base:/,+1d' \ remote-config-cluster.yaml; rm remote-config-cluster.yaml.bk
リモートクラスタに構成をインストールします。
$ kubectl create namespace external-istiod --context="${CTX_REMOTE_CLUSTER}" $ istioctl install -f remote-config-cluster.yaml --set values.defaultRevision=default --context="${CTX_REMOTE_CLUSTER}"
リモートクラスタのインジェクションWebhook構成がインストールされていることを確認します。
$ kubectl get mutatingwebhookconfiguration --context="${CTX_REMOTE_CLUSTER}" NAME WEBHOOKS AGE istio-revision-tag-default-external-istiod 4 2m2s istio-sidecar-injector-external-istiod 4 2m5s
リモートクラスタの検証Webhook構成がインストールされていることを確認します。
$ kubectl get validatingwebhookconfiguration --context="${CTX_REMOTE_CLUSTER}" NAME WEBHOOKS AGE istio-validator-external-istiod 1 6m53s istiod-default-validator 1 6m53s
外部クラスタへのコントロールプレーンの設定
外部コントロールプレーンをホストするために使用される
external-istiod
名前空間を作成します。$ kubectl create namespace external-istiod --context="${CTX_EXTERNAL_CLUSTER}"
外部クラスタのコントロールプレーンは、サービス、エンドポイント、およびポッド属性を検出するためにリモートクラスタにアクセスする必要があります。リモートクラスタの
kube-apiserver
にアクセスするための資格情報を含むシークレットを作成し、それを外部クラスタにインストールします。$ kubectl create sa istiod-service-account -n external-istiod --context="${CTX_EXTERNAL_CLUSTER}" $ istioctl create-remote-secret \ --context="${CTX_REMOTE_CLUSTER}" \ --type=config \ --namespace=external-istiod \ --service-account=istiod \ --create-service-account=false | \ kubectl apply -f - --context="${CTX_EXTERNAL_CLUSTER}"
外部クラスタの
external-istiod
名前空間にコントロールプレーンをインストールするためのIstio構成を作成します。istiodはローカルにマウントされたistio
configmapを使用するように構成されており、SHARED_MESH_CONFIG
環境変数はistio
に設定されています。これは、メッシュ管理者がコンフィグクラスタのconfigmapに設定した値と、メッシュオペレータによって設定されたローカルconfigmap(ここでは優先順位が高くなる)の値をマージするようにistiodに指示します。$ cat <<EOF > external-istiod.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: external-istiod spec: profile: empty meshConfig: rootNamespace: external-istiod defaultConfig: discoveryAddress: $EXTERNAL_ISTIOD_ADDR:15012 proxyMetadata: XDS_ROOT_CA: /etc/ssl/certs/ca-certificates.crt CA_ROOT_CA: /etc/ssl/certs/ca-certificates.crt components: pilot: enabled: true k8s: overlays: - kind: Deployment name: istiod patches: - path: spec.template.spec.volumes[100] value: |- name: config-volume configMap: name: istio - path: spec.template.spec.volumes[100] value: |- name: inject-volume configMap: name: istio-sidecar-injector - path: spec.template.spec.containers[0].volumeMounts[100] value: |- name: config-volume mountPath: /etc/istio/config - path: spec.template.spec.containers[0].volumeMounts[100] value: |- name: inject-volume mountPath: /var/lib/istio/inject env: - name: INJECTION_WEBHOOK_CONFIG_NAME value: "" - name: VALIDATION_WEBHOOK_CONFIG_NAME value: "" - name: EXTERNAL_ISTIOD value: "true" - name: LOCAL_CLUSTER_SECRET_WATCHER value: "true" - name: CLUSTER_ID value: ${REMOTE_CLUSTER_NAME} - name: SHARED_MESH_CONFIG value: istio values: global: externalIstiod: true caAddress: $EXTERNAL_ISTIOD_ADDR:15012 istioNamespace: external-istiod operatorManageWebhooks: true configValidation: false meshID: mesh1 multiCluster: clusterName: ${REMOTE_CLUSTER_NAME} network: network1 EOF
適切なDNSホスト名ではなく、
EXTERNAL_ISTIOD_ADDR
にIPアドレスを使用している場合は、プロキシメタデータを削除し、構成のWebhook config環境変数を更新します。$ sed -i'.bk' \ -e '/proxyMetadata:/,+2d' \ -e '/INJECTION_WEBHOOK_CONFIG_NAME/{n;s/value: ""/value: istio-sidecar-injector-external-istiod/;}' \ -e '/VALIDATION_WEBHOOK_CONFIG_NAME/{n;s/value: ""/value: istio-validator-external-istiod/;}' \ external-istiod.yaml ; rm external-istiod.yaml.bk
外部クラスタにIstio構成を適用します。
$ istioctl install -f external-istiod.yaml --context="${CTX_EXTERNAL_CLUSTER}"
外部istiodが正常にデプロイされたことを確認します。
$ kubectl get po -n external-istiod --context="${CTX_EXTERNAL_CLUSTER}" NAME READY STATUS RESTARTS AGE istiod-779bd6fdcf-bd6rg 1/1 Running 0 70s
イングレスゲートウェイから外部コントロールプレーンへのトラフィックをルーティングするためのIstio
Gateway
、VirtualService
、およびDestinationRule
構成を作成します。$ cat <<EOF > external-istiod-gw.yaml apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: external-istiod-gw namespace: external-istiod spec: selector: istio: ingressgateway servers: - port: number: 15012 protocol: https name: https-XDS tls: mode: SIMPLE credentialName: $SSL_SECRET_NAME hosts: - $EXTERNAL_ISTIOD_ADDR - port: number: 15017 protocol: https name: https-WEBHOOK tls: mode: SIMPLE credentialName: $SSL_SECRET_NAME hosts: - $EXTERNAL_ISTIOD_ADDR --- apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: external-istiod-vs namespace: external-istiod spec: hosts: - $EXTERNAL_ISTIOD_ADDR gateways: - external-istiod-gw http: - match: - port: 15012 route: - destination: host: istiod.external-istiod.svc.cluster.local port: number: 15012 - match: - port: 15017 route: - destination: host: istiod.external-istiod.svc.cluster.local port: number: 443 --- apiVersion: networking.istio.io/v1 kind: DestinationRule metadata: name: external-istiod-dr namespace: external-istiod spec: host: istiod.external-istiod.svc.cluster.local trafficPolicy: portLevelSettings: - port: number: 15012 tls: mode: SIMPLE connectionPool: http: h2UpgradePolicy: UPGRADE - port: number: 443 tls: mode: SIMPLE EOF
適切なDNSホスト名ではなく、
EXTERNAL_ISTIOD_ADDR
にIPアドレスを使用している場合は、構成を変更します。DestinationRule
を削除し、Gateway
でTLSを終了せず、VirtualService
でTLSルーティングを使用します。$ sed -i'.bk' \ -e '55,$d' \ -e 's/mode: SIMPLE/mode: PASSTHROUGH/' -e '/credentialName:/d' -e "s/${EXTERNAL_ISTIOD_ADDR}/\"*\"/" \ -e 's/http:/tls:/' -e 's/https/tls/' -e '/route:/i\ sniHosts:\ - "*"' \ external-istiod-gw.yaml; rm external-istiod-gw.yaml.bk
外部クラスタに構成を適用します。
$ kubectl apply -f external-istiod-gw.yaml --context="${CTX_EXTERNAL_CLUSTER}"
メッシュ管理者手順
Istioが稼働したら、メッシュ管理者は、必要に応じてゲートウェイを含むメッシュ内のサービスをデプロイおよび構成するだけで済みます。
サンプルアプリケーションのデプロイ
リモートクラスタで
sample
名前空間を作成し、インジェクション用にラベル付けします。$ kubectl create --context="${CTX_REMOTE_CLUSTER}" namespace sample $ kubectl label --context="${CTX_REMOTE_CLUSTER}" namespace sample istio-injection=enabled
helloworld
(v1
)とcurl
のサンプルをデプロイします。$ kubectl apply -f @samples/helloworld/helloworld.yaml@ -l service=helloworld -n sample --context="${CTX_REMOTE_CLUSTER}" $ kubectl apply -f @samples/helloworld/helloworld.yaml@ -l version=v1 -n sample --context="${CTX_REMOTE_CLUSTER}" $ kubectl apply -f @samples/curl/curl.yaml@ -n sample --context="${CTX_REMOTE_CLUSTER}"
helloworld
とcurl
のPodが、サイドカーが注入された状態で実行されるまで数秒待ちます。$ kubectl get pod -n sample --context="${CTX_REMOTE_CLUSTER}" NAME READY STATUS RESTARTS AGE curl-64d7d56698-wqjnm 2/2 Running 0 9s helloworld-v1-776f57d5f6-s7zfc 2/2 Running 0 10s
curl
Podからhelloworld
サービスにリクエストを送信します。$ kubectl exec --context="${CTX_REMOTE_CLUSTER}" -n sample -c curl \ "$(kubectl get pod --context="${CTX_REMOTE_CLUSTER}" -n sample -l app=curl -o jsonpath='{.items[0].metadata.name}')" \ -- curl -sS helloworld.sample:5000/hello Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc
ゲートウェイの有効化
リモートクラスタでイングレスゲートウェイを有効にします。
$ cat <<EOF > istio-ingressgateway.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
name: ingress-install
spec:
profile: empty
components:
ingressGateways:
- namespace: external-istiod
name: istio-ingressgateway
enabled: true
values:
gateways:
istio-ingressgateway:
injectionTemplate: gateway
EOF
$ istioctl install -f istio-ingressgateway.yaml --set values.global.istioNamespace=external-istiod --context="${CTX_REMOTE_CLUSTER}"
$ helm install istio-ingressgateway istio/gateway -n external-istiod --kube-context="${CTX_REMOTE_CLUSTER}"
ゲートウェイインストールに関する詳細なドキュメントについては、ゲートウェイのインストールを参照してください。
必要に応じて、他のゲートウェイ(例:エグレスゲートウェイ)も有効にすることができます。
$ cat <<EOF > istio-egressgateway.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
name: egress-install
spec:
profile: empty
components:
egressGateways:
- namespace: external-istiod
name: istio-egressgateway
enabled: true
values:
gateways:
istio-egressgateway:
injectionTemplate: gateway
EOF
$ istioctl install -f istio-egressgateway.yaml --set values.global.istioNamespace=external-istiod --context="${CTX_REMOTE_CLUSTER}"
$ helm install istio-egressgateway istio/gateway -n external-istiod --kube-context="${CTX_REMOTE_CLUSTER}" --set service.type=ClusterIP
ゲートウェイインストールに関する詳細なドキュメントについては、ゲートウェイのインストールを参照してください。
イングレスゲートウェイの構成とテスト
- ゲートウェイを構成する準備が整っていることを確認してください。
Istioイングレスゲートウェイが実行されていることを確認します。
$ kubectl get pod -l app=istio-ingressgateway -n external-istiod --context="${CTX_REMOTE_CLUSTER}"
NAME READY STATUS RESTARTS AGE
istio-ingressgateway-7bcd5c6bbd-kmtl4 1/1 Running 0 8m4s
Kubernetes Gateway API CRDは、ほとんどのKubernetesクラスタではデフォルトでインストールされていないため、Gateway APIを使用する前にインストールされていることを確認してください。
$ kubectl get crd gateways.gateway.networking.k8s.io --context="${CTX_REMOTE_CLUSTER}" &> /dev/null || \
{ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v1.2.0" | kubectl apply -f - --context="${CTX_REMOTE_CLUSTER}"; }
- イングレスゲートウェイで
helloworld
アプリケーションを公開します。
$ kubectl apply -f @samples/helloworld/helloworld-gateway.yaml@ -n sample --context="${CTX_REMOTE_CLUSTER}"
$ kubectl apply -f @samples/helloworld/gateway-api/helloworld-gateway.yaml@ -n sample --context="${CTX_REMOTE_CLUSTER}"
GATEWAY_URL
環境変数を設定します(詳細はイングレスIPとポートの決定を参照してください)。
$ export INGRESS_HOST=$(kubectl -n external-istiod --context="${CTX_REMOTE_CLUSTER}" get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ export INGRESS_PORT=$(kubectl -n external-istiod --context="${CTX_REMOTE_CLUSTER}" get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
$ kubectl -n sample --context="${CTX_REMOTE_CLUSTER}" wait --for=condition=programmed gtw helloworld-gateway
$ export INGRESS_HOST=$(kubectl -n sample --context="${CTX_REMOTE_CLUSTER}" get gtw helloworld-gateway -o jsonpath='{.status.addresses[0].value}')
$ export GATEWAY_URL=$INGRESS_HOST:80
イングレスゲートウェイを介して
helloworld
アプリケーションにアクセスできることを確認します。$ curl -s "http://${GATEWAY_URL}/hello" Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc
メッシュへのクラスタの追加(オプション)
このセクションでは、別のリモートクラスタを追加することで、既存の外部コントロールプレーンメッシュをマルチクラスタに拡張する方法を示します。これにより、サービスを容易に分散し、場所認識ルーティングとフェイルオーバーを使用してアプリケーションの高可用性をサポートできます。
最初のリモートクラスタとは異なり、同じ外部コントロールプレーンに追加された2番目以降のクラスタはメッシュ構成を提供せず、プライマリリモートIstioマルチクラスタ構成のリモートクラスタと同様に、エンドポイント構成のソースのみとなります。
続行するには、メッシュの2番目のリモートクラスタとして別のKubernetesクラスタが必要です。クラスタのコンテキスト名とクラスタ名を以下の環境変数に設定します。
$ export CTX_SECOND_CLUSTER=<your second remote cluster context>
$ export SECOND_CLUSTER_NAME=<your second remote cluster name>
新しいクラスタの登録
リモートIstioインストール構成を作成します。これは、ローカルに展開されたものではなく、外部コントロールプレーンのインジェクターを使用するインジェクションWebhookをインストールします。
$ cat <<EOF > second-remote-cluster.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: external-istiod spec: profile: remote values: global: istioNamespace: external-istiod istiodRemote: injectionURL: https://${EXTERNAL_ISTIOD_ADDR}:15017/inject/cluster/${SECOND_CLUSTER_NAME}/net/network2 EOF
適切なDNSホスト名ではなく
EXTERNAL_ISTIOD_ADDR
にIPアドレスを使用している場合は、インジェクションURLではなく、検出アドレスとパスを指定するように構成を変更します。$ sed -i'.bk' \ -e "s|injectionURL: https://${EXTERNAL_ISTIOD_ADDR}:15017|injectionPath: |" \ -e "/istioNamespace:/a\\ remotePilotAddress: ${EXTERNAL_ISTIOD_ADDR}" \ second-remote-cluster.yaml; rm second-remote-cluster.yaml.bk
リモートクラスタでシステム名前空間を作成し、アノテーションを付けます。
$ kubectl create namespace external-istiod --context="${CTX_SECOND_CLUSTER}" $ kubectl annotate namespace external-istiod "topology.istio.io/controlPlaneClusters=${REMOTE_CLUSTER_NAME}" --context="${CTX_SECOND_CLUSTER}"
topology.istio.io/controlPlaneClusters
アノテーションは、このリモートクラスタを管理する必要がある外部コントロールプレーンのクラスタIDを指定します。これは、最初にリモート(構成)クラスタの名前であり、以前に外部クラスタにインストールされたときに外部コントロールプレーンのクラスタIDを設定するために使用されたことに注意してください。リモートクラスタに構成をインストールします。
$ istioctl install -f second-remote-cluster.yaml --context="${CTX_SECOND_CLUSTER}"
リモートクラスタのインジェクションWebhook構成がインストールされていることを確認します。
$ kubectl get mutatingwebhookconfiguration --context="${CTX_SECOND_CLUSTER}" NAME WEBHOOKS AGE istio-sidecar-injector-external-istiod 4 4m13s
コントロールプレーンが2番目のリモートクラスタのエンドポイントにアクセスできるようにするための資格情報を含むシークレットを作成し、インストールします。
$ istioctl create-remote-secret \ --context="${CTX_SECOND_CLUSTER}" \ --name="${SECOND_CLUSTER_NAME}" \ --type=remote \ --namespace=external-istiod \ --create-service-account=false | \ kubectl apply -f - --context="${CTX_EXTERNAL_CLUSTER}"
メッシュの最初のリモートクラスタ(構成クラスタも兼ねる)とは異なり、今回は
--type
引数がconfig
ではなくremote
に設定されていることに注意してください。
東西ゲートウェイの設定
両方のリモートクラスタにイーストウエストゲートウェイを展開します。
$ @samples/multicluster/gen-eastwest-gateway.sh@ \ --network network1 > eastwest-gateway-1.yaml $ istioctl manifest generate -f eastwest-gateway-1.yaml \ --set values.global.istioNamespace=external-istiod | \ kubectl apply --context="${CTX_REMOTE_CLUSTER}" -f -
$ @samples/multicluster/gen-eastwest-gateway.sh@ \ --network network2 > eastwest-gateway-2.yaml $ istioctl manifest generate -f eastwest-gateway-2.yaml \ --set values.global.istioNamespace=external-istiod | \ kubectl apply --context="${CTX_SECOND_CLUSTER}" -f -
イーストウエストゲートウェイに外部IPアドレスが割り当てられるまで待ちます。
$ kubectl --context="${CTX_REMOTE_CLUSTER}" get svc istio-eastwestgateway -n external-istiod NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-eastwestgateway LoadBalancer 10.0.12.121 34.122.91.98 ... 51s
$ kubectl --context="${CTX_SECOND_CLUSTER}" get svc istio-eastwestgateway -n external-istiod NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-eastwestgateway LoadBalancer 10.0.12.121 34.122.91.99 ... 51s
イーストウエストゲートウェイを介してサービスを公開します。
$ kubectl --context="${CTX_REMOTE_CLUSTER}" apply -n external-istiod -f \ @samples/multicluster/expose-services.yaml@
インストールの検証
リモートクラスタで
sample
名前空間を作成し、インジェクション用にラベル付けします。$ kubectl create --context="${CTX_SECOND_CLUSTER}" namespace sample $ kubectl label --context="${CTX_SECOND_CLUSTER}" namespace sample istio-injection=enabled
helloworld
(v2
)とcurl
のサンプルを展開します。$ kubectl apply -f @samples/helloworld/helloworld.yaml@ -l service=helloworld -n sample --context="${CTX_SECOND_CLUSTER}" $ kubectl apply -f @samples/helloworld/helloworld.yaml@ -l version=v2 -n sample --context="${CTX_SECOND_CLUSTER}" $ kubectl apply -f @samples/curl/curl.yaml@ -n sample --context="${CTX_SECOND_CLUSTER}"
helloworld
とcurl
のPodが、サイドカーが注入された状態で実行されるまで数秒待ちます。$ kubectl get pod -n sample --context="${CTX_SECOND_CLUSTER}" NAME READY STATUS RESTARTS AGE curl-557747455f-wtdbr 2/2 Running 0 9s helloworld-v2-54df5f84b-9hxgw 2/2 Running 0 10s
curl
Podからhelloworld
サービスにリクエストを送信します。$ kubectl exec --context="${CTX_SECOND_CLUSTER}" -n sample -c curl \ "$(kubectl get pod --context="${CTX_SECOND_CLUSTER}" -n sample -l app=curl -o jsonpath='{.items[0].metadata.name}')" \ -- curl -sS helloworld.sample:5000/hello Hello version: v2, instance: helloworld-v2-54df5f84b-9hxgw
イングレスゲートウェイを介して
helloworld
アプリケーションに複数回アクセスすると、バージョンv1
とv2
の両方が呼び出されることを確認します。$ for i in {1..10}; do curl -s "http://${GATEWAY_URL}/hello"; done Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc Hello version: v2, instance: helloworld-v2-54df5f84b-9hxgw Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc Hello version: v2, instance: helloworld-v2-54df5f84b-9hxgw ...
クリーンアップ
外部コントロールプレーンクラスタをクリーンアップします。
$ kubectl delete -f external-istiod-gw.yaml --context="${CTX_EXTERNAL_CLUSTER}"
$ istioctl uninstall -y --purge -f external-istiod.yaml --context="${CTX_EXTERNAL_CLUSTER}"
$ kubectl delete ns istio-system external-istiod --context="${CTX_EXTERNAL_CLUSTER}"
$ rm controlplane-gateway.yaml external-istiod.yaml external-istiod-gw.yaml
リモート構成クラスタをクリーンアップします。
$ kubectl delete ns sample --context="${CTX_REMOTE_CLUSTER}"
$ istioctl uninstall -y --purge -f remote-config-cluster.yaml --set values.defaultRevision=default --context="${CTX_REMOTE_CLUSTER}"
$ kubectl delete ns external-istiod --context="${CTX_REMOTE_CLUSTER}"
$ rm remote-config-cluster.yaml istio-ingressgateway.yaml
$ rm istio-egressgateway.yaml eastwest-gateway-1.yaml || true
インストールした場合は、オプションの2番目のリモートクラスタをクリーンアップします。
$ kubectl delete ns sample --context="${CTX_SECOND_CLUSTER}"
$ istioctl uninstall -y --purge -f second-remote-cluster.yaml --context="${CTX_SECOND_CLUSTER}"
$ kubectl delete ns external-istiod --context="${CTX_SECOND_CLUSTER}"
$ rm second-remote-cluster.yaml eastwest-gateway-2.yaml