GCP如何将Kubernetes集群TCP负载均衡切换为HTTP(S)七层负载均衡
GCP GKE环境下ingress-nginx前端LB从四层TCP切换为七层HTTP(S)操作步骤
你当前默认部署生成TCP负载均衡的原因是:ingress-nginx Helm Chart默认将Controller Service设置为LoadBalancer类型,GCP云控制器会为这类Service默认创建四层TCP网络负载均衡。要切换为七层HTTP(S)负载均衡,按以下入门步骤操作即可:
前置检查
- 确认GKE集群版本≥1.17,支持网络端点组(NEG)能力,这是GCP七层LB对接Pod工作负载的必需条件
- 确认操作集群的账号拥有负载均衡创建、NEG管理、防火墙规则配置的对应权限
- 如果需要固定访问IP,提前在GCP控制台预留全局类型的静态公网IP(七层LB不支持区域IP);如果需要HTTPS,提前上传SSL证书或创建GCP托管证书
步骤1:清理现有ingress-nginx部署
先删除当前已部署的ingress-nginx实例,避免残留旧的四层LB资源占用配额,执行时替换为你实际的release名称和命名空间:
helm uninstall <你的ingress-nginx-release名称> -n <ingress部署的命名空间>
步骤2:重新部署ingress-nginx,适配七层LB对接配置
重新安装ingress-nginx时传入核心参数,将Controller Service调整为ClusterIP类型,开启NEG暴露,让GCP七层LB可以直接对接Pod端点。可以直接用以下Helm命令安装,按需注释/调整可选参数:
helm install ingress-nginx ingress-nginx/ingress-nginx \ -n ingress-nginx --create-namespace \ --set controller.service.type=ClusterIP \ --set controller.publishService.enabled=false \ --set controller.ingressClassResource.default=true \ --set controller.service.annotations."cloud\.google\.com/neg"='{"exposed_ports": {"80":{"name": "nginx-80-neg"},"443":{"name": "nginx-443-neg"}}}' \ # 可选:指定健康检查路径,避免七层LB健康检查失败 --set controller.service.annotations."cloud\.google\.com/healthcheck-path"="/healthz" \ --set controller.service.annotations."cloud\.google\.com/healthcheck-port"="10254"
步骤3:创建根Ingress触发GCP生成七层LB
GCP原生七层HTTP(S)负载均衡由GCE Ingress控制器自动管理,你需要创建一个根Ingress资源,将所有入口流量转发到ingress-nginx Controller,控制器收到资源后会自动创建对应的七层LB。
新建gcp-l7-ingress.yaml文件,内容如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gcp-l7-lb-root namespace: ingress-nginx annotations: # 指定使用GCP原生GCE Ingress控制器驱动七层LB kubernetes.io/ingress.class: "gce" # 可选:关闭HTTP访问,强制跳转HTTPS # kubernetes.io/ingress.allow-http: "false" # 可选:绑定GCP托管SSL证书,多个证书用逗号分隔 # networking.gke.io/managed-certificates: "你的托管证书名称" spec: # 可选:绑定提前预留的全局静态IP名称 # static-ip-name: "你的全局静态IP名称" defaultBackend: service: name: ingress-nginx-controller port: number: 80
执行命令应用配置:
kubectl apply -f gcp-l7-ingress.yaml
步骤4:验证配置生效
- 执行
kubectl get ingress gcp-l7-lb-root -n ingress-nginx,等待5-10分钟,当ADDRESS字段显示公网IP时,代表七层LB已经创建完成 - 进入GCP控制台负载均衡页面,确认新建负载均衡类型为HTTP(S)负载均衡,而非之前的TCP负载均衡
- 将业务域名解析到该LB的公网IP,访问验证业务流量正常转发即可
常见问题排查
- 如果LB长时间未分配IP,执行
kubectl describe ingress gcp-l7-lb-root -n ingress-nginx,查看Events栏的报错信息,常见问题包括权限不足、静态IP类型错误、证书不存在 - 如果访问LB返回502错误,先检查NEG端点健康状态:确认七层LB的健康检查配置和你在Service注解中指定的
/healthz路径、10254端口一致,且防火墙放通了LB健康检查的IP段 - 如果部分路径转发异常,检查你自己的业务Ingress规则是否正确关联了ingress-nginx的IngressClass
内容的提问来源于stack exchange,提问作者roliveira
相关产品推荐
相关产品推荐

