如何配置Nginx Ingress实现无端口访问Kubernetes中的Nginx Web服务
如何配置Nginx Ingress实现无端口访问Kubernetes中的Nginx Web服务
看起来你已经搭好了基础的Ingress框架,但没生效的核心原因是缺少HTTPS/TLS配置,还有后端访问的细节没处理到位。我来一步步帮你搞定这个问题:
先理清几个关键前提
- 确认你的Nginx Ingress Controller已经正常部署,它的Service(一般叫
nginx-ingress-controller)已经暴露了80和443端口(不管是NodePort还是LoadBalancer类型)。同时你的域名server_domain_name要正确解析到Ingress Controller的IP——如果是NodePort就解析到任意集群节点IP,LoadBalancer的话就解析到LB的公网IP。 - 你的Pod和Service端口映射有点绕:现在Service的
targetPort指向了Pod的hostPort(30443),但Kubernetes的Service本来就该直接访问Pod的容器端口(443),hostPort会限制Pod的调度灵活性,除非你有特殊需求,否则建议去掉。
第一步:调整Service和Deployment的端口配置(可选但推荐)
先把端口关系理顺,避免不必要的坑:
修改Service片段
kind: Service # 其他配置保持不变 ports: - port: 443 targetPort: 443 # 直接指向Pod的containerPort protocol: TCP name: https
修改Deployment片段
去掉hostPort和hostIP,让Pod以Kubernetes标准方式提供服务:
kind: Deployment # 其他配置保持不变 containers: - # 其他容器配置不变 ports: - containerPort: 443 protocol: TCP
第二步:配置TLS证书并更新Ingress
要通过https://server_domain_name访问,必须给Ingress配置TLS证书——你可以用自签证书做测试,也可以用Let's Encrypt生成免费的正式证书。
1. 创建TLS Secret
如果是自签证书,先生成证书文件,再执行命令创建Secret:
kubectl create secret tls my-tls-secret --cert=./your-cert.crt --key=./your-cert.key
如果用Let's Encrypt,可以搭配Cert-Manager自动签发,这里先以手动创建为例。
2. 编写正确的Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" # 自动把HTTP请求重定向到HTTPS nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" # 告诉Ingress用HTTPS访问后端服务 spec: ingressClassName: nginx # TLS配置,绑定域名和证书Secret tls: - hosts: - server_domain_name secretName: my-tls-secret rules: - host: server_domain_name # 必须和TLS里的host完全一致 http: paths: - path: / pathType: Prefix backend: service: name: my-service # 替换成你的实际Service名称 port: number: 443
第三步:应用配置并验证
- 应用修改后的资源:
kubectl apply -f your-service.yaml kubectl apply -f your-deployment.yaml kubectl apply -f your-ingress.yaml
- 检查Ingress状态:
kubectl get ingress my-ingress
如果ADDRESS字段有值,说明Ingress已经正确关联到Ingress Controller。
3. 测试访问:
直接用浏览器或者curl访问https://server_domain_name,应该就能正常打开你的服务了。
为什么之前的配置不生效?
- 原Ingress只配置了HTTP规则,没有处理HTTPS的TLS部分,Ingress Controller不会自动为域名启用HTTPS。
- 没加
backend-protocol: HTTPS注解,Ingress Controller会默认用HTTP去访问你的后端Service,而你的后端是HTTPS服务,自然会出现502错误。
备注:内容来源于stack exchange,提问作者John Brown
相关产品推荐
相关产品推荐

