自建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 查询 80、443 # 分别查 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

3、修改模板 spec(两处核心改动)
修改 1:开启 hostNetwork + 修正 dnsPolicy
在 dnsPolicy: ClusterFirst 上方新增 hostNetwork: true,并把 dnsPolicy 改为 ClusterFirstWithHostNet
把 hostNetwork: true 增加在spec.template.spec下层,跟dnsPolicy平级。
spec: hostNetwork: true # 新增,共享宿主机网络栈 dnsPolicy: ClusterFirstWithHostNet # 修改原来的ClusterFirst containers:

修改 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

完整修改后的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
如果访问不通,云服务器安全组端口放行

五、清理无用 NodePort Service(可选,可以不用删)
kubectl delete svc ingress-nginx-controller -n ingress-nginx

浙公网安备 33010602011771号