Kubernetes集群中Nginx Ingress能否支持80、443、10443端口访问服务?
能否用Nginx Ingress实现多端口(80/443/10443)访问服务?
当然可以搞定!Nginx Ingress Controller完全支持多端口暴露服务,80、443这些默认的HTTP/HTTPS端口不在话下,10443这种自定义端口也能轻松配置,下面我给你捋清楚具体步骤和注意事项:
第一步:调整Nginx Ingress Controller的端口配置
默认的Ingress Controller部署只会暴露80和443端口,所以我们需要先修改它的Service(一般是LoadBalancer或NodePort类型),添加10443端口的映射:
apiVersion: v1 kind: Service metadata: name: nginx-ingress-controller namespace: ingress-nginx # 注意你的Ingress Controller所在的命名空间 spec: type: LoadBalancer # 根据你的集群环境选择,NodePort也可以 ports: - name: http port: 80 targetPort: 80 protocol: TCP - name: https port: 443 targetPort: 443 protocol: TCP - name: custom-https port: 10443 targetPort: 10443 protocol: TCP selector: app.kubernetes.io/name: nginx-ingress app.kubernetes.io/instance: nginx-ingress # 匹配你的Ingress Controller Pod标签
接下来还要让Nginx本身监听10443端口,我们可以通过给Ingress Controller的ConfigMap添加自定义配置:
apiVersion: v1 kind: ConfigMap metadata: name: nginx-ingress-controller namespace: ingress-nginx data: server-snippet: | server { listen 10443 ssl; server_name _; ssl_certificate /etc/ingress-controller/ssl/default-fake-certificate.pem; ssl_certificate_key /etc/ingress-controller/ssl/default-fake-certificate.pem; # 这里可以加通用的配置,比如日志、超时等 }
第二步:配置Ingress资源对应不同端口
针对80/443的常规服务
直接写标准的Ingress配置即可,和平时用法一样:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: default-apps-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: ingressClassName: nginx tls: - hosts: - your-domain.com secretName: your-domain-tls # 替换成你的SSL证书Secret rules: - host: your-domain.com http: paths: - path: /app1 pathType: Prefix backend: service: name: app1-service port: number: 80
针对10443端口的服务
创建单独的Ingress资源,用nginx.ingress.kubernetes.io/listen-ports注解指定监听10443端口:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: custom-port-app-ingress annotations: nginx.ingress.kubernetes.io/listen-ports: '[{"port":10443,"protocol":"HTTPS"}]' nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: ingressClassName: nginx tls: - hosts: - your-domain.com secretName: your-domain-tls rules: - host: your-domain.com http: paths: - path: /app2 pathType: Prefix backend: service: name: app2-service port: number: 80
这样配置后,用户访问https://your-domain.com:10443/app2就会被路由到app2-service,而https://your-domain.com/app1则走默认的443端口。
注意:如果用的是云服务商的LoadBalancer,需要确保负载均衡器的安全组/规则允许10443端口的流量;如果是NodePort,要确保集群节点的防火墙开放10443端口。
替代方案(如果Nginx Ingress不满足需求)
如果因为某些特殊限制(比如集群环境不允许修改Ingress Controller配置),可以考虑这些替代方案:
- NodePort服务:直接给需要暴露的服务配置NodePort类型的Service,指定
nodePort: 10443,缺点是会占用每个节点的端口,适合少量服务。 - 独立LoadBalancer服务:给每个需要特殊端口的服务单独创建LoadBalancer类型的Service,每个服务分配独立端口,缺点是成本较高(每个LoadBalancer都是独立资源)。
- Traefik Ingress:和Nginx Ingress类似,支持多端口监听,配置逻辑大同小异。
- Kubernetes Gateway API:官方新一代网关API,支持更灵活的端口和路由配置,适合复杂的多端口场景。
内容的提问来源于stack exchange,提问作者alinaio




