GKE アンビエント ネットワーキングを準備する

このページでは、新規または既存のクラスタでアンビエント ネットワーキングを有効にする方法、アンビエント トラフィックのリダイレクトを有効にするために Namespace とワークロードを登録する方法、mTLS と認可ポリシーを構成する方法について説明します。

アンビエント ネットワーキングのアーキテクチャ、メリット、機能について詳しくは、アンビエント ネットワーキングの概要をご覧ください。

前提条件と制限事項

アンビエント ネットワーキングを設定する前に、次の機能の制限事項、バージョンの要件、スコープの制限事項を確認してください。

  • GKE バージョン: GKE バージョン 1.35.2-gke.1842000 以降が必要です。
  • リージョン サポート: クラスタは、リージョン Cloud Service Mesh でサポートされているリージョンに作成する必要があります。
  • ワークロードの相互運用性: アンビエント ネットワーキングに登録されたワークロードは、サイドカー挿入ワークロードやプライベート プレビューのプロキシレス gRPC と相互運用できません。
  • サポートされていない機能:
    • Kubernetes Service の trafficDistribution フィールド。
    • ヘッドレス サービス。
    • GKE Sandbox(gVisor)。
  • セキュリティに関する注意: ノードで gke-ambient-nriplugin コンポーネントが使用できなくなると、インバウンド トラフィックの認証と認可の適用がバイパスされる可能性があります。

始める前に

Google Cloudで次の前提条件の設定手順を完了します。

  1. プロジェクトを作成または選択します。
  2. 必要な API を有効にします。

    gcloud services enable \
        privateca.googleapis.com \
        gkehub.googleapis.com \
        compute.googleapis.com \
        container.googleapis.com \
        trafficdirector.googleapis.com \
        networkservices.googleapis.com \
        networksecurity.googleapis.com \
        telemetry.googleapis.com \
        monitoring.googleapis.com \
        logging.googleapis.com
    
  3. GKE 用のマネージド ワークロード ID 認証を構成する。

新しいクラスタでアンビエント ネットワーキングを有効にする

次のコマンドを実行して、アンビエント ネットワーキングが有効になっている新しい GKE クラスタを作成します。

  1. アンビエント ネットワーキングを有効にして GKE クラスタを作成する

    gcloud beta container clusters create CLUSTER_NAME \
        --machine-type=e2-standard-4 \
        --enable-ambient-networking \
        --enable-dataplane-v2 \
        --enable-fleet \
        --gateway-api=standard \
        --location=CLUSTER_LOCATION \
        --release-channel=rapid \
        --workload-pool=PROJECT_ID.svc.id.goog
    

    gke-managed-ambient Namespace で 2 つの DaemonSet が実行されるようになりました。

既存のクラスタでアンビエント ネットワーキングを有効にする

既存の GKE クラスタでアンビエント メッシュを有効にする手順は次のとおりです。

  1. クラスタが次の要件を満たしていることを確認します。

    • バージョン 1.35.2-gke.1842000 以降。
    • GKE Dataplane V2 が有効になっている。
    • マシンタイプは e2-standard-4 以上にする必要があります。
    • クラスタはフリートに追加されている必要があります。
    • クラスタで Gateway API と Workload Identity が有効になっている必要があります。
  2. 既存のクラスタでアンビエント ネットワーキングを有効にします。

    gcloud beta container clusters update CLUSTER_NAME \
        --enable-ambient-networking \
        --location=CLUSTER_LOCATION \
        --enable-fleet
    

    gke-managed-ambient Namespace で 2 つの DaemonSet が実行されるようになりました。

  3. 確認するには、CLI をクラスタにポイントします。

    gcloud beta container clusters get-credentials CLUSTER_NAME \
        --location=CLUSTER_LOCATION
    
  4. gke-managed-ambient Namespace の DaemonSet を取得します。

    kubectl get daemonset -n gke-managed-ambient
    

    出力は次のようになります。

    NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   AGE
    gke-ambient-nriplugin   9         9         9       9            9           4d1h
    gke-ambient-proxy       9         9         9       9            9           4d1h
    

アンビエント ネットワーキング用に Namespace を登録する

