サービス・メッシュでのアプリの管理および公開
クラスターに Istio アドオンをインストールした後、Envoy プロキシー・サイドカー注入をセットアップし、サブドメインでアプリを公開することによって、Istio サービス・メッシュにアプリをデプロイすることができます。
BookInfo サンプル・アプリについて
BookInfo のIstioサンプルアプリケーションには、基本的なデモ設定とデフォルトのデスティネーションルールが含まれているため、すぐにIstioの機能を試すことができます。
Istio バージョン 1.4 以降では、BookInfo はマネージド・アドオンとして提供されていないため、別途インストールする必要があります。 BookInfo をインストールする場合は、BookInfo サンプル・アプリのセットアップを参照してください。
以下の 4 つの BookInfo マイクロサービスがあります。
productpage
は、details
マイクロサービスとreviews
マイクロサービスを呼び出して、ページに内容を取り込みます。details
には本の情報が含まれています。ratings
には、本のレビューに伴う本のランキング情報が含まれています。reviews
は本のレビューを含んでいて、ratings
マイクロサービスを呼び出します。reviews
マイクロサービスには、以下のような複数のバージョンがあります。v1
はratings
マイクロサービスを呼び出しません。v2
はratings
マイクロサービスを呼び出し、1 つから 5 つまでの黒色の星印で評価を表示します。v3
はratings
マイクロサービスを呼び出し、1 つから 5 つまでの赤色の星印で評価を表示します。
これらのマイクロサービスそれぞれのデプロイメント YAML は、それらがデプロイされる前に Envoy サイドカー・プロキシーがマイクロサービスのポッドにコンテナーとして事前注入されるように、変更されています。 手動サイドカーインジェクションの詳細については 、Istioのドキュメントを参照してください。 BookInfo アプリは、Istio Gateway によってパブリック IP アドレスでも既に公開されています。 BookInfo アプリは始めるのに役立ちますが、実動用ではありません。
BookInfo サンプル・アプリのセットアップ
- クラスターに BookInfo をインストールします。 オペレーティング・システムに合った最新の Istio パッケージをダウンロードします。パッケージに、BookInfo アプリの構成ファイルが含まれています。
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.23.5 sh -
- Istio パッケージ・ディレクトリーにナビゲートします。
cd istio-1.23.5
- 自動サイドカー注入のために
default
名前空間にラベルを設定します。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 マイクロサービスとその対応するポッドがデプロイされていることを確認します。
kubectl get svc kubectl get pods
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 172.21.19.104 <none> 9080/TCP 2m kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 1d productpage ClusterIP 172.21.168.196 <none> 9080/TCP 2m ratings ClusterIP 172.21.11.131 <none> 9080/TCP 2m reviews ClusterIP 172.21.117.164 <none> 9080/TCP 2m 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 へのパブリック・アクセス
BookInfo を公開する istio-ingressgateway
ロード・バランサーのパブリック・アドレスを取得します。
クラシック・クラスターでのゲートウェイ URL の作成
- Istio ingress ホストを設定します。
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
GATEWAY_URL
変数に対して curl を実行し、BookInfo アプリが稼働中であることを確認します。 応答200
は、Istio で BookInfo アプリが適切に稼働していることを意味します。curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
- ページの最新表示を複数回試行します。 さまざまなバージョンのレビュー・セクションが、赤い星形、黒い星形、星形なしの間でラウンドロビンします。
VPC クラスターでのゲートウェイ URL の作成
- 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 ページの表示
ブラウザーで BookInfo アプリを表示するには、オペレーティング・システムに応じて以下のコマンドを実行します。
Mac OS または Linux
open http://$GATEWAY_URL/productpage
Windows
start http://$GATEWAY_URL/productpage
ページの最新表示を複数回試行します。 さまざまなバージョンのレビュー・セクションが、赤い星形、黒い星形、星形なしの間でラウンドロビンします。
IBM 提供のサブドメインを使用した BookInfo の公開 (TLS 不使用)
クラスター内で BookInfo アドオンを有効にすると、Istio ゲートウェイ bookinfo-gateway
が自動的に作成されます。 このゲートウェイは、Istio の仮想サービス・ルールと宛先ルールを使用して、BookInfoアプリをパブリックに公開するロード・バランサー istio-ingressgateway
を構成します。 以下の手順では、istio-ingressgateway
ロード・バランサーの IP アドレス (クラシック・クラスターの場合) またはホスト名 (VPC クラスターの場合) のサブドメインを作成します。このサブドメインを通じて BookInfo にパブリック・アクセスできます。
- DNS サブドメインを作成して、
istio-ingressgateway
ロード・バランサーの IP アドレス (クラシック・クラスターの場合) またはホスト名 (VPC クラスターの場合) を登録します。- クラシック:
ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --cluster <cluster_name_or_id>
- VPC:
ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --cluster <cluster_name_or_id>
- クラシック:
- サブドメインが作成されたことを確認し、サブドメインをコピーします。
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
クラシック・クラスターの出力例
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name
mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>
VPC クラスターの出力例
Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name
mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate>
Web ブラウザーで、BookInfo 製品ページを開きます。 TLS は構成されていないので、HTTP を使用してください。
http://<subdomain>/productpage
ページの最新表示を複数回試行します。 http://<subdomain>/productpage
に対する要求は Istio ゲートウェイ・ロード・バランサーによって受信されます。 Istio ゲートウェイはマイクロサービス用の仮想サービス・ルールと宛先ルーティング・ルールを管理するため、依然として複数の異なるバージョンの reviews
マイクロサービスがランダムに返されます。
IBM 提供のサブドメインを使用した BookInfo の公開 (TLS 使用)
クラスター内で BookInfo アドオンを有効にすると、Istio ゲートウェイ bookinfo-gateway
が自動的に作成されます。 このゲートウェイは、Istio の仮想サービス・ルールと宛先ルールを使用して、BookInfoアプリをパブリックに公開するロード・バランサー istio-ingressgateway
を構成します。 以下の手順では、istio-ingressgateway
ロード・バランサーの IP アドレス (クラシック・クラスターの場合) またはホスト名 (VPC クラスターの場合) のサブドメインを作成します。このサブドメインを通じて BookInfo にパブリック・アクセスできます。 また、SSL 証明書を使用して、BookInfo アプリへの HTTPS 接続を可能にすることもできます。
-
DNS サブドメインを作成して、
istio-ingressgateway
ロード・バランサーの IP アドレス (クラシック・クラスターの場合) またはホスト名 (VPC クラスターの場合) を登録します。- クラシック:
ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --secret-namespace istio-system --cluster <cluster_name_or_id>
- VPC:
ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --secret-namespace istio-system --cluster <cluster_name_or_id>
- クラシック:
-
サブドメインが作成されていることを確認し、SSL Cert Secret Name フィールドの SSL シークレットの名前をメモします。
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
クラシック・クラスターの出力例。
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>
VPC クラスターの出力例
Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate>
TLS 終端処理を使用するための bookinfo-gateway の構成
以下の手順を実行して、bookinfo-gateway
の TLS 終端処理をセットアップします。
- TLS 接続を処理するように構成されていない既存の
bookinfo-gateway
を削除します。kubectl delete gateway bookinfo-gateway
- TLS 終端処理を使用する新しい
bookinfo-gateway
構成ファイルを作成します。 以下の YAML ファイルをbookinfo-gateway.yaml
として保存します。<secret_name>
を、事前に検出した SSL シークレットの名前で置き換えます。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: ingressgateway servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: <secret_name> hosts: - "*"
- クラスターに新しい
bookinfo-gateway
を作成します。kubectl apply -f bookinfo-gateway.yaml
- Web ブラウザーで、BookInfo 製品ページを開きます。 手順 2 で確認したサブドメインに HTTPS を使用していることを確認します。
https://<subdomain>/productpage
- ページの最新表示を複数回試行します。
https://<subdomain>/productpage
に対する要求は Istio ゲートウェイ・ロード・バランサーによって受信されます。 Istio ゲートウェイはマイクロサービス用の仮想サービス・ルールと宛先ルーティング・ルールを管理するため、依然として複数の異なるバージョンのreviews
マイクロサービスがランダムに返されます。
何が起きたかを理解する
BookInfo サンプルは、Istio のトラフィック管理コンポーネントの 3 つがどのように連携して受信トラフィックをアプリにルーティングするかを示すデモ用サンプルです。
Gateway
bookinfo-gateway
ゲートウェイは、istio-system
ネームスペース内のistio-ingressgateway
サービスであるロードバランサーについて説明しています。このロードバランサーは、 BookInfo への受信 HTTP /TCP トラフィックのエントリーポイントとして機能します。 Istio は、ゲートウェイ構成ファイル内に定義されたポート上で Istio マネージド・アプリに対する着信要求を listen するようにロード・バランサーを構成します。 BookInfo ゲートウェイの構成ファイルを調べるには、次のコマンドを実行します。
kubectl get gateway bookinfo-gateway -o yaml
VirtualService
bookinfo
は、 VirtualService マイクロサービスをdestinations
として定義することで、サービスメッシュ内でリクエストがどのようにルーティングされるかを制御するルールを定義します。bookinfo
仮想サービスでは、要求の/productpage
URI はポートproductpage
上の9080
ホストにルーティングされます。 このように、BookInfo アプリに対する要求はすべて、まずproductpage
マイクロサービスにルーティングされ、そこで BookInfo の他のマイクロサービスが呼び出されます。 仮想サービス・ルールを表示するには、以下のコマンドを実行します。
kubectl get virtualservice bookinfo -o yaml
DestinationRule
- ゲートウェイが仮想サービスルールに従ってリクエストをルーティングした後、
details
、productpage
、ratings
、reviews
は DestinationRules マイクロサービスにリクエストが到達した際に適用されるポリシーを定義します。 例えば、BookInfo 製品ページを最新表示すると表示が変わるのは、異なるバージョン (productpage
、v1
、v2
) のv3
マイクロサービスをランダムに呼び出すreviews
マイクロサービスの結果です。 これらのバージョンはランダムに選択されます。これは、reviews
宛先ルールでマイクロサービスのsubsets
(名前付きバージョン) に均等な重みが与えられているためです。 これらのサブセットは、特定のバージョンのサービスにトラフィックがルーティングされるときに仮想サービス・ルールによって使用されます。 BookInfo に適用される宛先ルールを調べるには、次のコマンドを実行します。
kubectl describe destinationrules
sidecar インジェクションのセットアップによる Istio サービス・メッシュへのアプリの組み込み
Istio を使用して独自のアプリを管理する準備ができましたか? アプリをデプロイする前に、まず、アプリ・ポッドに Envoy プロキシー・サイドカーを注入する方法を決める必要があります。
各アプリ・ポッドは、マイクロサービスがサービス・メッシュに含まれるように Envoy プロキシー・サイドカーを実行し続けていなければなりません。 各アプリ・ポッドへのサイドカーの注入は、自動的に行われるようにすることも、手動で行うこともできます。 サイドカーインジェクションの詳細については 、Istioのドキュメントを参照してください。
自動サイドカー注入の有効化
自動サイドカー注入を有効にすると、名前空間によって新規デプロイメントの有無が listen されて、ポッド・テンプレート仕様が自動的に変更されて、Envoy プロキシー・サイドカー・コンテナーを使用してアプリ・ポッドが作成されるようになります。 Istio と統合する複数のアプリをある名前空間にデプロイする場合は、その名前空間に対して自動サイドカー注入を有効にします。 Istio マネージド・アドオンでは、どの名前空間に対しても自動サイドカー注入はデフォルトで有効にはなりません。
kube-system
、ibm-system,
、または ibm-operators
名前空間のサイドカー注入を有効にしないでください。
名前空間に対して自動サイドカー注入を有効にするには、以下のようにします。
-
Istio マネージド・アプリをデプロイする名前空間の名前を取得します。
kubectl get namespaces
-
名前空間に
istio-injection=enabled
というラベルを設定します。kubectl label namespace <namespace> istio-injection=enabled
-
ラベル付き名前空間にアプリをデプロイするか、その名前空間に既に存在するアプリを再デプロイします。
kubectl apply <myapp>.yaml --namespace <namespace>
-
オプション その名前空間にアプリを再デプロイするには、アプリ・ポッドを削除して、注入されるサイドカーとともに再デプロイされるようにします。
kubectl delete pod -l app=<myapp>
-
アプリを公開するためのサービスを作成していない場合は、Kubernetes サービスを作成します。 Istio サービス・メッシュ内にマイクロサービスとして含める Kubernetes サービスによってアプリが公開されなければなりません。 ポッドとサービスの Istio 要件に従っていることを確認してください。
-
アプリ用のサービスを定義します。
apiVersion: v1 kind: Service metadata: name: myappservice spec: selector: <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs. ports: - protocol: TCP port: 8080 # The port that the service listens on
-
クラスター内にサービスを作成します。 アプリと同じ名前空間にサービスがデプロイされるようにします。
kubectl apply -f myappservice.yaml -n <namespace>
これで、Istio サービス・メッシュにアプリ・ポッドが組み込まれました。アプリ・ポッドではアプリ・コンテナーとともに Istio サイドカー・コンテナーが実行されるからです。
サイドカーの手動注入
名前空間でのサイドカーの自動注入を有効にしない場合は、デプロイメント YAML にサイドカーを手動で注入できます。 サイドカーを自動的に注入させたくない他のデプロイメントとともに名前空間でアプリが実行されている場合は、サイドカーを手動で注入します。
kube-system
、ibm-system,
、または ibm-operators
名前空間のサイドカー注入を有効にしないでください。
istioctl
クライアントをダウンロードします。curl -L https://istio.io/downloadIstio | sh -
- Istio パッケージ・ディレクトリーにナビゲートします。
cd istio-1.23.5
手動でデプロイメントにサイドカーを注入するには、以下のようにします。
-
アプリ・デプロイメント YAML に Envoy サイドカーを注入します。
istioctl kube-inject -f <myapp>.yaml | kubectl apply -f -
-
アプリをデプロイします。
kubectl apply <myapp>.yaml
-
アプリを公開するためのサービスを作成していない場合は、Kubernetes サービスを作成します。 Istio サービス・メッシュ内にマイクロサービスとして含める Kubernetes サービスによってアプリが公開されなければなりません。 ポッドとサービスの Istio 要件に従っていることを確認してください。
-
アプリ用のサービスを定義します。
apiVersion: v1 kind: Service metadata: name: myappservice spec: selector: <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs. ports: - protocol: TCP port: 8080 # The port that the service listens on.
-
クラスター内にサービスを作成します。 アプリと同じ名前空間にサービスがデプロイされるようにします。
kubectl apply -f myappservice.yaml -n <namespace>
これで、Istio サービス・メッシュにアプリ・ポッドが組み込まれました。アプリ・ポッドではアプリ・コンテナーとともに Istio サイドカー・コンテナーが実行されるからです。
パブリック Istio ロード・バランサーの有効化または無効化
デフォルトでは、1 つのパブリック Istio ロード・バランサー istio-ingressgateway
がクラスター内で有効になり、インターネットからの着信要求が Istio マネージド・アプリにロード・バランシングされます。 クラスターの各ゾーン内で Istio ロード・バランサーを有効にすることにより、高可用性を実現できます。
-
managed-istio-custom
構成マップ・リソースを編集します。kubectl edit cm managed-istio-custom -n ibm-operators
-
すべてのクラスター・ゾーンが
istio-ingressgateway-zone
フィールドにあることを確認します。ダラスの複数ゾーンのクラシック・クラスターの例:
istio-ingressgateway-zone-1: "dal10" istio-ingressgateway-zone-2: "dal12" istio-ingressgateway-zone-3: "dal13"
-
istio-ingressgateway-public-1|2|3-enabled
フィールドを"true"
または"false"
に設定することにより、各ゾーン内の Istio ロード・バランサーを有効または無効にします。クライアントがアプリにアクセスできるようにするには、少なくとも 1 つのロード・バランサーが有効になっていることを確認するか、カスタム・ゲートウェイ・ロード・バランサーを作成します。 すべてのゾーンですべてのロード・バランサーを無効にすると、アプリは公開されなくなり外部からアクセス不可となります。
各ゾーン内のパブリック・ゲートウェイを有効にする例:
istio-ingressgateway-public-1-enabled: "true" istio-ingressgateway-public-2-enabled: "true" istio-ingressgateway-public-3-enabled: "true"
-
構成ファイルを保存して閉じます。
-
新しい
istio-ingressgateway
ロード・バランサー・サービスが作成されていることを確認します。kubectl get svc -n istio-system
istio-ingressgateway
ロード・バランサー・サービスを使用して Istio マネージド・アプリを公開するには、istio: ingressgateway
リソースで Gateway
セレクターを指定します。 詳しくは、Istio マネージド・アプリの公開を参照してください。
DNS を使用した Istio Ingress ゲートウェイの公開
istio-ingressgateway
ロード・バランサーの DNS 項目を作成し、トラフィックをアプリに転送するようにロード・バランサーを構成することで、Istio マネージド・アプリを公開します。
以下のステップでは、以下のリソースを作成して、ユーザーがアプリにアクセスするときに使用するサブドメインをセットアップします。
- ゲートウェイ
my-gateway
。 このゲートウェイはアプリへのパブリック・エントリー・ポイントとして機能し、既存のistio-ingressgateway
ロード・バランサー・サービスを使用してアプリを公開します。 必要に応じて、TLS 終端処理を行うようにゲートウェイを構成できます。 - 仮想サービス
my-virtual-service
。my-gateway
は、my-virtual-service
で定義されたルールを使用して、トラフィックをアプリにルーティングします。 istio-ingressgateway
ロード・バランサーのサブドメイン。 このサブドメイン宛てのすべてのユーザー要求は、定義したmy-virtual-service
ルーティング・ルールに従って、アプリに転送されます。
DNS を使用した Istio Ingress ゲートウェイの公開 (TLS 終端処理なし)
- クラスターに
istio
マネージド・アドオンをインストールします。 istioctl
CLI をインストールします。- アプリ・マイクロサービス用にサイドカー注入をセットアップし、そのアプリ・マイクロサービスを名前空間にデプロイし、そのアプリ・マイクロサービスに Kubernetes サービスを作成して、Istio サービス・メッシュ内に配置します。
アプリをパブリックに公開するには、以下のようにします。
-
パブリック
istio-ingressgateway
ロード・バランサー・サービスを使用して HTTP 用のポート 80 を公開するゲートウェイを作成します。<namespace>
を、Istio 管理対象マイクロサービスがデプロイされている名前空間で置き換えます。 ゲートウェイYAMLコンポーネントの詳細については 、Istioのリファレンスドキュメントを参照してください。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: my-gateway spec: selector: app: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
-
Istio マネージド・マイクロサービスがデプロイされている名前空間にゲートウェイを適用します。
kubectl apply -f my-gateway.yaml -n <namespace>
-
my-gateway
ゲートウェイを使用するとともにアプリ・マイクロサービスのためのルーティング・ルールを定義する仮想サービスを作成します。80
とは異なるポートでマイクロサービスが listen する場合は、そのポートを追加してください。 仮想サービスYAMLコンポーネントの詳細については 、Istioのリファレンスドキュメントを参照してください。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: my-virtual-service namespace: <namespace> # The namespace where your Istio-managed microservices are deployed. spec: gateways: - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer. hosts: - '*' http: - match: - uri: exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`. route: - destination: host: <service_name> # Replace `service_name` with the name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices. port: number: 80 # If your microservice listens on a different port, replace `80` with the port.
-
Istio マネージド・マイクロサービスがデプロイされている名前空間に仮想サービス・ルールを適用します。
kubectl apply -f my-virtual-service.yaml -n <namespace>
-
** パブリック・ロード・バランサーの **EXTERNAL-IP
istio-ingressgateway
アドレス (クラシック・クラスター) またはホスト名 (VPC クラスター) を取得します。 クラスターの各ゾーンで Istio ロード・バランサーを有効にした場合は、各ゾーン内のロード・バランサー・サービスの IP アドレスまたはホスト名を取得します。kubectl get svc -n istio-system
# Example output for classic clusters istio-ingressgateway LoadBalancer 172.21.XXX.XXX 169.1.1.1 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m
# Example output for VPC clusters: istio-ingressgateway LoadBalancer 172.21.XXX.XXX 1234abcd-us-south.lb.appdomain.cloud 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m
-
DNS サブドメインを作成して、ロード・バランサー IP またはホスト名を登録します。 IBM Cloud Kubernetes Service での DNS サブドメインの登録の詳細については、Classic:NLBサブドメインの登録、または VPC ALB または VPC NLB のDNSサブドメインでVPCロードバランサーのホスト名を登録する情報を参照してください。
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
VPCクラスタの例となるコマンド。
ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
-
サブドメインが作成されたことを確認します。 出力で、**「SSL Cert Secret Name」**フィールドにある SSL 秘密鍵の名前をコピーします。
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
クラシック・クラスターの出力例。
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>
VPCクラスタの出力例。
Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate>
-
アプリ・マイクロサービスの URL を入力して、Istio マネージド・マイクロサービスにトラフィックがルーティングされていることを確認します。
http://<host_name>/<service_path>
よりきめ細かくルーティングを制御することもできます。 ロードバランサーがトラフィックを各マイクロサービスにルーティングした後に適用されるルールを作成するには、例えば、トラフィックを1つのマイクロサービスの異なるバージョンに送信するルールなどを作成し、適用することができます DestinationRules
作成して適用することができます。
Ingress セットアップまたは Egress セットアップをデバッグする必要がありますか? istio-global-proxy-accessLogFile
構成マップmanaged-istio-custom
の オプションが "/dev/stdout"
に設定されていることを確認します。 Envoy プロキシーは、アクセス情報を標準出力に出力します。これは、Envoy コンテナーに対して kubectl logs
コマンドを実行することで表示できます。 ゲートウェイの ibm-cloud-provider-ip
ポッドが pending
のままになっている場合は、このトラブルシューティングのトピックを参照してください。
DNS を使用した Istio Ingress ゲートウェイの公開 (TLS 終端処理あり)
- クラスターに
istio
マネージド・アドオンをインストールします。 istioctl
CLI をインストールします。- アプリ・マイクロサービス用にサイドカー注入をセットアップし、そのアプリ・マイクロサービスを名前空間にデプロイし、そのアプリ・マイクロサービスに Kubernetes サービスを作成して、Istio サービス・メッシュ内に配置します。
アプリをパブリックに公開するには、以下のようにします。
-
DNS サブドメインを作成して、ロード・バランサー IP またはホスト名を登録します。 IBM Cloud Kubernetes Service で DNS サブドメインを登録する方法について詳しくは、クラシック: NLB サブドメインの登録または DNS サブドメインへの VPC ロード・バランサーのホスト名の登録を参照してください。
- クラシック・クラスター:
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
- VPC クラスター:
ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
- クラシック・クラスター:
-
サブドメインが作成されたことを確認します。 出力で、**「SSL Cert Secret Name」**フィールドにある SSL 秘密鍵の名前をコピーします。
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
# Example output for classic clusters: Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>
# Example output for VPC clusters: Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate>
-
パブリック
istio-ingressgateway
ロード・バランサー・サービスを使用して HTTP 用のポート 80 を公開するゲートウェイを作成します。<namespace>
を、Istio 管理対象マイクロサービスがデプロイされている名前空間で置き換えます。 ゲートウェイYAMLコンポーネントの詳細については 、Istioのリファレンスドキュメントを参照してください。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: my-gateway namespace: <namespace> spec: selector: istio: ingressgateway servers: - port: name: https protocol: HTTPS number: 443 tls: mode: SIMPLE serverCertificate: /etc/istio/ingressgateway-certs/tls.crt privateKey: /etc/istio/ingressgateway-certs/tls.key hosts: - "*"
-
Istio マネージド・マイクロサービスがデプロイされている名前空間にゲートウェイを適用します。
kubectl apply -f my-gateway.yaml -n <namespace>
-
my-gateway
ゲートウェイを使用するとともにアプリ・マイクロサービスのためのルーティング・ルールを定義する仮想サービスを作成します。 仮想サービスYAMLコンポーネントの詳細については 、Istioのリファレンスドキュメントを参照してください。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: my-virtual-service namespace: <namespace> # The namespace where your Istio-managed microservices are deployed. spec: gateways: - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer. hosts: - '*' http: - match: - uri: exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`. route: - destination: host: <service_name> # The name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices. port: number: 443 # If your microservice listens on a different port, replace 443 with the port.
-
Istio マネージド・マイクロサービスがデプロイされている名前空間に仮想サービス・ルールを適用します。
kubectl apply -f my-virtual-service.yaml -n <namespace>
-
** パブリック・ロード・バランサーの **EXTERNAL-IP
istio-ingressgateway
アドレス (クラシック・クラスター) またはホスト名 (VPC クラスター) を取得します。 クラスターの各ゾーンで Istio ロード・バランサーを有効にした場合は、各ゾーン内のロード・バランサー・サービスの IP アドレスまたはホスト名を取得します。kubectl get svc -n istio-system
# Example output for classic clusters: istio-ingressgateway LoadBalancer 172.21.XXX.XXX 169.1.1.1 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m
# Example output for VPC clusters: istio-ingressgateway LoadBalancer 172.21.XXX.XXX 1234abcd-us-south.lb.appdomain.cloud 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m
-
アプリ・マイクロサービスの URL を入力して、Istio マネージド・マイクロサービスにトラフィックがルーティングされていることを確認します。
https://<host_name>/<service_path>
NLB の DNS ホストのシークレットの証明書は、90 日ごとに有効期限が切れます。 デフォルトの名前空間のシークレットは、有効期限が切れる 37 日前に IBM Cloud Kubernetes Service によって自動的に更新されますが、シークレットが更新されるたびに、シークレットを istio-system
名前空間に手動でコピーする必要があります。 スクリプトを使用してこの処理を自動化することができます。
よりきめ細かくルーティングを制御することもできます。 ロードバランサーがトラフィックを各マイクロサービスにルーティングした後に適用されるルールを作成するには、例えば、トラフィックを1つのマイクロサービスの異なるバージョンに送信するルールなどを作成し、適用することができます DestinationRules
作成して適用することができます。
Ingress セットアップまたは Egress セットアップをデバッグする必要がありますか? istio-global-proxy-accessLogFile
構成マップmanaged-istio-custom
の オプションが "/dev/stdout"
に設定されていることを確認します。 Envoy プロキシーは、アクセス情報を標準出力に出力します。これは、Envoy コンテナーに対して kubectl logs
コマンドを実行することで表示できます。 ゲートウェイの ibm-cloud-provider-ip
ポッドが pending
のままになっている場合は、このトラブルシューティングのトピックを参照してください。
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 設定が、このルールでオーバーライドされないようにします。