You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动