Istio の概説

まずは IBM Cloud® Kubernetes Service のマネージド Istio アドオンを利用してみましょう。 ここに記載している一連の手順により、BookInfo サンプル・アプリをデプロイして、Istio のいくつかのサービス・メッシュ機能を使用する方法を練習できます。

作業を開始する前に、 Istio アドオンの変更履歴 を確認し、バージョン情報を確認してください。

ステップ 1: Istio アドオンの有効化

クラスターにマネージド Istio アドオンをセットアップします。

アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  1. istioアドオンを有効にします。

    ibmcloud ks cluster addon enable istio --cluster CLUSTER_NAME_OR_ID
    
  2. マネージド Istio アドオンの状態が Addon Ready になっていることを確認します。 アドオンが使用可能な状態になるまで数分かかることがあります。

    ibmcloud ks cluster addon ls --cluster CLUSTER_NAME_OR_ID
    

    出力例

    Name            Version     Health State   Health Status
    istio           1.29       normal         Addon Ready
    
  3. アドオンの各コンポーネントを表示して、Istio ポッドがデプロイされていることを確認することもできます。

    kubectl get pods -n istio-system
    
    kubectl get svc -n istio-system
    

IBM Cloud Kubernetes Service の Istio について詳しくは、マネージド Istio アドオンについてを参照してください。

ステップ 2: BookInfo サンプル・アプリのセットアップ

BookInfo サンプル・アプリケーションには基本的な Istio 構成が含まれているので、Istio の機能をすぐに試すことができます。

以下の 4 つの BookInfo マイクロサービスがあります。

  • productpage は、details マイクロサービスと reviews マイクロサービスを呼び出して、ページに内容を取り込みます。
  • details には本の情報が含まれています。
  • ratings には、本のレビューに伴う本のランキング情報が含まれています。
  • reviews は本のレビューを含んでいて、ratings マイクロサービスを呼び出します。 reviews マイクロサービスには、以下のような複数のバージョンがあります。
    • v1ratings マイクロサービスを呼び出しません。
    • v2ratings マイクロサービスを呼び出し、1 つから 5 つまでの黒色の星印で評価を表示します。
    • v3ratings マイクロサービスを呼び出し、1 つから 5 つまでの赤色の星印で評価を表示します。

BookInfo アプリは、Istio Gateway によってパブリック IP アドレスでも既に公開されています。 BookInfo のアーキテクチャについては、「 Istio 」のドキュメントをご覧ください。

  1. クラスターに BookInfo をインストールします。

    1. 最新の Istio パッケージをダウンロードします。パッケージに、BookInfo アプリの構成ファイルが含まれています。
        curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.29.5 sh -
        ```
    2. Istio パッケージ・ディレクトリーにナビゲートします。
    ```sh {: pre}
        cd istio-1.29.5
        ```
    3. Linux および macOS ユーザー: `istioctl` クライアントを `PATH` システム変数に追加します。
    ```sh {: pre}
        export PATH=$PWD/bin:$PATH
        ```
    4. 自動サイドカー注入のために `default` 名前空間にラベルを設定します。 これで、`default` にデプロイされる新規ポッドは、自動的に Envoy プロキシー・サイドカー・コンテナーと一緒に作成されるようになります。
    ```sh {: pre}
        kubectl label namespace default istio-injection=enabled
        ```
    5. BookInfo アプリケーション、ゲートウェイ、宛先ルールをデプロイします。
    ```sh {: pre}
        kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
        kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
        kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
        ```
    6. BookInfo マイクロサービスのポッドが `Running` であることを確認します。
    ```sh {: pre}
        kubectl get pods
        ```
        ```sh {: screen}
        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
        ```
    
  2. BookInfo を公開する istio-ingressgateway ロード・バランサーのパブリック・アドレスを取得します。

    • クラシック・クラスター
      1. Istio ingress の IP アドレスを環境変数として設定します。
        export INGRESS_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
        
      2. Istio ingress のポートを環境変数として設定します。
        export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
        
      3. Istio ingress のホストとポートを使用する GATEWAY_URL 環境変数を作成します。
        export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT
        
    • VPC クラスター: Istio ingress ホスト名を使用する GATEWAY_URL 環境変数を作成します。
        export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
        ```
    
  3. GATEWAY_URL 変数に対して curl を実行し、BookInfo アプリが稼働中であることを確認します。 応答 200 は、Istio で BookInfo アプリが適切に稼働していることを意味します。

    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    
  4. ブラウザーで BookInfo Web ページを表示します。

    Mac OS または Linux

    open http://$GATEWAY_URL/productpage
    

    Windows

    start http://$GATEWAY_URL/productpage
    
  5. ページの最新表示を複数回試行します。 星印なし (v1reviews)、黒の星印 (v2)、および赤の星印 (v3) という複数の異なるバージョンのレビュー・セクションが、ラウンドロビン形式で表示されます。

Istio のルーティングの動作について詳しくは、何が起きたかを理解するを参照してください。

ステップ 3: BookInfo の段階的ロールアウトのシミュレート

アプリのリリースをシミュレートするために、BookInfo の v3 マイクロサービスの reviews を段階的にロールアウトしてみましょう。

