カスタム Istio ゲートウェイの導入 IstioOperator

1.23 およびそれ以前のアドオンバージョンでは、 Istio が管理するアプリトラフィック用に独自のインバウンドおよびアウトバウンドゲートウェイを定義する、 IstioOperator (IOP)カスタムリソースを作成します。

デフォルトでは、クラスターの istio-ingressgateway 名前空間に 1 つの istio-system デプロイメントが作成されます。 このデプロイメントは、外部からアクセス可能な IP アドレスを持つパブリック・ロード・バランサー・サービスとして公開されます。 その後、Gateway リソースで Istio マネージド・アプリのポートを定義できます。これにより、それらのポートへのインバウンド HTTP/TCP トラフィックを listen するように istio-ingressgateway ロード・バランサーが構成されます。 さらに、1 つの istio-egressgateway がデフォルトで作成され、Istio マネージド・アプリからのアウトバウンド・トラフィックを管理するためのロード・バランサー・サービスとして公開されます。

ただし、これらのデフォルト・ゲートウェイ以外に、追加の Ingress ゲートウェイまたは Egress ゲートウェイのデプロイメントを作成することもできます。 例えば、次の理由で追加のゲートウェイを作成して、デフォルト・ゲートウェイと一緒に実行したり、デフォルト・ゲートウェイの代わりに実行したりすることができます。

  • 特定のワークロードまたは名前空間の間でトラフィック・フローを分離する
  • プライベート・ネットワーク・トラフィック用の Ingress ゲートウェイを作成する
  • ゲートウェイ・ポッド・ノード・アフィニティー、最小レプリカ、ゾーン固有のロード・バランサーなどのカスタマイズを加えてゲートウェイを変更する
  • マネージド Istio アドオンのすべてのコンポーネントに対してロールアウトされる自動バージョン更新とは別に、ゲートウェイのバージョン更新を制御する

考慮事項

始める前に、カスタム・ゲートウェイの使用に関する以下の考慮事項を確認してください。

  • マネージド Istio アドオンは、お客様が作成したカスタム・ゲートウェイの管理や調整は行いません。 これらのリソースの作成、管理、および保守は、お客様の責任で行ってください。
  • カスタムゲートウェイをデプロイした後、 kubectl logs -n ibm-operators -l name=addon-istio-operator を実行して、 Istio operator pod ログに構文エラーがないか確認します。 Istio オペレーターは、ユーザーが IstioOperator (IOP)に対して行った変更を検証し、整合性を確保します。
  • さらに、istio-global-proxy-accessLogFile 構成マップmanaged-istio-custom オプションが "/dev/stdout" に設定されていることを確認します。 Envoy プロキシーは、アクセス情報を標準出力に出力します。これは、Envoy コンテナーに対して kubectl logs コマンドを実行することで表示できます。

パブリック・トラフィック用のカスタム Ingress ゲートウェイの作成

IstioOperator (IOP) を使用して、custom-gateways 名前空間にカスタム Ingress ゲートウェイ・デプロイメントおよびパブリック・ロード・バランサー・サービスを作成します。

  1. Istio アドオンをインストールします

  2. カスタム Ingress ゲートウェイの名前空間を作成します。

    kubectl create namespace custom-gateways
    
  3. custom-ingress-iop.yaml (IOP) リソース用に IstioOperator という名前の YAML ファイルを作成します。 カスタム・ゲートウェイ・ポッドが特定のバージョンのマネージド Istio を実行するように強制するには、tag フィールドにバージョンを指定します。 詳しくは、カスタム・ゲートウェイの更新およびバージョンの制御を参照してください。

    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    metadata:
      namespace: ibm-operators
      name: custom-ingressgateway-iop
    spec:
      profile: empty
      hub: icr.io/ext/istio
      # tag: 1.29.5
      components:
        ingressGateways:
          - name: custom-ingressgateway
            label:
              istio: custom-ingressgateway
            namespace: custom-gateways
            enabled: true
            k8s:
              serviceAnnotations:
                service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
    
  4. クラスター内に IstioOperator (IOP) リソースを作成します。 ibm-operators 名前空間内のマネージド Istio 演算子は、IOP リソースを使用して、Ingress ゲートウェイをパブリック・ロード・バランサー・サービスとともに custom-gateways 名前空間内にデプロイして公開します。

    kubectl apply -f ./custom-ingress-iop.yaml
    
  5. Ingress ゲートウェイのデプロイメントとサービスが custom-gateways 名前空間内に作成されていることを確認します。

    kubectl get deploy,svc -n custom-gateways
    

    出力例

    NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/custom-ingressgateway   1/1     1            1           4m53s
    NAME                            TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                                                                                                                                      AGE
    service/custom-ingressgateway   LoadBalancer   172.21.98.120   52.117.68.222   15020:32656/TCP,80:30576/TCP,443:32689/TCP,15029:31885/TCP,15030:30198/TCP,15031:32637/TCP,15032:30869/TCP,31400:30310/TCP,15443:31698/TCP   4m53s
    
  6. service/custom-ingressgateway ロード・バランサーの出力にある、EXTERNAL-IP 列の IP アドレス (クラシック・クラスターの場合) またはホスト名 (VPC クラスターの場合) をメモしておきます。

