自建k8s集群,如何修改ingress对外访问的端口为80端口

如果让ingress通过域名或服务器公网ip对外访问,需要创建NodePort类型的ingress规则,然后在浏览器里通过http://公网ip:30080 或 https://公网ip:30443 这种方式访问,后面必须要带一个30000到32767之间的端口,如何让ingress不带端口访问呢,像普通域名一样不需要带端口访问呢?

解决方案是,使用 hostNetwork 模式,直接监听宿主机的80 / 443 端口。

步骤:

一、前置校验(避免端口占用失败)

1)关闭宿主机占用 80/443 的服务

# ubuntu/debian
systemctl stop nginx apache2
systemctl disable nginx apache2

 

2)防火墙放行端口

ufw allow 80/tcp
ufw allow 443/tcp

 

3)验证端口监听

80 / 443 端口占用会导致修改后ingress pod运行失败,一定要停掉占用端口的服务。

# Ubuntu/Debian
apt update && apt install lsof -y

# CentOS 7/8/9
yum install lsof -y

查询 80443
# 分别查
lsof -i :80
lsof -i :443

# 一条命令同时查80、443
lsof -i :80 -i :443

 

有输出 = 端口被占用;无输出 = 空闲

 

二、修改 Deployment 开启宿主机 80/443 端口

1、先备份原有配置(必做)

kubectl get deploy ingress-nginx-controller -n ingress-nginx -o yaml > ingress-controller-bak.yaml

 

2、打开编辑器

kubectl edit deploy ingress-nginx-controller -n ingress-nginx

 

找到 spec.template.spec 这一层,当前内容:

    spec:
      containers:
      - args:
        ...省略...
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        - containerPort: 443
          name: https
          protocol: TCP
        - containerPort: 8443
          name: webhook
          protocol: TCP
        ...省略...
      dnsPolicy: ClusterFirst

 

image

 

3、修改模板 spec(两处核心改动)

修改 1:开启 hostNetwork + 修正 dnsPolicy

dnsPolicy: ClusterFirst 上方新增 hostNetwork: true,并把 dnsPolicy 改为 ClusterFirstWithHostNet

把 hostNetwork: true 增加在spec.template.spec下层,跟dnsPolicy平级。

    spec:
      hostNetwork: true        # 新增,共享宿主机网络栈
      dnsPolicy: ClusterFirstWithHostNet  # 修改原来的ClusterFirst
      containers:

 

image

 

修改 2:spec.template.spec.ports 增加 hostPort 绑定宿主机端口

        ports:
        - containerPort: 80
          hostPort: 80          # 新增,绑定宿主机80
          name: http
          protocol: TCP
        - containerPort: 443
          hostPort: 443         # 新增,绑定宿主机443
          name: https
          protocol: TCP
        - containerPort: 8443
          name: webhook
          protocol: TCP

 

image

完整修改后的template.spec 片段参考:

  template:
    metadata:
      annotations:
        kubectl.kubernetes.io/restartedAt: "2026-07-24T09:36:51+08:00"
      creationTimestamp: null
      labels:
        app.kubernetes.io/component: controller
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
        app.kubernetes.io/version: 1.10.1
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - args:
        - /nginx-ingress-controller
        ...省略...
        ports:
        - containerPort: 80
          hostPort: 80
          name: http
          protocol: TCP
        - containerPort: 443
          hostPort: 443
          name: https
          protocol: TCP
        - containerPort: 8443
          name: webhook
          protocol: TCP

 

 保存退出后,deployment 会自动滚动重建 Pod。

 

三、验证 Pod 是否启用 hostNetwork

kubectl get pods -n ingress-nginx -o yaml | grep hostNetwork

 

输出 hostNetwork: true 代表配置生效


四,测试不带端口访问

更改之前(带端口)

http://公网ip或域名:30080/v1

更改之后(不带端口 )

http://公网ip或域名/v1

 

如果访问不通,云服务器安全组端口放行

image

五、清理无用 NodePort Service(可选,可以不用删) 

kubectl delete svc ingress-nginx-controller -n ingress-nginx

 

posted @ 2026-07-25 17:11  民工黑猫  阅读(2)  评论(0)    收藏  举报