すべてのプロダクト
Search
ドキュメントセンター

:はじめに

最終更新日:Jan 13, 2025

このトピックでは、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 承認ポリシー

  1. 次の内容を含む 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 アプリケーションとゲートウェイのサービスアカウントを許可
    
    
  2. kubeconfig ファイルの情報に基づいて kubectl を使用して ASM インスタンスに接続し、次のコマンドを実行して承認ポリシーをデプロイします。

    kubectl apply -f productpage-viewer.yaml
  3. 承認ポリシーが有効になっていることを確認します。

    1. 次のコマンドを実行します。

      kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"

      期待される出力:

      <title>Simple Bookstore App</title>
    2. 次のコマンドを実行します。

      kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"

      期待される出力:

      <title>Simple Bookstore App</title>
    3. 次のコマンドを実行します。

      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 プロキシによってルーティングされます。

  1. 次のコマンドを実行して、bookinfo-productpage サービスアカウントのウェイポイントプロキシをデプロイします。

    istioctl x waypoint apply --service-account bookinfo-productpage
  2. 次のコマンドを実行して、productpage サービスのウェイポイントプロキシのステータスを表示します。

    kubectl get gtw bookinfo-productpage -o yaml

    展開して期待される出力を表示

    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: Gateway
    metadata:
      annotations:
        gateway.istio.io/controller-version: "5"
        istio.io/for-service-account: bookinfo-productpage
      creationTimestamp: "2023-08-10T08:35:51Z"
      generation: 1
      name: bookinfo-productpage
      namespace: default
      resourceVersion: "7828921"
      uid: c085b788-a8fa-4a2c-8376-18d08689****
    spec:
      gatewayClassName: istio-waypoint
      listeners:
      - allowedRoutes:
          namespaces:
            from: Same
        name: mesh
        port: 15008
        protocol: HBONE
    status:
      conditions:
      - lastTransitionTime: "2023-08-10T08:35:51Z"
        message: Handled by Istio controller
        observedGeneration: 1
        reason: Accepted
        status: "True"
        type: Accepted
        // Istio コントローラーによって処理されたことを示す
    
    
  3. 承認ポリシーを変更します。

    1. 次の内容を 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 リクエストのみを許可
      
      
    2. 次のコマンドを実行して、承認ポリシーを再デプロイします。

      kubectl apply -f productpage-viewer.yaml
  4. 承認ポリシーが有効になっていることを確認します。

    1. 次のコマンドを実行します。

      kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" -X DELETE

      期待される出力:

       RBAC: access denied                                                                                                       
    2. 次のコマンドを実行します。

      kubectl exec deploy/notsleep -- curl -s http://productpage:9080/

      期待される出力:

        RBAC: access denied
    3. 次のコマンドを実行します。

      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 つの部分で構成されます。

  1. まず、ウェイポイントプロキシを作成し、ラベルを使用してウェイポイントプロキシが有効になるトラフィックを指定する必要があります。

    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
    
    
    1. このゲートウェイの gatewayClassName フィールドは istio-waypoint で、ウェイポイントプロキシが作成されることを示します。

    2. このゲートウェイには特別なラベル istio.io/waypoint-for: service があり、このウェイポイントプロキシがサービスのトラフィック専用であることを示します。 service に zusätzlich、istio.io/waypoint-for フィールドを workload(ポッド専用)または all(サービスとワークロード)に設定することもできます。

  2. ウェイポイントプロキシによって処理されるトラフィックを指定します。 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 承認ポリシーを使用する方法を引き続き説明します。

  1. 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
    // ウェイポイントプロキシを作成
    
    
  2. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続します。次に、次のコマンドを実行して productpage サービスのラベルを追加し、productpage サービスのトラフィックがウェイポイントプロキシによって処理されるようにします。

    kubectl label service productpage istio.io/use-waypoint=waypoint
  3. 次の内容で承認ポリシーを更新します。

    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 サービスにアクセスすることを明示的に示しており、他のすべてのリクエストは拒否されます。

    説明

    上記の承認ポリシーの適用に失敗した場合は、元の承認ポリシーを削除し、上記の承認ポリシーを再度適用してください。

  4. 承認ポリシーが有効になっていることを確認します。

    1. kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスターに接続します。次に、次のコマンドを実行して、GET リクエストを使用して productpage サービスにアクセスします。

      kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"

      期待される出力:

      <title>Simple Bookstore App</title>
    2. 次のコマンドを実行して、DELETE リクエストを使用して productpage サービスにアクセスします。

      kubectl exec deploy/sleep -- curl -XDELETE -s http://productpage:9080/

      期待される出力:

      RBAC: access denied
    3. 次のコマンドを実行して、GET リクエストを使用して productpage サービスにアクセスします。

      kubectl exec deploy/notsleep -- curl -s http://productpage:9080/

      期待される出力:

      RBAC: access denied

    上記の出力は、承認ポリシーが有効になっていることを示しています。

手順 2: レイヤー 7 ルーティングルールを定義する

V1.21 以前の ASM インスタンスの場合

  1. 次のコマンドを実行して、reviews サービスのウェイポイントプロキシをデプロイし、reviews サービスへのすべてのトラフィックがこのウェイポイントプロキシによってルーティングされるようにします。

    istioctl x waypoint apply --service-account bookinfo-reviews
  2. 次の内容を含む reviews.yaml ファイルを作成します。

    リクエストの 90% を reviews-v1 に、10% を reviews-v2 に送信するトラフィックルーティングルールを構成します。

    展開して reviews.yaml ファイルを表示

    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 へのトラフィックの重み
    
    
  3. 次のコマンドを実行して、デスティネーションルールをデプロイします。

    kubectl apply -f reviews.yaml
  4. 次のコマンドを実行して、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 インスタンスの場合

  1. 次のコマンドを実行して、reviews サービスのウェイポイントプロキシをデプロイし、reviews サービスへのすべてのトラフィックがこのウェイポイントプロキシによってルーティングされるようにします。

    kubectl label service reviews istio.io/use-waypoint=waypoint
  2. 次の内容を使用して、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 へのトラフィックの重み
    
    
  3. 次のコマンドを実行して、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
// 作成されたリソースを削除