Istio の概説
まずは IBM Cloud® Kubernetes Service のマネージド Istio アドオンを利用してみましょう。 ここに記載している一連の手順により、BookInfo サンプル・アプリをデプロイして、Istio のいくつかのサービス・メッシュ機能を使用する方法を練習できます。
作業を始める前に 、Istioアドオンの変更履歴 でバージョン情報を確認してください。
ステップ 1: Istio アドオンの有効化
クラスターにマネージド Istio アドオンをセットアップします。
アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
-
istio
アドオンを有効にします。ibmcloud ks cluster addon enable istio --cluster <cluster_name_or_ID>
-
マネージド 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
-
アドオンの各コンポーネントを表示して、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
マイクロサービスには、以下のような複数のバージョンがあります。v1
はratings
マイクロサービスを呼び出しません。v2
はratings
マイクロサービスを呼び出し、1 つから 5 つまでの黒色の星印で評価を表示します。v3
はratings
マイクロサービスを呼び出し、1 つから 5 つまでの赤色の星印で評価を表示します。
BookInfo アプリは、Istio Gateway によってパブリック IP アドレスでも既に公開されています。 BookInfo のアーキテクチャについては 、Istioのドキュメントをご覧ください。
-
クラスターに BookInfo をインストールします。
- 最新の Istio パッケージをダウンロードします。パッケージに、BookInfo アプリの構成ファイルが含まれています。
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.23.5 sh -
- Istio パッケージ・ディレクトリーにナビゲートします。
cd istio-1.23.5
- Linux および macOS ユーザー:
istioctl
クライアントをPATH
システム変数に追加します。export PATH=$PWD/bin:$PATH
- 自動サイドカー注入のために
default
名前空間にラベルを設定します。 これで、default
にデプロイされる新規ポッドは、自動的に Envoy プロキシー・サイドカー・コンテナーと一緒に作成されるようになります。kubectl label namespace default istio-injection=enabled
- 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
- 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
- 最新の Istio パッケージをダウンロードします。パッケージに、BookInfo アプリの構成ファイルが含まれています。
-
BookInfo を公開する
istio-ingressgateway
ロード・バランサーのパブリック・アドレスを取得します。- クラシック・クラスター
- Istio ingress の IP アドレスを環境変数として設定します。
export INGRESS_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
- Istio ingress のポートを環境変数として設定します。
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
- Istio ingress のホストとポートを使用する
GATEWAY_URL
環境変数を作成します。export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT
- Istio ingress の IP アドレスを環境変数として設定します。
- VPC クラスター: Istio ingress ホスト名を使用する
GATEWAY_URL
環境変数を作成します。export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
- クラシック・クラスター
-
GATEWAY_URL
変数に対して curl を実行し、BookInfo アプリが稼働中であることを確認します。 応答200
は、Istio で BookInfo アプリが適切に稼働していることを意味します。curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
-
ブラウザーで BookInfo Web ページを表示します。
Mac OS または Linux
open http://$GATEWAY_URL/productpage
Windows
start http://$GATEWAY_URL/productpage
-
ページの最新表示を複数回試行します。 星印なし (
v1
のreviews
)、黒の星印 (v2
)、および赤の星印 (v3
) という複数の異なるバージョンのレビュー・セクションが、ラウンドロビン形式で表示されます。
Istio のルーティングの動作について詳しくは、何が起きたかを理解するを参照してください。
ステップ 3: BookInfo の段階的ロールアウトのシミュレート
アプリのリリースをシミュレートするために、BookInfo の v3
マイクロサービスの reviews
を段階的にロールアウトしてみましょう。
アプリのテストが完了し、ライブ・トラフィックをアプリにダイレクトする準備が整ったら、Istio を使用して徐々にロールアウトすることができます。 例えば、まずは 10% のユーザーにリリースし、次は 20% のユーザーにリリースするというように、徐々に v3
をリリースできます。
-
v1
のv2
にトラフィックの 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
-
ブラウザーで BookInfo Web ページを表示するには、Mac OS または Linux の場合は
open http://$GATEWAY_URL/productpage
を実行し、Windows の場合はstart http://$GATEWAY_URL/productpage
を実行します。 -
ページの最新表示を複数回試行します。 星印のないページ (
v1
) は表示されなくなり、ほとんどのページが最新表示されて黒色の星印 (v2
) が表示されることに注意してください。赤い星印 (v3
) が付いたページが表示されることはめったにありません。 -
すべてのトラフィックが
v3
だけに送信されるようにトラフィックの分配を変更します。 実際のシナリオでは、最初のトラフィックの分配は 80:20、次は 70:30 というように、最終的にすべてのトラフィックが最新バージョンだけに転送されるようになるまで、時間をかけてバージョン変更をロールアウトしていきます。reviews
仮想サービスの構成ファイルを編集します。kubectl edit VirtualService reviews
weight
のv2
を0
に、weight
のv3
を100
に変更します。- ファイルを保存して閉じます。
-
BookInfo ページの最新表示を複数回試行します。 黒の星印のページ (
v2
) は表示されなくなり、赤の星印のページ (v3
) だけが表示されます。 -
Envoy アクセス・ログが有効になっている場合: レビュー
VirtualService
の YAML ファイルを変更してから以後に、v2
に対する要求のログが存在しないことを確認してください。kubectl logs -l app=reviews,version=v2 -c istio-proxy
ステップ 4: IBM Cloud Monitoring を使用した BookInfo のモニター
Monitoring の事前定義された Istio ダッシュボードの 1 つを使用して、 BookInfo のマイクロサービスを監視します。
モニター・エージェントをクラスターにデプロイするには、以下の手順を実行します。
-
モニタリングコンソールで、プロビジョニングしたインスタンスの 「ダッシュボードを開く」 をクリックします。
-
Monitoring の UI で、**「Add new dashboard」**をクリックします。
-
Istio
を検索し、 Monitoring の事前定義されたIstioダッシュボードから1つを選択します。
メトリックとダッシュボードの参照、Istio 内部コンポーネントの監視、Istio A/B デプロイメントとカナリア デプロイメントの監視の詳細については、 Kubernetes サービス メッシュの Istio を監視する方法に関するブログ投稿をご覧ください。
ステップ 5: mTLS の有効化によるクラスター内トラフィックの保護
名前空間内のワークロードの暗号化を有効にすることで、クラスター内の相互 TLS (mTLS) を実現できます。 Envoy によってクラスター内のポッド間で転送されるトラフィックが、TLS で暗号化されます。 mTLS の証明書管理は、Istio によって処理されます。 詳細については 、Istioの mTLS ドキュメントを参照してください。
default.yaml
という名前の認証ポリシー・ファイルを作成します。 このポリシーは、名前空間を有効範囲として、TLS で暗号化された要求のみを受け入れるようにサービス・メッシュ内のワークロードを構成します。 この名前空間にあるメッシュ内のすべてのサービスにポリシーが適用されるため、targets
の指定は含まれないことに注意してください。apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" spec: mtls: mode: STRICT
- 認証ポリシーを名前空間に適用します。
kubectl apply -f default.yaml -n <namespace>
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
- 宛先ルールを適用します。
kubectl apply -f destination-mtls.yaml -n <namespace>
- 他の名前空間のサービス・メッシュ・ワークロードの mTLS を実現するには、名前空間ごとにこの手順を繰り返します。
宛先ルールは、別のバージョンのサービスにトラフィックを転送するなど、認証以外の理由でも使用されます。 サービス用に作成する宛先ルールにも、mode: ISTIO_MUTUAL
を設定した同じ TLS ブロックが含まれている必要があります。 このブロックによって、このセクションで構成したメッシュ全体の mTLS 設定が、このルールでオーバーライドされないようにします。