GKE 网络:IP、入口与访问控制
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
适用:Autopilot / Standard 的普通 IPv4、VPC-native 网络。创建步骤见 Autopilot 或 Standard;VPC 基础见 VPC 与 subnet。本页不覆盖多网卡 Pod 或 IPv4/IPv6 dual-stack;尤其不能把下方 IPv4 Pod CIDR 的 /24 块计算直接套给 IPv6。需要双栈时从 VPC-native 地址模型 的 IPv6 部分选择集群与 subnet 配置。
先区分三种网络流量#
| 流量 | 典型路径 | 主要检查点 |
|---|---|---|
| 管理集群 | 本机 kubectl → 控制面 API Server | 控制面 endpoint、网络路径、Google 身份、IAM/RBAC |
| 访问应用 | 客户端 → LB / Service → Pod | 前端、路由、后端、服务端口、健康检查、应用 |
| 应用访问外部 | Pod → 数据库 / Google API / 互联网 | 路由、网络策略、防火墙、NAT、目标认证 |
kubectl 能连接控制面,不代表应用入口可达;私有节点也不代表应用没有公网入口。 控制面 endpoint、Service/Ingress 和 Pod 出站是三条独立路径。
VPC、 subnet 和 Zone 如何对应#
在基本的单网络配置中,集群选择一个 VPC 和同 Region 的 subnet。节点从该 subnet 取得内部 IP,不同 Zone 的节点可以使用同一个区域 subnet。
VPC:orders-enterprise(全局)
└─ asia-east1 Region 的 subnet orders-gke
├─ 主范围:10.64.0.0/24 → 节点、私网管理机
├─ 次要范围 orders-pods:10.68.0.0/18 → Pod 地址池
└─ 次要范围 orders-services:10.69.0.0/22 → 本例 Service 地址池
asia-east1-a 的节点 → 使用 orders-gke
asia-east1-b 的节点 → 也使用 orders-gke上图沿用 Standard 实验;secondary ranges 属于同一个 subnet。规划时检查本 VPC 与互联网络的地址重叠。
Regional 集群提供控制面跨 Zone 冗余;业务跨 Zone 副本仍由节点位置和 Pod 调度决定。
Node、Pod、Service 的 IP 分别做什么#
| 地址 | 来源与作用 | 示例 |
|---|---|---|
| Node IP | subnet 主范围,节点 VM 的内部地址 | 10.64.0.10 |
| Pod IP | 从分配给节点的 Pod CIDR 块中取地址 | 10.68.1.10 |
| Service ClusterIP | 为一组后端 Pod 提供稳定的虚拟入口 | 10.69.0.10 |
| LB frontend IP | 云负载均衡器的对外或对内入口 | 独立的公网地址或适用 subnet 内网地址 |
| 控制面 endpoint | 管理 API 的 DNS 名称或 IP | 不属于业务 Service 的访问入口 |
VPC-native / alias IP 将 Pod 地址池按节点划分,以别名 IP 接入 VPC;subnet 路由由平台维护,无须逐 Pod 配置。访问仍受 firewall 和网络策略约束。VPC-native
ClusterIP 是集群数据面转发到 Pod 的虚拟入口,不绑定某台 VM 网卡。集群外访问应使用内部/外部 LB 等受支持入口。
本例指定 orders-services;GKE 也支持平台管理的 Service 范围,例如 Google 私有用途的 34.118.224.0/20,不表示公网暴露。IP 地址说明
为什么 Pod 网段要比节点网段大#
节点需要完整的 Pod 地址块。在 Standard 中,每节点上限为默认 110 Pod 时通常分配 /24;/18 可分 64 块,须计入全部 node pool 和升级临时节点(surge)。调整每节点 Pod 上限会改变地址需求;Autopilot 使用平台规则。容量规划
Pod 如何通过 Service 访问另一个应用#
Service selector用标签选择后端 Pod;EndpointSlice 保存服务发现到的后端 endpoint。应用正常提供服务的 Pod 才应参与转发,readiness(就绪检查)用于判断是否可以接流量。
客户端 Pod
→ web.demo.svc.cluster.local(集群 DNS)
→ Service ClusterIP:80
→ 数据面选择就绪 endpoint
→ Pod IP:8080| 字段 | 含义 |
|---|---|
port: 80 |
客户端访问 Service 的端口 |
targetPort: 8080 |
转发到后端 Pod 的应用监听端口 |
containerPort: 8080 |
容器清单声明的端口,不会替应用启动监听,也不会自动公开它 |
selector |
匹配 Pod 标签;拼错可能导致没有可用后端 |
同 namespace 可用 web,跨 namespace 可用 web.demo;完整域名取决于集群域配置。这里的集群 DNS解析 Service,与管理 API 的 DNS endpoint 分开。网络架构
集群外如何访问应用#
| 方式 | 提供什么 | 适用场景 |
|---|---|---|
kubectl port-forward |
经 Kubernetes API 临时转发本机端口到 Pod | 开发验证;终端断开即停止,不创建云 LB |
| ClusterIP Service | 集群内稳定虚拟入口 | Pod 间调用 |
| NodePort Service | 在节点端口接受流量 | 特定入口架构;还需可达节点和网络许可 |
| LoadBalancer Service | 由控制器供应云负载均衡入口 | TCP/UDP 等 L4 服务;内外网类型由配置决定 |
| GKE Ingress / Gateway | 声明 HTTP(S) 域名、路径、TLS 等入口 | 网站/API;由 GKE 控制器创建所选类型的 ALB |
Ingress在这里是 Kubernetes API 对象,不是 Cloud Run 的 ingress 开关。Gateway API 用 Gateway、HTTPRoute 等对象分开描述入口和路由;选择的 GatewayClass 决定实际 GKE 负载均衡器能力和范围。
GKE 用 Zonal NEG 登记 Pod IP/端口,需要云端健康检查及 firewall;Cloud Run 使用 Serverless NEG。Pod readiness 与云端健康检查是两项检查。
控制器管理的 LB 应通过 Kubernetes 清单修改;Console 手改可能被覆盖。操作见 GKE Ingress;通用 Gateway API 页使用 Envoy Gateway,非 GKE 托管 Gateway 步骤。对象关系见 ALB。
私有节点与控制面入口分别配置#
| 设置 | 控制什么 | 不代表什么 |
|---|---|---|
--enable-private-nodes |
节点不分配外部 IP | 不会自动禁止通过公网 LB 访问应用 |
| 内部 IP endpoint | 管理 API 使用内部地址 | 你的电脑不会因此自动获得私网路由 |
| 外部 IP endpoint | 管理 API 可经外部地址到达 | 仍需身份与授权,不等于匿名管理 |
| DNS endpoint | 通过 GKE 管理域名访问 API | 与 Pod 的 Service DNS 无关 |
| Authorized networks | 控制适用 IP 管理 endpoint 的来源网段 | 不负责过滤用户访问应用 ALB 的流量 |
get-credentials --internal-ip 选择内部入口,不建立私网路由;--dns-endpoint 选择已启用的 DNS 入口。可通过 IAP 登录独立管理 VM(runner)执行 kubectl,也可使用已有 VPN 路径。
DNS endpoint 使用 IAM 等访问控制,不套用 IP endpoint 的 Authorized networks 规则;internal IP endpoint 还须核对 regional/global access 限制。具体选择见 控制面 endpoint、网络隔离。
Pod 出站:内网、Google API 与互联网#
| 目标 | 需要具备的路径 |
|---|---|
| 同 VPC VM / 私网服务 | 适用路由、防火墙、Pod 网络策略和目标端口许可 |
| 另一个 VPC | Peering、VPN 等连接及回程路由;检查 Pod 地址和源地址转换 |
| Cloud SQL 私网地址 | 对应 PSA / PSC 路径和数据库认证;不能把多个 Peering 当成可传递路由 |
| Google API / Artifact Registry | 适用的 Google API 网络路径,例如 Private Google Access;再检查 Service Account IAM |
| 普通互联网 | 私有节点环境需 Cloud NAT 或其他出口方案,并满足出站策略 |
SNAT / IP masquerade 转换源地址。依目标和集群配置,接收方可能看到 Pod IP、Node IP 或 NAT 外部 IP;配置来源白名单前先确认实际源地址。
Standard 示例的 --nat-custom-subnet-ip-ranges="$SUBNET:ALL" 纳入该 subnet 的主、次要范围。镜像拉取查节点身份与出口;业务 API 调用查工作负载身份。详见 Cloud NAT、私网连接。
VPC 防火墙、NetworkPolicy 与 Dataplane V2#
| 控制 | 管什么 | 例子 |
|---|---|---|
| VPC firewall | VPC 中适用的网络流量 | 允许 LB 健康检查或代理到达后端 |
| Kubernetes NetworkPolicy | 选定 Pod 的入站和出站通信 | 只允许带指定标签的 API Pod 访问数据库 Pod |
| IAM / Kubernetes RBAC | 谁能调用云 API 或操作 Kubernetes 对象 | 允许开发者查看 Pod;不代表应用端口自动放行 |
| 应用认证 | 业务用户和调用方能做什么 | API token、数据库用户和 SQL 权限 |
Dataplane V2 是 GKE 托管数据面,负责转发、Service 和 NetworkPolicy 执行;启用它不会自动创建默认 Deny policy,namespace 也不自动隔离网络。
默认拒绝出站时须放行实际 DNS、数据库和 API 依赖;Pod/Service 策略按 Dataplane V2 支持的 selector 与 ipBlock 规则设计。Autopilot 托管数据面,Standard 用 --enable-dataplane-v2 选择,均不应重复安装 CNI。Dataplane V2、NetworkPolicy
将网络参数对应到规划#
| 创建参数 | 对应的设计 |
|---|---|
--network / --subnetwork |
节点网络及同 Region subnet |
--enable-ip-alias |
使用 VPC-native Pod 地址模型 |
--cluster-secondary-range-name |
使用哪个已命名的 Pod 次要地址池 |
--services-secondary-range-name |
本例显式使用的 Service 地址池 |
--node-locations |
节点放置在哪些 Zone,不是 subnet 列表 |
--master-ipv4-cidr |
本例控制面内部 endpoint 地址规划;按集群架构/版本要求使用 |
--enable-private-nodes |
节点无公网 IP,同时规划依赖的出站路径 |
--enable-private-endpoint / --no-enable-dns-access |
生产篇选择仅内部 IP 管理入口,其他设计可不同 |
--enable-authorized-networks-on-private-endpoint |
将配置的来源网段限制应用到内部 IP 管理 endpoint |
完整命令及每 Zone 节点数量见 Standard 实验。
从哪个位置执行排障命令#
先配置目标 kubeconfig,并核对 context;以下 kubectl 在具备控制面访问路径的机器上执行。查看当前节点位置、Pod 地址和服务 endpoint:
kubectl config current-context
kubectl get nodes -o wide -L topology.kubernetes.io/zone
kubectl get pods -A -o wide
kubectl get services -A
kubectl get endpointslices -A
kubectl get networkpolicies -A按故障 namespace 和 Service 缩小查询范围。
从可运行 gcloud 的终端只读查看集群和 subnet:
# 设置为实际目标,不会创建新资源。
PROJECT_ID=REPLACE_PROJECT_ID
CLUSTER=REPLACE_CLUSTER
REGION=REPLACE_REGION
SUBNET=REPLACE_SUBNET
gcloud container clusters describe "$CLUSTER" \
--project="$PROJECT_ID" --region="$REGION" \
--format='yaml(network,subnetwork,ipAllocationPolicy,privateClusterConfig,controlPlaneEndpointsConfig,masterAuthorizedNetworksConfig)'
gcloud compute networks subnets describe "$SUBNET" \
--project="$PROJECT_ID" --region="$REGION" \
--format='yaml(ipCidrRange,secondaryIpRanges,privateIpGoogleAccess)'| 故障 | 检查顺序 |
|---|---|
| kubectl 超时 | 使用哪个控制面 endpoint → 当前机器路由/DNS → endpoint 来源限制 → 客户端网络 |
| kubectl Forbidden | Google 身份、IAM、RBAC;不要通过开放网段解决权限拒绝 |
| Pod 域名不通 | Pod 内 DNS 配置及 DNS 策略许可 → Service/EndpointSlice → 应用监听 |
| Service 没有后端 | selector 与 Pod 标签 → Pod Ready → targetPort |
| ImagePullBackOff | 镜像是否存在/架构支持 → 节点仓库权限 → 镜像仓库出站路径 |
| 扩容因 IP 失败 | 主范围、Pod 地址块、每节点 Pod 上限、 node pool 总数及 surge |
| 公网 LB 失败 | GKE 控制器事件 → NEG 后端 → 云端健康检查/防火墙 → Service 与应用 |
| Pod 访问数据库失败 | DNS/目标 IP → 路由和回程 → SNAT 后实际来源 → 网络策略 → TLS/数据库认证 |
port-forward 成功不验证 LB、ClusterIP 或出站 NAT 路径。网络排障