続いて、この Ingress ゲートウェイ・ロード・バランサーの名前 custom-ingressgateway を、Istio マネージド・アプリのポートを定義する Gateway リソース内で指定することができます。 その後、その Gateway の名前を、サービス・メッシュ内のマイクロサービスのパスを定義する VirtualService リソース内で指定できます。 カスタム・ゲートウェイ・ロード・バランサーとともに Gateway および VirtualService を使用する例については、 BookInfo サンプル・アプリをお試しください。

BookInfo サンプルのセットアップ

Istio 用の BookInfo サンプルアプリケーションをデプロイし、カスタムインジェスゲートウェイのロードバランサーへのアクセスをテストします。

  1. bookinfo ネームスペースを作成し、 自動サイドカー注入のためにそのネームスペースにラベルを付けます。
    kubectl create namespace bookinfo
    kubectl label namespace bookinfo istio-injection=enabled
    
  2. BookInfo サンプル・アプリをデプロイします。 <version> を、管理対象 Istio アドオンが実行される major.minor バージョンで置き換えます。これを見つけるには、ibmcloud ks cluster addon ls -c <cluster_name_or_ID> を実行してください。
    kubectl apply -n bookinfo -f https://raw.githubusercontent.com/istio/istio/release-<version>/samples/bookinfo/platform/kube/bookinfo.yaml
    
  3. BookInfo マイクロサービスとその対応するポッドがデプロイされていることを確認します。
    kubectl get svc -n bookinfo
    
    NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)          AGE
    details                   ClusterIP      172.21.19.104    <none>         9080/TCP         2m
    kubernetes                ClusterIP      172.21.0.1       <none>         443/TCP          1d
    productpage               ClusterIP      172.21.168.196   <none>         9080/TCP         2m
    ratings                   ClusterIP      172.21.11.131    <none>         9080/TCP         2m
    reviews                   ClusterIP      172.21.117.164   <none>         9080/TCP         2m
    
    kubectl get pods -n bookinfo
    
    NAME                                     READY     STATUS      RESTARTS   AGE
    details-v1-6865b9b99d-7v9h8              2/2       Running     0          2m
    productpage-v1-f8c8fb8-tbsz9             2/2       Running     0          2m
    ratings-v1-77f657f55d-png6j              2/2       Running     0          2m
    reviews-v1-6b7f6db5c5-fdmbq              2/2       Running     0          2m
    reviews-v2-7ff5966b99-zflkv              2/2       Running     0          2m
    reviews-v3-5df889bcff-nlmjp              2/2       Running     0          2m
    
  4. YAML ファイルを bookinfo-custom-gateway.yaml という名前で作成して、Gateway リソースと VirtualService リソースを定義します。 Gateway リソースでは前に作成したカスタム Ingress ロード・バランサーの名前として custom-ingressgateway を指定し、VirtualService リソースでは bookinfo-gateway リソースの名前として Gateway を指定することに注意してください。
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: custom-ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: bookinfo
    spec:
      hosts:
      - "*"
      gateways:
      - bookinfo-gateway
      http:
      - match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
        route:
        - destination:
            host: productpage
            port:
              number: 9080
    
  5. クラスター内に Gateway リソースと VirtualService リソースを作成します。
    kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
    
  6. 前のセクションで見つけた service/custom-ingressgateway ロード・バランサーの IP アドレス (クラシックの場合) またはホスト名 (VPC の場合) を使用して、BookInfo アプリの製品ページをブラウザーで開きます。
    http://<IP_OR_HOSTNAME>/productpage
    

これで、カスタム Ingress ゲートウェイ・ロード・バランサーは、Gateway リソース内のポートと VirtualService リソース内のマイクロサービス・パスを使用して、BookInfo アプリにトラフィックを経路指定するようになりました。 次は、オプションで、カスタム・ゲートウェイ・ロード・バランサーの DNS レコードを作成することができます。

IBM 提供のサブドメインを使用した BookInfo の公開 (TLS 使用)

