如何为GKE内部负载均衡器(Internal Load Balancer)配置SSL证书以实现内部HTTPS端点
嗨,我完全理解你的需求——给GKE里的内部负载均衡器配上HTTPS,同时严格保持服务只在GCP内部可见,不对外暴露。这在企业内部服务、跨VPC内部访问的场景里太实用了,下面给你几个靠谱的方案:
方案一:用GKE内部Ingress搭配内部SSL证书(推荐)
你之前试过Ingress但担心暴露到公网?其实GKE有专门的内部Ingress,它只会绑定到你的VPC内部IP,完全不会对外网开放。搭配内部SSL证书就能实现安全的内部HTTPS访问:
创建内部SSL证书
你有两种选择:- 用GCP证书管理器申请内部可信证书:适合有内部域名(比如
internal.yourcompany.com)的场景,证书会被GCP内部资源自动信任。 - 生成自签证书:如果只是测试或者小型内部场景,用
openssl生成即可,之后要把根证书分发给内部客户端才能避免警告。
把证书和密钥存成Kubernetes Secret:
kubectl create secret tls internal-ingress-tls --cert=./tls.crt --key=./tls.key- 用GCP证书管理器申请内部可信证书:适合有内部域名(比如
配置内部Ingress资源
写一个Ingress YAML,重点要加上内部Ingress的标识,确保它不会变成公网Ingress:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: internal-ingress annotations: # 针对GKE 1.20及以下版本用这个注解 kubernetes.io/ingress.class: "gce-internal" # GKE 1.21+推荐用spec.ingressClassName替代上面的注解 spec: # 1.21+版本添加这行 # ingressClassName: "gce-internal" tls: - hosts: - internal.yourcompany.com secretName: internal-ingress-tls rules: - host: internal.yourcompany.com http: paths: - path: / pathType: Prefix backend: service: name: your-internal-service port: number: 80应用这个配置后,GKE会创建一个内部IP的Ingress,只有VPC内的机器能访问。
验证访问
在VPC内的GCP VM或者容器里,用curl https://internal.yourcompany.com测试,确认HTTPS正常且证书有效。
方案二:直接给内部LB Service配置SSL(无需Ingress)
如果你不想用Ingress,也可以直接在Pod层面处理SSL终止,让内部LB直接转发HTTPS流量:
创建SSL证书Secret
和方案一一样,先把证书和密钥存成Secret:kubectl create secret tls internal-service-tls --cert=./tls.crt --key=./tls.key修改Deployment,让应用启用HTTPS
更新你的Deployment配置,把Secret挂载到容器里,同时配置应用使用证书和密钥监听443端口。比如如果是Nginx应用,挂载证书到/etc/nginx/ssl,然后修改Nginx配置启用HTTPS。更新内部LB Service
修改Service的端口配置,把外部端口和目标端口都改成443:apiVersion: v1 kind: Service metadata: name: your-internal-service annotations: cloud.google.com/load-balancer-type: "Internal" spec: type: LoadBalancer ports: - port: 443 targetPort: 443 protocol: TCP selector: app: your-app这样内部LB就会把HTTPS流量直接转发到Pod的443端口,全程保持内部访问。
方案三:用GCP私有CA签发可信证书(企业级场景)
如果是企业内部环境,追求更高的安全性和可信性,可以用GCP的私有CA服务签发内部证书。这种证书会被GCP的VM、容器等内部资源自动信任,不需要客户端手动导入根证书:
- 在GCP控制台创建私有CA(或者对接企业现有内部CA)。
- 为你的内部域名申请证书,导入到Kubernetes Secret或者GCP证书管理器。
- 不管用Ingress还是直接Service,都用这个可信证书配置HTTPS即可。
关键注意事项
- 避免公网暴露:用内部Ingress时一定要加对
ingress.class注解或者ingressClassName,否则会默认创建公网Ingress。 - 内部域名映射:可以用GCP内部DNS把内部LB的IP映射到自定义内部域名,方便内部用户访问。
- 防火墙规则:确保VPC防火墙允许内部流量访问443端口,否则会出现连接超时。
备注:内容来源于stack exchange,提问作者Aditya

