外部コントロールプレーンによる Istio のインストール

このガイドでは、外部コントロールプレーンのインストール方法と、それに1つ以上のリモートクラスタを接続する方法について説明します。外部コントロールプレーンデプロイメントモデルを使用すると、メッシュオペレータは、メッシュを構成するデータプレーン クラスタ(または複数のクラスタ)とは別に、外部クラスタにコントロールプレーンをインストールして管理できます。このデプロイメントモデルにより、メッシュオペレータとメッシュ管理者の役割が明確に分離されます。メッシュオペレータはIstioコントロールプレーンをインストールおよび管理し、メッシュ管理者はメッシュの設定のみを行う必要があります。

External control plane cluster and remote cluster
外部コントロールプレーンクラスタとリモートクラスタ

リモートクラスタで実行されている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_CLUSTERCTX_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の設定のインストールが含まれます。

外部クラスタへのゲートウェイの設定

  1. 他のクラスタに外部コントロールプレーンポートを公開するイングレスゲートウェイの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}"
    
  2. イングレスゲートウェイが稼働していることを確認するには、次のコマンドを実行します。

    $ 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デプロイメントも作成されていることに気付くでしょう。これは、イングレスゲートウェイの設定に使用され、リモートクラスタで使用されるコントロールプレーンではありません。

  3. 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
    

リモート設定クラスタの設定

  1. remoteプロファイルを使用して、リモートクラスタのIstioインストールを設定します。これにより、ローカルにデプロイされたインジェクタではなく、外部コントロールプレーンのインジェクタを使用するインジェクションWebhookがインストールされます。このクラスタはコンフィグクラスタとしても機能するため、リモートクラスタに必要なIstio CRDとその他のリソースは、global.configClusterpilot.configMaptrueに設定することによってもインストールされます。

    $ 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
    
  2. 適切な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
    
  3. リモートクラスタに構成をインストールします。

    $ kubectl create namespace external-istiod --context="${CTX_REMOTE_CLUSTER}"
    $ istioctl install -f remote-config-cluster.yaml --set values.defaultRevision=default --context="${CTX_REMOTE_CLUSTER}"
    
  4. リモートクラスタのインジェクション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
    
  5. リモートクラスタの検証Webhook構成がインストールされていることを確認します。

    $ kubectl get validatingwebhookconfiguration --context="${CTX_REMOTE_CLUSTER}"
    NAME                              WEBHOOKS   AGE
    istio-validator-external-istiod   1          6m53s
    istiod-default-validator          1          6m53s
    

外部クラスタへのコントロールプレーンの設定

  1. 外部コントロールプレーンをホストするために使用されるexternal-istiod名前空間を作成します。

    $ kubectl create namespace external-istiod --context="${CTX_EXTERNAL_CLUSTER}"
    
  2. 外部クラスタのコントロールプレーンは、サービス、エンドポイント、およびポッド属性を検出するためにリモートクラスタにアクセスする必要があります。リモートクラスタの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}"
    
  3. 外部クラスタの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
    
  4. 適切な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
    
  5. 外部クラスタにIstio構成を適用します。

    $ istioctl install -f external-istiod.yaml --context="${CTX_EXTERNAL_CLUSTER}"
    
  6. 外部istiodが正常にデプロイされたことを確認します。

    $ kubectl get po -n external-istiod --context="${CTX_EXTERNAL_CLUSTER}"
    NAME                      READY   STATUS    RESTARTS   AGE
    istiod-779bd6fdcf-bd6rg   1/1     Running   0          70s
    
  7. イングレスゲートウェイから外部コントロールプレーンへのトラフィックをルーティングするためのIstio GatewayVirtualService、および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
    
  8. 適切な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
    
  9. 外部クラスタに構成を適用します。

    $ kubectl apply -f external-istiod-gw.yaml --context="${CTX_EXTERNAL_CLUSTER}"
    

メッシュ管理者手順

Istioが稼働したら、メッシュ管理者は、必要に応じてゲートウェイを含むメッシュ内のサービスをデプロイおよび構成するだけで済みます。