IBM 提供のサブドメインを作成して、カスタム・ゲートウェイ・ロード・バランサーの IP アドレス (クラシックの場合) またはホスト名 (VPC 場合) を DNS レコードに登録します。 サブドメイン用に生成される TLS 証明書により、BookInfo アプリへの HTTPS 接続が可能となります。

  1. DNS サブドメインを作成することにより、カスタム・ゲートウェイ・ロード・バランサーの IP アドレスまたはホスト名を登録します。 TLS シークレットには custom-gateway 名前空間を指定します。

    • クラシック・クラスター
        ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> --secret-namespace custom-gateways
        ```
    * VPC クラスター
    ```sh {: pre}
        ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> --secret-namespace custom-gateways
        ```
    
  2. サブドメインが作成されたことを確認します。

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    

    クラシック・クラスターの出力例

    Hostname                                                                                IP(s)              Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      None             created                   <certificate>
    

    VPC クラスターの出力例

    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>
    
  3. サブドメインのシークレットの名前を取得します。

    kubectl get secret -n custom-gateways
    

    出力例

    mycluster-af23f234rwr3asdfasdf-002   kubernetes.io/tls                     2      15m
    
  4. 前のセクションで作成した bookinfo-custom-gateway.yaml で、HTTPS ポート 443 と、サブドメインのシークレットを指定する TLS セクションを追加することにより、bookinfo-gateway Gateway リソースを変更します。

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: custom-ingressgateway
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: mycluster-af23f234rwr3asdfasdf-002 # secret name
        hosts:
        - "*"
    ---
    ...
    
  5. 変更した Gateway リソースをクラスター内に作成します。

    kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
    
  6. Web ブラウザーで、BookInfo 製品ページを開きます。 手順 2 で確認したサブドメインに HTTPS を使用していることを確認します。

    https://<subdomain>/productpage
    

プライベート・ネットワーク・トラフィック用のカスタム Ingress ゲートウェイの作成

カスタム Ingress ゲートウェイ・デプロイメントを作成し、それをプライベート・ロード・バランサー・サービスで公開するには、パブリック・トラフィック用のカスタム Ingress ゲートウェイを作成にある手順に従います。 ステップ 3 で IOP を作成するときは、public ではなく service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private アノテーションを指定します。

次の考慮事項に注意してください。

  • クラシック・クラスターがプライベート VLAN にのみ接続されている場合、または VPC クラスターでプライベートクラウド・サービス・エンドポイントのみが有効になっている場合は、IOP を適用すると、デフォルトでプライベート・ロード・バランサーが作成されます。
  • クラシック・クラスターに限っては、ibmcloud ks nlb-dns create classic を使用してカスタム・ゲートウェイ・ロード・バランサーの IP アドレスに対して DNS レコードや IBM 提供のサブドメインを作成することはできません。

カスタム・ゲートウェイの更新とバージョンの管理

カスタム Ingress ゲートウェイのマネージド Istio バージョンを手動で更新および制御します。

IBM Cloud が、IBM Cloud Kubernetes Service でサポートされる最新バージョンの Istio へのパッチの更新を自動的にロールアウトして、すべての Istio コンポーネントを最新に保ちます。 たとえば、パッチバージョン 1.29.5 がリリースされると、すべてのIngressゲートウェイポッドが自動的にこの最新のパッチバージョンに更新されます。 パッチ・バージョンは、アプリのダウン時間を回避するために、ローリング更新ストラテジーを使用して更新されます。 ただし、最新のパッチ・バージョンでの潜在的な回帰を検査する場合などは、カスタム・ゲートウェイ・ポッドの自動更新を回避することができます。

カスタム Ingress ゲートウェイの更新を管理するために、以下のロールアウト・ストラテジーを使用できます。

  1. カスタム Ingress ゲートウェイの IOP を作成しますtag フィールドに、コントロール・プレーン・バージョンと同じかそれより前のパッチ・バージョンを指定します。 コントロール・プレーンのバージョンは、istioctl version を実行して見つけることができます。
  2. マネージド Istio アドオンの新しいパッチ・バージョンがリリースされたら、1 つのカスタム・ゲートウェイの IOP YAML ファイルに最新のパッチ・バージョンを使用するための編集を加え、クラスターでその IOP を再適用します。
  3. カスタム・ゲートウェイのポッドが最新のパッチに更新されたら、カスタム・ゲートウェイに対するすべての変更をテストします。
  4. 変更に問題がなければ、残りのカスタム・ゲートウェイの構成を変更して、最新のパッチに更新します。

タグには、使用している Istio アドオンのコントロール・プレーン・バージョンより後のバージョンを設定しないでください。

バージョンがリリースされた後、できるだけ早くカスタム・ゲートウェイ・ポッドを更新してください。 古いバージョンを実行しているカスタム・ゲートウェイは、セキュリティーの脆弱性にさらされるおそれがあります。

追加のゲートウェイのカスタマイズ

カスタム Ingress ゲートウェイは、特定ゾーンへのゲートウェイ・ロード・バランサーのデプロイ、ゲートウェイ・ポッド・レプリカの最小数の指定、エッジ・ノードへのカスタム・ゲートウェイ・ポッドのスケジューリング、安全なシャットダウンのための preStop ライフサイクル・フックの追加、アンチアフィニティーとワーカー・ノード・アフィニティーの指定などのカスタマイズを追加して構成できます。

次の IOP YAML ファイルには、これらの追加カスタマイズの例が含まれています。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: ibm-operators
  name: custom-ingressgateway-iop
spec:
  profile: empty
  hub: icr.io/ext/istio
  # tag: 1.29.5 # Force the gateway to a specific managed Istio version
  components:
    ingressGateways:
      - name: custom-ingressgateway
        label:
          istio: custom-ingressgateway
        namespace: custom-gateways
        enabled: true
        k8s:
          serviceAnnotations:
            service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
            service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" # Deploy the load balancer to a specific zone in your cluster
          hpaSpec: # Specify the minimum number of pod replicas
            minReplicas: 2
          tolerations: # Schedule the custom gateway pods onto edge nodes
          - key: dedicated
            value: edge
          env:
          - name: TERMINATION_DRAIN_DURATION
            value: 30s
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - istio-ingressgateway
                  topologyKey: kubernetes.io/hostname
                weight: 100
            nodeAffinity: # Example node affinities to control the zone or the edge
              preferredDuringSchedulingIgnoredDuringExecution: # Could be requiredDuringSchedulingIgnoredDuringExecution instead
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ibm-cloud.kubernetes.io/zone
                    operator: In
                    values:
                    - "dal12" # Deploy the load balancer to a specific zone in your cluster
              preferredDuringSchedulingIgnoredDuringExecution:
              - preference:
                  matchExpressions:
                  - key: dedicated
                    operator: In
                    values:
                    - edge
                weight: 100

カスタム Egress ゲートウェイの作成

バージョン 1.8 またはそれより後のマネージド Istio アドオンでは、カスタム Egress ゲートウェイを作成できます。 Egress ゲートウェイは、サービス・メッシュ内のアプリから外部の宛先へのすべてのアウトバウンド・トラフィックの出口点として機能します。

例えば、カスタム Egress ゲートウェイを作成するには、クラスター内の IOP に対して以下の YAML ファイルを適用できます。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: ibm-operators
  name: custom-egressgateway-iop
spec:
  profile: empty
  hub: icr.io/ext/istio
  # tag: 1.29.5 # Force the Gateway to a specific version
  components:
    egressGateways:
      - name: custom-egressgateway
        label:
          istio: custom-egressgateway
        namespace: custom-gateways
        enabled: true

カスタムエグレスゲートウェイの設定および使用方法の詳細については、『 Istio 』のオープンソースドキュメントを参照してください。

デフォルト・ゲートウェイの無効化

カスタム・ゲートウェイの作成後にデフォルトの istio-ingressgateway デプロイメントや istio-egressgateway デプロイメントが不要になった場合は、オプションでそれらを無効にできます。

アプリにクライアントからアクセスできるようにする場合は、少なくとも 1 つのゲートウェイ・ロード・バランサーが有効になっていて、トラフィックをアプリに経路指定するように構成されていることを確認してください。 すべてのゾーンでデフォルト・ゲートウェイ・ロード・バランサーを無効にすると、アプリは公開されなくなり外部からアクセス不可となります。

  1. managed-istio-custom 構成マップ・リソースを編集します。

    kubectl edit cm managed-istio-custom -n ibm-operators
    
  2. istio-ingressgateway-public-1|2|3-enabled フィールドを "false" に設定して、デフォルトの Ingress ゲートウェイを使用不可にします。

    istio-ingressgateway-public-1-enabled: "false"
    istio-ingressgateway-public-2-enabled: "false"
    istio-ingressgateway-public-3-enabled: "false"
    
  3. デフォルトの Egress ゲートウェイを使用不可にするには、istio-egressgateway-public-1-enabled: "false" フィールドを追加します。

    istio-egressgateway-public-1-enabled: "false"
    
  4. 構成ファイルを保存して閉じます。

  5. デフォルトのゲートウェイ・サービスが削除されていることを確認します。

    kubectl get svc -n istio-system