准备 GKE 环境网络

本页介绍了如何在新的或现有集群上启用环境网络,注册命名空间和工作负载以启用环境流量重定向,以及配置 mTLS 和授权政策。

如需详细了解环境联网的架构、优势和功能,请参阅环境联网概览。

前提条件和限制

在设置环境网络之前,请查看以下功能限制、版本要求和范围限制:

  • GKE 版本:需要 GKE 版本 1.35.2-gke.1842000 或更高版本。
  • 区域支持:集群必须在区域 Cloud Service Mesh 支持的区域中创建。
  • 工作负载互操作性:在私密预览版中,加入环境网络的工作负载无法与边车注入的工作负载或无代理 gRPC 互操作。
  • 不支持的功能:
    • Kubernetes 服务 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 配置托管式工作负载身份的身份验证。

在新集群上启用环境网络

运行以下命令,创建一个启用了环境网络的新 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.
    

    现在,有两个 DaemonSet 在 gke-managed-ambient 命名空间中运行。

在现有集群上启用环境网络

如需在现有 GKE 集群中启用 ambient mesh,请按以下步骤操作:

  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
    

    现在,有两个 DaemonSet 在 gke-managed-ambient 命名空间中运行。

  3. 如需验证,请将 CLI 指向集群:

    gcloud beta container clusters get-credentials CLUSTER_NAME \
        --location=CLUSTER_LOCATION
    
  4. 获取 gke-managed-ambient 命名空间中的 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
    

为环境网络注册命名空间

请按照以下步骤部署示例应用,并在其命名空间中启用环境流量重定向:

  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 命名空间添加标签,以通过 GKE 环境代理启用流量重定向:

    kubectl label namespace ambient-test networking.gke.io/dataplane-mode=ambient
    
  3. 验证命名空间中的各个 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 流动,请在Logs Explorer中检查访问日志,并搜索 gke-ambient-node-proxy-accesslog:

    转到 Logs Explorer

  6. (可选)为命名空间中的工作负载启用第 4 层指标生成:

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

    启用后,您可以通过 Network Services Monitoring 在 Cloud Monitoring 中查看工作负载指标。

为服务启用 mTLS

为命名空间中的工作负载启用流量重定向后,应用政策以强制执行加密、身份验证和授权。

  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. 配置以服务为目标的客户端 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./ns/ambient-test/sa/server
    EOF
    

    此政策将注册的客户端配置为向服务器服务发起 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 命名空间中的服务器服务的流量现在应使用 mTLS。

  6. 如需验证连接是否使用 mTLS,请在Logs Explorer中检查访问日志,并搜索自定义日志名称:

    转到 Logs Explorer

  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 层授权政策

如需强制执行基于身份的授权,工作负载所有者可在政策选择器中指定 Pod 标签。命名空间所有者可以在命名空间范围内应用政策,而无需选择器。

  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./ns/ambient-test/sa/client
    EOF
    

    此政策会针对 ambient-test 命名空间中服务器 Pod 的流量强制执行。它可确保仅允许来自具有 SPIFFE 身份 spiffe://PROJECT_ID./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 控制台中,前往 Logs Explorer 页面。

    转到 Logs Explorer