IBM Cloud Docs
Istio の概説

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.23       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.23.5 sh -
      
    2. Istio パッケージ・ディレクトリーにナビゲートします。
      cd istio-1.23.5
      
    3. Linux および macOS ユーザー: istioctl クライアントを PATH システム変数に追加します。
      export PATH=$PWD/bin:$PATH
      
    4. 自動サイドカー注入のために default 名前空間にラベルを設定します。 これで、default にデプロイされる新規ポッドは、自動的に Envoy プロキシー・サイドカー・コンテナーと一緒に作成されるようになります。
      kubectl label namespace default istio-injection=enabled
      
    5. BookInfo アプリケーション、ゲートウェイ、宛先ルールをデプロイします。
      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 であることを確認します。
      kubectl get pods
      
      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. weightv20 に、weightv3100 に変更します。
    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 ダッシュボードの 1 つを使用して、 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の mTLS ドキュメントを参照してください。

  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 設定が、このルールでオーバーライドされないようにします。