このトピックでは、Ambient Meshモードでサービスメッシュにアプリケーションを迅速にデプロイする方法について説明します。
前提条件
サンプルコードがデプロイされていること。詳細については、「準備」をご参照ください。
お使いのオペレーティングシステムとプラットフォームに基づいて、Service Mesh(ASM)デバッグツールである istioctl をダウンロードしていること。 istioctl のバージョンは、ASM インスタンスのバージョンと互換性がある必要があります。詳細については、GitHub の Istio リポジトリをご覧ください。
このトピックで説明されている操作を実行する場合、データプレーンとコントロールプレーンのクラスターで操作を実行するために、Kubernetes コンテキストを繰り返し切り替える必要がある場合があります。誤操作を避けるため、コンテキストを切り替えるたびに、現在のコンテキストが正しいことを確認してください。kubectx を使用すると、コンテキストの切り替えを簡素化できます。詳細については、「kubectx」をご参照ください。また、データプレーンのクラスターの Kubernetes API を使用して Istio リソースにアクセスする機能を有効にしてから、データプレーンのクラスターの Kubernetes API を使用して、コントロールプレーンのクラスターで直接操作を実行することもできます。
手順 1: 承認ポリシーを有効にする
Ambient Mesh モードの ASM インスタンスにアプリケーションをデプロイした後、レイヤー 4 承認ポリシーを使用してアプリケーションへのアクセスを保護できます。たとえば、クライアントワークロードの ID に基づいてアプリケーションへのアクセスを制御できます。
V1.22 の ASM インスタンスのレイヤー 4 承認ポリシーは、カナリアリリースを使用してテストされています。 V1.21 以前の ASM インスタンスのレイヤー 4 承認ポリシーは通常どおり使用できます。 V1.22 の ASM インスタンスのレイヤー 4 承認ポリシーを使用するには、チケットを送信してください。
レイヤー 4 承認ポリシー
次の内容を含む productpage-viewer.yaml ファイルを作成します。
この YAML ファイルは、sleep アプリケーションとゲートウェイのサービスアカウントが productpage サービスを呼び出すことを明示的に許可する承認ポリシーを定義するために使用されます。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: app: productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep - cluster.local/ns/istio-system/sa/istio-ingressgateway // sleep アプリケーションとゲートウェイのサービスアカウントを許可kubeconfig ファイルの情報に基づいて kubectl を使用して ASM インスタンスに接続し、次のコマンドを実行して承認ポリシーをデプロイします。
kubectl apply -f productpage-viewer.yaml承認ポリシーが有効になっていることを確認します。
次のコマンドを実行します。
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"期待される出力:
<title>Simple Bookstore App</title>次のコマンドを実行します。
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"期待される出力:
<title>Simple Bookstore App</title>次のコマンドを実行します。
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"期待される出力:
command terminated with exit code 56上記の出力は、承認ポリシーが有効になっていることを示しています。
レイヤー 7 承認ポリシー
V1.21 以前の ASM インスタンスの場合
Kubernetes Gateway API を使用して、bookinfo-productpage サービスアカウントのウェイポイントプロキシをデプロイできます。このウェイポイントプロキシは、productpage サービスに使用されます。 productpage サービス宛てのトラフィックは、このレイヤー 7 プロキシによってルーティングされます。
次のコマンドを実行して、bookinfo-productpage サービスアカウントのウェイポイントプロキシをデプロイします。
istioctl x waypoint apply --service-account bookinfo-productpage次のコマンドを実行して、productpage サービスのウェイポイントプロキシのステータスを表示します。
kubectl get gtw bookinfo-productpage -o yaml承認ポリシーを変更します。
次の内容を productpage-viewer.yaml ファイルにコピーします。これにより、sleep アプリケーションとゲートウェイのサービスアカウントが GET リクエストを使用して productpage サービスにアクセスすることが明示的に許可されますが、他の操作は許可されません。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep - cluster.local/ns/istio-system/sa/istio-ingressgateway // sleep アプリケーションとゲートウェイのサービスアカウントを許可 to: - operation: methods: ["GET"] // GET リクエストのみを許可次のコマンドを実行して、承認ポリシーを再デプロイします。
kubectl apply -f productpage-viewer.yaml
承認ポリシーが有効になっていることを確認します。
次のコマンドを実行します。
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" -X DELETE期待される出力:
RBAC: access denied次のコマンドを実行します。
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/期待される出力:
RBAC: access denied次のコマンドを実行します。
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"期待される出力:
<title>Simple Bookstore App</title>上記の出力は、承認ポリシーが有効になっていることを示しています。
V1.22 以降の ASM インスタンスの場合
Ambient Mesh モードでレイヤー 7 機能を使用するには、まず指定されたサービスまたはワークロードのウェイポイントプロキシを有効にする必要があります。
指定されたサービスまたはワークロードのウェイポイントプロキシを有効にする方法
ASM インスタンス V1.22 は、ウェイポイントプロキシを構成する新しい方法を提供します。この方法を使用すると、さまざまなスコープでウェイポイントプロキシを柔軟に有効にできます。構成は 2 つの部分で構成されます。
まず、ウェイポイントプロキシを作成し、ラベルを使用してウェイポイントプロキシが有効になるトラフィックを指定する必要があります。
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: labels: istio.io/waypoint-for: service // サービスのトラフィック用 name: waypoint namespace: default spec: gatewayClassName: istio-waypoint listeners: - name: mesh port: 15008 protocol: HBONEこのゲートウェイの
gatewayClassNameフィールドはistio-waypointで、ウェイポイントプロキシが作成されることを示します。このゲートウェイには特別なラベル
istio.io/waypoint-for: serviceがあり、このウェイポイントプロキシがサービスのトラフィック専用であることを示します。serviceに zusätzlich、istio.io/waypoint-for フィールドをworkload(ポッド専用)またはall(サービスとワークロード)に設定することもできます。
ウェイポイントプロキシによって処理されるトラフィックを指定します。
istio.io/use-waypointラベルをサービス、名前空間、またはポッドに追加し、このラベルの値を使用するウェイポイントプロキシの名前に設定する必要があります。apiVersion: v1 kind: Service metadata: labels: app: httpbin service: httpbin istio.io/use-waypoint: waypoint // 使用するウェイポイントプロキシを指定 name: httpbin namespace: default spec: ports: - name: http port: 8000 protocol: TCP targetPort: 80 selector: app: httpbin type: ClusterIP
デモ
次のセクションでは、このトピックで説明されている環境でレイヤー 7 承認ポリシーを使用する方法を引き続き説明します。
kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続します。次に、ウェイポイントプロキシの次の内容をデフォルトの名前空間にデプロイします。
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: labels: istio.io/waypoint-for: service name: waypoint namespace: default spec: gatewayClassName: istio-waypoint listeners: - name: mesh port: 15008 protocol: HBONE // ウェイポイントプロキシを作成kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続します。次に、次のコマンドを実行して productpage サービスのラベルを追加し、productpage サービスのトラフィックがウェイポイントプロキシによって処理されるようにします。
kubectl label service productpage istio.io/use-waypoint=waypoint次の内容で承認ポリシーを更新します。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: targetRefs: - kind: Service group: "" name: productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep // sleep アプリケーションのみ許可 to: - operation: methods: ["GET"] // GET リクエストのみ許可新しい承認ポリシーは、sleep アプリケーションの GET リクエストのみが productpage サービスにアクセスすることを明示的に示しており、他のすべてのリクエストは拒否されます。
説明上記の承認ポリシーの適用に失敗した場合は、元の承認ポリシーを削除し、上記の承認ポリシーを再度適用してください。
承認ポリシーが有効になっていることを確認します。
kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続します。次に、次のコマンドを実行して、GET リクエストを使用して productpage サービスにアクセスします。
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"期待される出力:
<title>Simple Bookstore App</title>次のコマンドを実行して、DELETE リクエストを使用して productpage サービスにアクセスします。
kubectl exec deploy/sleep -- curl -XDELETE -s http://productpage:9080/期待される出力:
RBAC: access denied次のコマンドを実行して、GET リクエストを使用して productpage サービスにアクセスします。
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/期待される出力:
RBAC: access denied
上記の出力は、承認ポリシーが有効になっていることを示しています。
手順 2: レイヤー 7 ルーティングルールを定義する
V1.21 以前の ASM インスタンスの場合
次のコマンドを実行して、reviews サービスのウェイポイントプロキシをデプロイし、reviews サービスへのすべてのトラフィックがこのウェイポイントプロキシによってルーティングされるようにします。
istioctl x waypoint apply --service-account bookinfo-reviews次の内容を含む reviews.yaml ファイルを作成します。
リクエストの 90% を reviews-v1 に、10% を reviews-v2 に送信するトラフィックルーティングルールを構成します。
次のコマンドを実行して、デスティネーションルールをデプロイします。
kubectl apply -f reviews.yaml次のコマンドを実行して、100 件のリクエストの 10% が reviews-v2 に送信されることを確認します。
kubectl exec deploy/sleep -- sh -c "for i in \$(seq 1 100); do curl -s http://$GATEWAY_HOST/productpage | grep reviews-v.-; done"期待される出力:
<u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v2-5d99885bc9-qb5cv</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> // reviews-v1 と reviews-v2 へのトラフィック分布を示す出力上記の出力は、レイヤー 7 ルーティングルールが有効になっていることを示しています。
V1.22 以降の ASM インスタンスの場合
次のコマンドを実行して、reviews サービスのウェイポイントプロキシをデプロイし、reviews サービスへのすべてのトラフィックがこのウェイポイントプロキシによってルーティングされるようにします。
kubectl label service reviews istio.io/use-waypoint=waypoint次の内容を使用して、reviews サービスのトラフィックルーティングルールを作成し、リクエストの 90% を reviews-v1 に、10% を reviews-v2 に送信します。
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews spec: host: reviews trafficPolicy: loadBalancer: simple: RANDOM subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v3 labels: version: v3 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 weight: 90 // reviews-v1 へのトラフィックの重み - destination: host: reviews subset: v2 weight: 10 // reviews-v2 へのトラフィックの重み次のコマンドを実行して、100 件のリクエストの 10% が reviews-v2 に送信されることを確認します。
kubectl exec deploy/sleep -- sh -c "for i in \$(seq 1 100); do curl -s http://$GATEWAY_HOST/productpage | grep reviews-v.-; done"期待される出力:
<u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v2-5d99885bc9-qb5cv</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> <u>reviews-v1-5896f547f5-48zcn</u> // reviews-v1 と reviews-v2 へのトラフィック分布を示す出力上記の出力は、レイヤー 7 ルーティングルールが有効になっていることを示しています。
手順 3: リソースを削除する
次のコマンドを実行して、このトピックで作成したリソースを削除します。
istioctl x waypoint delete --service-account bookinfo-productpage
istioctl x waypoint delete --service-account bookinfo-reviews
kubectl delete authorizationpolicy productpage-viewer
// 作成されたリソースを削除