GKE升级后通过Kubernetes API代理访问Pod端口出现失效问题
问题根因
GKE升级到1.24及以上版本后,kube-apiserver默认启用了--enable-pod-proxy-path-strict特性开关,收紧了Pod代理路径的格式校验规则。你使用的/api/v1/namespaces/namespace/pods/podname:port/proxy/path/ 格式不符合官方最新的路径规范,因此直接返回400错误。
Docker Desktop、AKS、EKS等环境暂时未默认开启该特性开关,会兼容旧格式的请求,因此原有调用逻辑可以正常运行。其他K8s API不受该特性影响,因此你调用/api/v1/namespaces/namespace/secrets等接口无异常。
解决方案
将请求路径替换为K8s官方规范的Pod代理路径格式即可,支持两种写法:
- 写法1:通过query参数指定端口
路径格式:/api/v1/namespaces/{命名空间}/pods/{Pod名称}/proxy/{请求路径}?port={目标端口}
示例:原路径/api/v1/namespaces/prod/pods/order-svc:8080/proxy/api/list修改为/api/v1/namespaces/prod/pods/order-svc/proxy/api/list?port=8080 - 写法2:通过ports子资源指定端口
路径格式:/api/v1/namespaces/{命名空间}/pods/{Pod名称}/ports/{目标端口}/proxy/{请求路径}
示例:原路径/api/v1/namespaces/prod/pods/order-svc:8080/proxy/api/list修改为/api/v1/namespaces/prod/pods/order-svc/ports/8080/proxy/api/list
以上两种写法均支持直接填写Pod定义中的命名端口名称,不需要传入数字端口。
如果需要临时兼容旧格式调用,可在GKE集群控制面参数中关闭--enable-pod-proxy-path-strict特性开关,该兼容方案将在后续K8s版本中废弃,不建议长期使用。
内容的提问来源于stack exchange,提问作者Martin Skarsaune
相关产品推荐
相关产品推荐