アプリのテストが完了し、ライブ・トラフィックをアプリにダイレクトする準備が整ったら、Istio を使用して徐々にロールアウトすることができます。 例えば、まずは 10% のユーザーにリリースし、次は 20% のユーザーにリリースするというように、徐々に v3 をリリースできます。

  1. v1v2 にトラフィックの 0%、v3 にトラフィックの 90%、reviews にトラフィックの 10% を分配するように仮想サービスを構成します。

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: reviews
    spec:
      hosts:
      - reviews
      http:
      - route:
        - destination:
            host: reviews
            subset: v1
          weight: 0
        - destination:
            host: reviews
            subset: v2
          weight: 90
        - destination:
            host: reviews
            subset: v3
          weight: 10
    
    kubectl apply -f <filename>.yaml
    
  2. ブラウザーで BookInfo Web ページを表示するには、Mac OS または Linux の場合は open http://$GATEWAY_URL/productpage を実行し、Windows の場合は start http://$GATEWAY_URL/productpage を実行します。

  3. ページの最新表示を複数回試行します。 星印のないページ (v1) は表示されなくなり、ほとんどのページが最新表示されて黒色の星印 (v2) が表示されることに注意してください。赤い星印 (v3) が付いたページが表示されることはめったにありません。

  4. すべてのトラフィックが v3 だけに送信されるようにトラフィックの分配を変更します。 実際のシナリオでは、最初のトラフィックの分配は 80:20、次は 70:30 というように、最終的にすべてのトラフィックが最新バージョンだけに転送されるようになるまで、時間をかけてバージョン変更をロールアウトしていきます。

    1. reviews 仮想サービスの構成ファイルを編集します。
        kubectl edit VirtualService reviews
        ```
    2. `weight` の `v2` を `0` に、`weight` の `v3` を `100` に変更します。
    3. ファイルを保存して閉じます。
    
    
  5. BookInfo ページの最新表示を複数回試行します。 黒の星印のページ (v2) は表示されなくなり、赤の星印のページ (v3) だけが表示されます。

  6. Envoy アクセス・ログが有効になっている場合: レビュー VirtualService の YAML ファイルを変更してから以後に、v2 に対する要求のログが存在しないことを確認してください。

    kubectl logs -l app=reviews,version=v2 -c istio-proxy
    

ステップ 4: IBM Cloud Monitoring を使用した BookInfo のモニター

Monitoring にあらかじめ定義されている Istio ダッシュボードのいずれかを使用して、 BookInfo のマイクロサービスを監視します。

モニター・エージェントをクラスターにデプロイするには、以下の手順を実行します。

  1. IBM Cloud Monitoringのインスタンスをプロビジョンします

  2. クラスター内でモニター・エージェントを構成します。

  3. モニタリングコンソールで、プロビジョニングしたインスタンスの [ ダッシュボードを開く ] をクリックします。

  4. Monitoring の UI で、**「Add new dashboard」**をクリックします。

  5. Istio 」を検索し、「 Monitoring 」の定義済み Istio ダッシュボードの中から1つを選択してください。

メトリクスやダッシュボードの参照方法、 Istio の内部コンポーネントの監視、および Istio のA/Bテスト展開やカナリア展開の監視に関する詳細については、「 Kubernetes のサービスメッシュ「 Istio 」を監視する方法 」のブログ記事をご覧ください。

ステップ 5: mTLS の有効化によるクラスター内トラフィックの保護

名前空間内のワークロードの暗号化を有効にすることで、クラスター内の相互 TLS (mTLS) を実現できます。 Envoy によってクラスター内のポッド間で転送されるトラフィックが、TLS で暗号化されます。 mTLS の証明書管理は、Istio によって処理されます。 詳しくは、 Istio mutual TLS のドキュメントを参照。

  1. default.yaml という名前の認証ポリシー・ファイルを作成します。 このポリシーは、名前空間を有効範囲として、TLS で暗号化された要求のみを受け入れるようにサービス・メッシュ内のワークロードを構成します。 この名前空間にあるメッシュ内のすべてのサービスにポリシーが適用されるため、targets の指定は含まれないことに注意してください。
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "default"
    spec:
      mtls:
        mode: STRICT
    
  2. 認証ポリシーを名前空間に適用します。
    kubectl apply -f default.yaml -n NAMESPACE
    
  3. destination-mtls.yaml という名前の宛先ルール・ファイルを作成します。 このポリシーは、TLS を使用してトラフィックを送信するように、名前空間内のサービス・メッシュ・ワークロードを構成します。 host: *.local ワイルドカードによって、メッシュ内のすべてのサービスにこの宛先ルールが適用されることに注意してください。
    apiVersion: "networking.istio.io/v1beta1"
    kind: "DestinationRule"
    metadata:
      name: "destination-mtls"
    spec:
      host: "*.local"
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    
  4. 宛先ルールを適用します。
    kubectl apply -f destination-mtls.yaml -n NAMESPACE
    
  5. 他のネームスペースにあるサービスメッシュワークロードに対して mTLS を設定したい場合は、各ネームスペースでこれらの手順を繰り返してください。

宛先ルールは、別のバージョンのサービスにトラフィックを転送するなど、認証以外の理由でも使用されます。 サービス用に作成する宛先ルールにも、mode: ISTIO_MUTUAL を設定した同じ TLS ブロックが含まれている必要があります。 このブロックによって、このセクションで構成したメッシュ全体の mTLS 設定が、このルールでオーバーライドされないようにします。