Istio は、トラフィック管理、可観測性、セキュリティ、およびポリシー機能を提供するオープンソースのサービスメッシュです。Kubernetes と統合された Istio は、コンテナアプリケーションの管理と制御を向上させ、アプリケーションのパフォーマンス、セキュリティ、信頼性を高めるのに役立ちます。このトピックでは、VNode を使用して Elastic Container Instance (ECI) に接続された自己管理型 Kubernetes クラスターに、Istio を使用して Bookinfo アプリケーションをデプロイする方法について説明します。
背景情報
Istio は、マイクロサービス間のトラフィックを管理し、ネットワーク通信とセキュリティリスクを処理するために使用されるオープンソースのサービスメッシュプラットフォームです。Istio は Kubernetes と統合して、標準的で安全なトラフィック管理を提供し、デプロイと運用保守作業を簡素化できます。
Bookinfo は、オンライン書店の単一のカタログエントリを模倣して、書籍の説明、ISBN やページ数などの書籍の詳細、書籍に関するレビューなどの書籍情報を表示します。Bookinfo は異種混合アプリケーションであり、さまざまな Istio の特徴を実証するために、異なる言語で書かれた 4 つのマイクロサービスで構成されています。Bookinfo のエンドツーエンドアーキテクチャは次のとおりです:

Productpage:ページを生成するために Details と Reviews のマイクロサービスを呼び出す Python マイクロサービスです。Productpage マイクロサービスは、ログイン・ログオフ機能を提供します。
Details:書籍情報を含む Ruby マイクロサービスです。
Reviews:書籍のレビューを含む Java マイクロサービスです。Reviews マイクロサービスには、次の 3 つのバージョンがあります:
バージョン 1:Ratings マイクロサービスを呼び出しません。
バージョン 2:Ratings マイクロサービスを呼び出し、1 つから 5 つの黒い星で書籍を評価します。
バージョン 3:Ratings マイクロサービスを呼び出し、1 つから 5 つの赤い星で書籍を評価します。
Ratings:書籍のレビューに基づいて生成された評価を提供する Node.js マイクロサービスです。
詳細については、Istio をご参照ください。
前提条件
このトピックの説明は、自己管理型 Kubernetes クラスターに適用されます。ご利用のクラスターが次の条件を満たしていることを確認してください:
自己管理型 Kubernetes クラスターに VNode がデプロイされていること。
自己管理型 Kubernetes クラスターがデータセンターにデプロイされている場合、データセンターは Alibaba Cloud に接続されています。
自己管理型 Kubernetes クラスターが Elastic Compute Service (ECS) インスタンスにデプロイされており、ネットワークプラグインが Flannel の場合、クラスターに Kubernetes クラウドコントローラーマネージャー (CCM) がデプロイされていることを確認してください。これにより、ECI が実ノード上の Pod と相互接続されることが保証されます。詳細については、「CCM のデプロイ」をご参照ください。
事前準備
Istio をインストールします。詳細については、クイックスタートをご参照ください。
名前空間を作成し、その名前空間にラベルを設定します。
kubectl create namespace istio-test kubectl label namespace istio-test istio-injection=enabled
操作手順
Bookinfo アプリケーションのデプロイ
-
bookinfo.yaml という名前のファイルを作成し、次のテンプレートをファイルにコピーします:
説明以下の YAML サンプルコードでは、Pod を VNode にスケジュールするために nodeSelector が追加されています。eci-profile を設定して Pod を VNode にスケジュールすることもできます。詳細については、「Pod を VNode にスケジュールする」および「eci-profile を使用して Pod を VNode にスケジュールする」をご参照ください。
-
Bookinfo アプリケーションをデプロイします。
kubectl -n istio-test apply -f bookinfo.yaml次のコマンド出力が返されます:
xxx# kubectl -n istio-test apply -f bookinfo.yaml service/details created serviceaccount/bookinfo-details created deployment.apps/details-v1 created service/ratings created serviceaccount/bookinfo-ratings created deployment.apps/ratings-v1 created service/reviews created serviceaccount/bookinfo-reviews created deployment.apps/reviews-v1 created deployment.apps/reviews-v2 created deployment.apps/reviews-v3 created service/productpage created serviceaccount/bookinfo-productpage created deployment.apps/productpage-v1 created -
Bookinfo のステータスを表示します。
kubectl -n istio-test get pods -o wide次のコマンド出力が返されます:
[xxx@xxx ~]# kubectl -n istio-test get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES details-v1-5f957dd5ff-kdvpc 2/2 Running 0 14m 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> productpage-v1-85976f8df7-ht5dg 2/2 Running 0 72s 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> ratings-v1-69fb6864cf-9l7fp 2/2 Running 0 23m 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> reviews-v1-77f77b5-sssgw 2/2 Running 0 7m13s 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> reviews-v2-5b9b5676c-bcjx9 2/2 Running 0 23m 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> reviews-v3-6ff46dbb9c-kf2gl 2/2 Running 0 13m 192.168.xxx cn-qingdao.vnd-m5echu4xxx <none> <none> -
Bookinfo のマイクロサービスを確認します。
kubectl -n istio-test get services次のコマンド出力が返されます:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 10.96.1.xxx <none> 9080/TCP 25m productpage ClusterIP 10.96.2.xxx <none> 9080/TCP 25m ratings ClusterIP 10.96.1.xxx <none> 9080/TCP 25m reviews ClusterIP 10.96.1.xxx <none> 9080/TCP 25m
Istio ゲートウェイのデプロイ
bookinfo-gateway.yaml という名前のファイルを作成し、次のテンプレートをファイルにコピーします:
-
Istio ゲートウェイをデプロイします。
kubectl -n istio-test apply -f bookinfo-gateway.yaml期待される出力:
[root@xxx ~]# kubectl -n istio-test apply -f bookinfo-gateway.yaml gateway.networking.istio.io/bookinfo-gateway created virtualservice.networking.istio.io/bookinfo created -
Istio ゲートウェイを表示します。
kubectl -n istio-test get gateway次のコマンド出力が返されます:
NAME AGE bookinfo-gateway 88s
Bookinfo マイクロサービスの検証
-
Istio ゲートウェイのホストアドレスを取得します。
クラスターの種類に基づいて Istio Ingress サービスを選択します。このトピックでは、Istio Ingress サービスとして LoadBalancer を選択します。
kubectl -n istio-system get service istio-ingressgateway次のコマンド出力が返されます:
[xxx@xxx ~]# kubectl -n istio-system get service istio-ingressgateway NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.96.xxx <pending> 15021:31682/TCP,80:32247/TCP,443:31049/TCP,31400:30519/TCP,15443:31511/TCP 43m返されたメッセージの istio-ingressgateway パラメーターは、Istio Ingress Gateway のホストアドレス (
IP:Portフォーマット) を示します。このトピックでは、ホストアドレスは10.96.XX.XX:80です。 テスト Pod を作成して、Bookinfo のマイクロサービスを検証します。
test-pod.yaml という名前のファイルを作成し、次のテンプレートをファイルにコピーします:
Pod をデプロイします。
kubectl apply -f test-pod.yaml
-
テスト Pod にログインし、次のコマンドを実行して Bookinfo のマイクロサービスを検証します。
kubectl exec -it centos -- bashcurl -s http://10.96.XX.XX:80/productpage | grep -o "<title>.*</title>"10.96.xxx:80をご利用のイングレスゲートウェイの内部アドレスに置き換えてください。コマンドが<title>Simple BookStore App</title>を返した場合、Bookinfo アプリケーションは Istio イングレスゲートウェイ経由でアクセス可能です。