次の手順に沿って、サンプル アプリケーションをデプロイし、その Namespace でアンビエント トラフィックのリダイレクトを有効にします。

  1. サンプル アプリケーションをデプロイします。

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: ambient-test
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: client
      namespace: ambient-test
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: server
      namespace: ambient-test
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: server
      namespace: ambient-test
      labels:
        app: server
    spec:
      ports:
      - port: 80
        protocol: TCP
      selector:
        app: server
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: client
      namespace: ambient-test
      labels:
        app: client
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: client
      template:
        metadata:
          labels:
            app: client
        spec:
          serviceAccountName: client
          containers:
          - name: nginx
            image: nginx:1.29.6
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: server
      namespace: ambient-test
      labels:
        app: server
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: server
      template:
        metadata:
          labels:
            app: server
        spec:
          serviceAccountName: server
          containers:
          - name: nginx
            image: nginx:1.29.6
            readinessProbe:
              httpGet:
                path: /
                port: 80
    EOF
    
  2. ambient-test Namespace にラベルを付けて、GKE アンビエント プロキシを介したトラフィックのリダイレクトを有効にします。

    kubectl label namespace ambient-test networking.gke.io/dataplane-mode=ambient
    
  3. Namespace 内の個々の Pod がトラフィック リダイレクト用に構成されていることを確認します。

    kubectl get pods -n ambient-test -o yaml | grep redirection
    

    出力は次のようになります。

    ambient.networking.gke.io/redirection: enabled
    ambient.networking.gke.io/redirection: enabled
    
  4. クライアントからサーバーへのトラフィックをテストします。

    kubectl exec -it deploy/client -n ambient-test -- \
        /bin/curl -fsLS server.ambient-test.svc.cluster.local
    
  5. プレーンテキスト トラフィックが gke-ambient-proxy を通過していることを確認するには、ログ エクスプローラでアクセスログを確認し、gke-ambient-node-proxy-accesslog を検索します。

    [ログ エクスプローラ] に移動

  6. 必要に応じて、Namespace 内のワークロードのレイヤ 4 指標の生成を有効にします。

    kubectl label namespace ambient-test networking.gke.io/ambient-network-metrics=enabled
    

    有効にすると、ワークロード指標は ネットワーク サービス モニタリングを介して Cloud Monitoring で使用できます。

サービスの mTLS を有効にする

Namespace のワークロードのトラフィック リダイレクトを有効にした後、ポリシーを適用して暗号化、認証、認可を適用します。

  1. サーバーサイド ワークロードに許可型の mTLS ポリシーを構成します。

    kubectl apply -f - <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPServerTLSPolicy
    metadata:
      name: server
      namespace: ambient-test
    spec:
      mtlsMode: Permissive
      targetRefs:
      - group: ""
        kind: Pod
        selector:
          matchLabels:
            app: server
    EOF
    

    このポリシーにより、Pod は mTLS と平文の両方のトラフィックを受け入れるようになります。制限なしの mTLS では、トラフィック スニッフィングを使用して、トラフィックが mTLS か平文かを検出します。これにより、独自の TLS または MySQL などの「サーバーが最初に話す」プロトコルを使用するアプリケーション トラフィックが中断されます。

  2. コントローラによってポリシーが承認されたことを確認します。

    kubectl describe gcpservertlspolicies -n ambient-test server | grep -A50 Status
    

    出力は次のようになります。

    [...]
    
        Conditions:
        Last Transition Time:  2026-03-25T17:47:30Z
        Message:
        Reason:                Accepted
        Status:                True
        Type:                  Accepted
        Controller Name:         networking.gke.io/dpv2-1n
    Events:
    Type    Reason  Age                   From                   Message
    ----    ------  ----                  ----                   -------
    Normal  Sync    108s (x2 over 2m20s)  sc-dpv2-1n-controller  Sync on Mesh dpv2-1n-fqtx-mesh succeeded
    

    ポリシーの伝播には、コントローラの承認後最大 3 分かかることがあります。3 分待ってから次の手順に進みます。

  3. サービスをターゲットとするクライアント側の mTLS ポリシーを構成します。

    kubectl apply -f - <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPClientTLSPolicy
    metadata:
      name: server-mtls
      namespace: ambient-test
    spec:
      targetRefs:
      - group: ""
        kind: Service
        name: server
      subjectAltNames:
      - uri: spiffe://PROJECT_ID.svc.id.goog/ns/ambient-test/sa/server
    EOF
    

    このポリシーは、登録されたクライアントがサーバー Service への mTLS トラフィックを発信するように構成します。次のステップに進む前に、少なくとも 2 分待つ必要がある場合があります。

  4. コントローラによってポリシーが承認されたことを確認します。

    kubectl describe gcpclienttlspolicies -n ambient-test server-mtls | grep -A50 Status
    

    出力は次のようになります。

    [...]
    Status:
    Conditions:
        Last Transition Time:  2024-10-13T01:15:03Z
        Message:
        Observed Generation:   1
        Reason:                Accepted
        Status:                True
        Type:                  Accepted
    
  5. クライアントからサーバーへのトラフィックをテストします。

    kubectl exec -it deploy/client -n ambient-test -- \
        /bin/curl -fsLS server.ambient-test.svc.cluster.local
    

    アンビエント ネットワーキングに登録された Pod から ambient-test Namespace のサーバー サービスへのトラフィックは、mTLS を使用するようになります。

  6. 接続で mTLS が使用されていることを確認するには、ログ エクスプローラでアクセスログを確認し、カスタム ログ名を検索します。

    [ログ エクスプローラ] に移動

  7. 既存の GCPServerTLSPolicy を更新して、サーバー サービスの mode を Permissive から Strict に変更し、ワークロード Pod がプレーン テキスト トラフィックを受け入れないようにします。

    kubectl apply -f - <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPServerTLSPolicy
    metadata:
      name: server
      namespace: ambient-test
    spec:
      mtlsMode: Strict
      targetRefs:
      - group: ""
        kind: Pod
        selector:
          matchLabels:
            app: server
    EOF
    
  8. ポリシーが承認されたことを確認します。

    kubectl describe gcpservertlspolicies -n ambient-test server | grep -A50 Status
    

    出力は次のようになります。

    Name:         server
    
    <...>
    
    UID:                 e4f2a7a3-69aa-4528-8ea6-6f1bf2142011
    Spec:
    Mtls Mode:  Strict
    Target Refs:
    Group:
    Kind:   Pod
    Selector:
      Match Labels:
        App:  server
    Status:
    Ancestors:
        Ancestor Ref:
        Group:
        Kind:   Pod
        Name:   app=server
        Conditions:
        Last Transition Time:  2026-03-25T22:33:54Z
        Message:
        Reason:                Accepted
        Status:                True
        Type:                  Accepted
        Controller Name:         networking.gke.io/dpv2-1n
    Events:
    Type    Reason  Age                  From                   Message
    ----    ------  ----                 ----                   -------
    Normal  Sync    43s (x5 over 4m57s)  sc-dpv2-1n-controller  Sync on Mesh dpv2-1n-2cdi-mesh succeeded
    

    サーバー サービスへのプレーン テキスト トラフィックは拒否されるようになります。

  9. 平文のトラフィックが拒否されるようになったことを確認するには、アンビエント ネットワーキングに登録されていないクライアントからサーバー サービスにトラフィックを送信します。

    kubectl create namespace noambient-test && \
    kubectl run -it -n noambient-test --rm curl --image=nginx -- \
        /bin/curl -fsLSv http://server.ambient-test.svc.cluster.local
    

    この接続は失敗し、次のようなメッセージが表示されます。

    * Request completely sent off
    * Empty reply from server
    * shutting down connection #0
    curl: (52) Empty reply from server
    

