私有网络Kubernetes NGINX Ingress无主机配置HTTPS及SSL卸载实现
在私有Kubernetes环境实现无Host规则的HTTPS Ingress(SSL卸载)
没问题,完全可以在私有网络的Kubernetes NGINX Ingress Controller中启用HTTPS,并且不需要定义Host规则就能实现你要的功能——当用户访问https://192.168.1.1时,在Ingress层完成SSL卸载。
为什么你之前的配置不生效?
你之前的配置里指定了hosts: example.com,但用户访问的是IP地址192.168.1.1,请求的Host头要么是空,要么是这个IP,根本匹配不上example.com,所以Ingress不会用你的SSL证书,自然无法生效。
解决方案步骤
1. 准备SSL证书及Kubernetes Secret
因为是私有网络,自签证书完全够用。如果还没有证书,用openssl生成一个CN为目标IP的证书:
# 生成自签证书,CN设为你的访问IP 192.168.1.1 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=192.168.1.1" # 将证书导入Kubernetes Secret kubectl create secret tls my-secret --key tls.key --cert tls.crt
2. 编写正确的Ingress配置
核心是不指定Host规则,同时让TLS配置匹配IP请求。这里有两种可选配置方式:
方式一:完全不指定Host(匹配所有无Host头的请求)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: internal-https-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" # 强制HTTP请求跳转到HTTPS nginx.ingress.kubernetes.io/ssl-passthrough: "false" # 明确启用SSL卸载(默认值就是false,可省略) spec: tls: - secretName: my-secret # 这里不要加hosts字段,让Secret作为默认证书生效 rules: - http: paths: - path: / pathType: Prefix backend: service: name: my-cluster-service port: number: 80
方式二:指定IP作为Host(更精准匹配)
如果你想只匹配针对192.168.1.1的请求,可以把IP加到TLS的hosts里:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: internal-https-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: tls: - hosts: - 192.168.1.1 # 直接用访问IP作为Host secretName: my-secret rules: - host: 192.168.1.1 # 规则也匹配这个IP的Host头 http: paths: - path: / pathType: Prefix backend: service: name: my-cluster-service port: number: 80
3. 应用配置并验证
# 应用Ingress配置 kubectl apply -f ingress.yaml # 测试HTTPS访问(--insecure跳过自签证书验证) curl -v https://192.168.1.1 --insecure
关键注意事项
- 确保
192.168.1.1是NGINX Ingress Controller的Service IP(比如内部LoadBalancer IP或者NodePort映射的节点IP)。 - 如果你的Kubernetes集群版本较旧,可能需要用
extensions/v1beta1作为Ingress的apiVersion,但强烈建议升级到networking.k8s.io/v1(K8s 1.19+支持)。 - 生产环境如果需要可信证书,可以用私有CA签发证书,避免客户端出现证书警告。
内容的提问来源于stack exchange,提问作者Patric
相关产品推荐
相关产品推荐

