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.29 normal Addon Ready -
アドオンの各コンポーネントを表示して、Istio ポッドがデプロイされていることを確認することもできます。
kubectl get pods -n istio-systemkubectl 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.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 ``` -
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/productpageWindows
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: 10kubectl 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 ``` 2. `weight` の `v2` を `0` に、`weight` の `v3` を `100` に変更します。 3. ファイルを保存して閉じます。 -
BookInfo ページの最新表示を複数回試行します。 黒の星印のページ (
v2) は表示されなくなり、赤の星印のページ (v3) だけが表示されます。 -
Envoy アクセス・ログが有効になっている場合: レビュー
VirtualServiceの YAML ファイルを変更してから以後に、v2に対する要求のログが存在しないことを確認してください。kubectl logs -l app=reviews,version=v2 -c istio-proxy
ステップ 4: IBM Cloud Monitoring を使用した BookInfo のモニター
Monitoring にあらかじめ定義されている Istio ダッシュボードのいずれかを使用して、 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 mutual TLS のドキュメントを参照。
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 設定が、このルールでオーバーライドされないようにします。