サンプルアプリケーションのデプロイ

  1. リモートクラスタでsample名前空間を作成し、インジェクション用にラベル付けします。

    $ kubectl create --context="${CTX_REMOTE_CLUSTER}" namespace sample
    $ kubectl label --context="${CTX_REMOTE_CLUSTER}" namespace sample istio-injection=enabled
    
  2. helloworldv1)とcurlのサンプルをデプロイします。

    ZipZipZip
    $ 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}"
    
  3. helloworldcurl の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
    
  4. 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}"

必要に応じて、他のゲートウェイ(例:エグレスゲートウェイ)も有効にすることができます。

$ 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}"

イングレスゲートウェイの構成とテスト

  1. ゲートウェイを構成する準備が整っていることを確認してください。

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
  1. イングレスゲートウェイでhelloworldアプリケーションを公開します。
Zip
$ kubectl apply -f @samples/helloworld/helloworld-gateway.yaml@ -n sample --context="${CTX_REMOTE_CLUSTER}"
  1. 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
  1. イングレスゲートウェイを介してhelloworldアプリケーションにアクセスできることを確認します。

    $ curl -s "http://${GATEWAY_URL}/hello"
    Hello version: v1, instance: helloworld-v1-776f57d5f6-s7zfc
    

メッシュへのクラスタの追加(オプション)

このセクションでは、別のリモートクラスタを追加することで、既存の外部コントロールプレーンメッシュをマルチクラスタに拡張する方法を示します。これにより、サービスを容易に分散し、場所認識ルーティングとフェイルオーバーを使用してアプリケーションの高可用性をサポートできます。

External control plane with multiple remote clusters
複数のリモートクラスタを持つ外部コントロールプレーン

最初のリモートクラスタとは異なり、同じ外部コントロールプレーンに追加された2番目以降のクラスタはメッシュ構成を提供せず、プライマリリモートIstioマルチクラスタ構成のリモートクラスタと同様に、エンドポイント構成のソースのみとなります。

続行するには、メッシュの2番目のリモートクラスタとして別のKubernetesクラスタが必要です。クラスタのコンテキスト名とクラスタ名を以下の環境変数に設定します。

$ export CTX_SECOND_CLUSTER=<your second remote cluster context>
$ export SECOND_CLUSTER_NAME=<your second remote cluster name>

新しいクラスタの登録

  1. リモート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
    
  2. 適切な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
    
  3. リモートクラスタでシステム名前空間を作成し、アノテーションを付けます。

    $ 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を設定するために使用されたことに注意してください。

  4. リモートクラスタに構成をインストールします。

    $ istioctl install -f second-remote-cluster.yaml --context="${CTX_SECOND_CLUSTER}"
    
  5. リモートクラスタのインジェクションWebhook構成がインストールされていることを確認します。

    $ kubectl get mutatingwebhookconfiguration --context="${CTX_SECOND_CLUSTER}"
    NAME                                     WEBHOOKS   AGE
    istio-sidecar-injector-external-istiod   4          4m13s
    
  6. コントロールプレーンが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に設定されていることに注意してください。

東西ゲートウェイの設定

  1. 両方のリモートクラスタにイーストウエストゲートウェイを展開します。

    Zip
    $ @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 -
    
    Zip
    $ @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 -
    
  2. イーストウエストゲートウェイに外部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
    
  3. イーストウエストゲートウェイを介してサービスを公開します。

    Zip
    $ kubectl --context="${CTX_REMOTE_CLUSTER}" apply -n external-istiod -f \
        @samples/multicluster/expose-services.yaml@
    

インストールの検証

  1. リモートクラスタでsample名前空間を作成し、インジェクション用にラベル付けします。

    $ kubectl create --context="${CTX_SECOND_CLUSTER}" namespace sample
    $ kubectl label --context="${CTX_SECOND_CLUSTER}" namespace sample istio-injection=enabled
    
  2. helloworldv2)とcurlのサンプルを展開します。

    ZipZipZip
    $ 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}"
    
  3. helloworldcurl の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
    
  4. 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
    
  5. イングレスゲートウェイを介してhelloworldアプリケーションに複数回アクセスすると、バージョンv1v2の両方が呼び出されることを確認します。

    $ 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
この情報は役に立ちましたか?
改善のための提案はありますか?

ご意見ありがとうございます!