You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Nginx Ingress实现无端口访问Kubernetes中的Nginx Web服务

如何配置Nginx Ingress实现无端口访问Kubernetes中的Nginx Web服务

看起来你已经搭好了基础的Ingress框架,但没生效的核心原因是缺少HTTPS/TLS配置,还有后端访问的细节没处理到位。我来一步步帮你搞定这个问题:

先理清几个关键前提

  1. 确认你的Nginx Ingress Controller已经正常部署,它的Service(一般叫nginx-ingress-controller)已经暴露了80和443端口(不管是NodePort还是LoadBalancer类型)。同时你的域名server_domain_name要正确解析到Ingress Controller的IP——如果是NodePort就解析到任意集群节点IP,LoadBalancer的话就解析到LB的公网IP。
  2. 你的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

第三步:应用配置并验证

  1. 应用修改后的资源:
kubectl apply -f your-service.yaml
kubectl apply -f your-deployment.yaml
kubectl apply -f your-ingress.yaml
  1. 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 15:12:52