GKE集群Web应用部署内部LB后VPN无法访问,需HTTPS配置,求解决方案
解决方案:GKE内部应用VPN访问+HTTPS配置
一、先排查VPN到内部LB的连通性问题
目前你已拿到内部LB的IP但无法从VPN访问,先从网络层面逐一排查:
检查VPC防火墙规则
确保VPC中存在允许企业VPN客户端CIDR访问内部LB端口(8080)的规则:- 目标范围选择内部LB所在子网的CIDR,或GKE节点的网络标签(比如
gke-<集群名>-node) - 来源设置为你的企业VPN客户端的CIDR段
- 协议选TCP,端口填8080
注意:GKE默认节点防火墙规则仅允许集群内部流量,需手动添加规则放行VPN流量。
- 目标范围选择内部LB所在子网的CIDR,或GKE节点的网络标签(比如
验证内部LB的网络归属与路由
确认内部LB的IP属于和VPN连接的VPC子网,同时检查VPN路由配置:确保VPN已将内部LB所在子网的CIDR路由推送给客户端,或客户端路由表包含该子网条目。测试节点与Pod的可达性
- 从VPN客户端ping内部LB的IP,若不通,先排查VPN链路本身的连通性(比如ping VPC内其他资源)
- 若能ping通LB IP但无法访问8080端口,登录GKE节点执行
curl <Pod-IP>:8080验证Pod是否正常,同时检查节点防火墙是否拦截VPN流量。
二、配置访问控制,确保仅VPN可访问
解决连通性后,严格限制访问来源:
细化防火墙规则
将之前添加的VPC防火墙规则来源严格限定为企业VPN的CIDR,避免其他来源流量访问。部署Kubernetes Network Policy
在Pod层面添加防护,即使防火墙规则疏漏,也能阻止非VPN流量:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: restrict-vpn-only-access spec: podSelector: matchLabels: app: ilb-deployment policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 10.0.0.0/16 # 替换为你的企业VPN客户端CIDR ports: - protocol: TCP port: 8080执行
kubectl apply -f <policy-file.yaml>生效。
三、配置有效HTTPS证书
要实现HTTPS访问,需结合Ingress和证书管理工具:
1. 安装Cert-Manager(以Helm为例)
若用Let's Encrypt签发证书,先在GKE集群安装Cert-Manager:
helm repo add jetstack https://charts.jetstack.io helm repo update helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.13.0 --set installCRDs=true
2. 创建ClusterIssuer(Let's Encrypt示例)
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: your-email@yourcompany.com # 替换为你的邮箱 privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: gke-internal # 使用GKE内部Ingress类
执行kubectl apply -f <cluster-issuer.yaml>。
3. 部署内部Ingress(带HTTPS)
替换原有纯TCP的内部LB,用Ingress实现SSL终止:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ilb-https-ingress annotations: networking.gke.io/load-balancer-type: "Internal" cert-manager.io/cluster-issuer: "letsencrypt-prod" # 对应上面的ClusterIssuer名称 spec: tls: - hosts: - app.internal.yourcompany.com # 替换为你的内部域名 secretName: app-tls-secret # 证书会自动存到这个Secret里 rules: - host: app.internal.yourcompany.com http: paths: - path: / pathType: Prefix backend: service: name: ilb-svc port: number: 8080
执行kubectl apply -f <ingress-file.yaml>,等待Cert-Manager签发证书、Ingress分配内部IP。
4. 域名解析与客户端配置
- 将配置的内部域名解析到Ingress的内部IP(通过企业内部DNS服务器配置)
- 若使用企业内部CA签发证书,需在VPN客户端设备上安装CA根证书,确保浏览器信任该证书。
内容的提问来源于stack exchange,提问作者Asis
相关产品推荐
相关产品推荐

