本页介绍了如何在新的或现有集群上启用环境网络,注册命名空间和工作负载以启用环境流量重定向,以及配置 mTLS 和授权政策。
如需详细了解环境联网的架构、优势和功能,请参阅环境联网概览。
前提条件和限制
在设置环境网络之前,请查看以下功能限制、版本要求和范围限制:
- GKE 版本:需要 GKE 版本
1.35.2-gke.1842000或更高版本。 - 区域支持:集群必须在区域 Cloud Service Mesh 支持的区域中创建。
- 工作负载互操作性:在私密预览版中,加入环境网络的工作负载无法与边车注入的工作负载或无代理 gRPC 互操作。
- 不支持的功能:
- Kubernetes 服务
trafficDistribution字段。 - 无头服务。
- GKE Sandbox (gVisor)。
- Kubernetes 服务
- 安全注意事项:如果节点上的
gke-ambient-nriplugin组件变得不可用,则可能会绕过入站流量身份验证和授权强制执行。
准备工作
在 Google Cloud中完成以下前提条件设置步骤:
- 创建或选择项目。
启用必需的 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
在新集群上启用环境网络
运行以下命令,创建一个启用了环境网络的新 GKE 集群:
创建启用了环境网络的 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.35.2-gke.1842000 或更高版本。
- GKE Dataplane V2 已启用。
- 机器类型必须为 e2-standard-4 或更大。
- 集群必须添加到舰队中。
- 集群必须已启用 Gateway API 和 Workload Identity。
在现有集群上启用环境网络:
gcloud beta container clusters update CLUSTER_NAME \ --enable-ambient-networking \ --location=CLUSTER_LOCATION \ --enable-fleet现在,有两个 DaemonSet 在
gke-managed-ambient命名空间中运行。如需验证,请将 CLI 指向集群:
gcloud beta container clusters get-credentials CLUSTER_NAME \ --location=CLUSTER_LOCATION获取
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
为环境网络注册命名空间
请按照以下步骤部署示例应用,并在其命名空间中启用环境流量重定向:
部署示例应用:
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为
ambient-test命名空间添加标签,以通过 GKE 环境代理启用流量重定向:kubectl label namespace ambient-test networking.gke.io/dataplane-mode=ambient验证命名空间中的各个 Pod 是否已配置为重定向流量:
kubectl get pods -n ambient-test -o yaml | grep redirection输出类似于以下内容:
ambient.networking.gke.io/redirection: enabled ambient.networking.gke.io/redirection: enabled测试客户端到服务器的流量:
kubectl exec -it deploy/client -n ambient-test -- \ /bin/curl -fsLS server.ambient-test.svc.cluster.local如需验证明文流量是否正在通过
gke-ambient-proxy流动,请在Logs Explorer中检查访问日志,并搜索gke-ambient-node-proxy-accesslog:(可选)为命名空间中的工作负载启用第 4 层指标生成:
kubectl label namespace ambient-test networking.gke.io/ambient-network-metrics=enabled启用后,您可以通过 Network Services Monitoring 在 Cloud Monitoring 中查看工作负载指标。
为服务启用 mTLS
为命名空间中的工作负载启用流量重定向后,应用政策以强制执行加密、身份验证和授权。
在服务器端工作负载上配置宽松的 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)的应用流量。
验证控制器是否已接受政策:
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 分钟,然后再继续操作。
配置以服务为目标的客户端 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 分钟,然后才能继续执行下一步。
验证控制器是否已接受政策:
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测试客户端到服务器的流量:
kubectl exec -it deploy/client -n ambient-test -- \ /bin/curl -fsLS server.ambient-test.svc.cluster.local从已注册到环境网络的 Pod 到 ambient-test 命名空间中的服务器服务的流量现在应使用 mTLS。
如需验证连接是否使用 mTLS,请在Logs Explorer中检查访问日志,并搜索自定义日志名称:
更新现有 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验证政策是否已被接受:
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现在,系统会拒绝发送到服务器服务的任何明文流量。
如需验证纯文本流量现在是否会被拒绝,请从未注册到环境联网的客户端向服务器服务发送流量:
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 标签。命名空间所有者可以在命名空间范围内应用政策,而无需选择器。
应用以下政策,以强制执行仅允许客户端与服务器通信的规则:
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 的来源的流量。通过从客户端服务账号发送示例请求,验证政策执行是否允许。
kubectl exec -it deploy/client -n ambient-test -- \ /bin/curl -fsLS server.ambient-test.svc.cluster.local通过从服务器服务账号发送示例请求,验证是否不允许强制执行政策。
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您可以使用日志浏览器查看授权强制执行日志记录。在 Google Cloud 控制台中,前往 Logs Explorer 页面。