レイヤ 4 認可ポリシーを設定する

ID ベースの認可を適用するには、ワークロード オーナーがポリシー セレクタで Pod ラベルを指定します。Namespace のオーナーは、セレクタなしで Namespace 全体にポリシーを適用します。

  1. 次のポリシーを適用して、クライアントのみがサーバーと通信できるようにします。

    kubectl apply -f - <<EOF
    apiVersion: networking.gke.io/v1
    kind: GCPAuthzPolicy
    metadata:
      name: allow-client
      namespace: ambient-test
    spec:
      action: ALLOW
      enforcementLevel: L4
      targetRefs:
      - group: ""
        kind: Pod
        selector:
          matchLabels:
            app: server
      rules:
      - from:
          sources:
          - principals:
            - principalSelector: CLIENT_CERT_URI_SAN
              principal:
                type: Exact
                value: spiffe://PROJECT_ID.svc.id.goog/ns/ambient-test/sa/client
    EOF
    

    このポリシーは、ambient-test Namespace のサーバー Pod へのトラフィックに適用されます。これにより、SPIFFE ID spiffe://PROJECT_ID.svc.id.goog/ns/ambient-test/sa/client を持つ送信元からのトラフィックのみが許可されます。

  2. クライアント サービス アカウントからサンプル リクエストを送信して、ポリシーの適用が許可されていることを確認します。

    kubectl exec -it deploy/client -n ambient-test -- \
        /bin/curl -fsLS server.ambient-test.svc.cluster.local
    
  3. サーバー サービス アカウントからサンプル リクエストを送信して、ポリシーの適用が許可されていないことを確認します。

    kubectl exec -it deploy/server -n ambient-test -- \
        /bin/curl -fsLS server.ambient-test.svc.cluster.local
    

    出力は次のようになります。

    curl: (52) Empty reply from server
    command terminated with exit code 52
    
  4. ログ エクスプローラを使用して、認可の適用ロギングを確認できます。 Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動