当前位置: 首页 > news >正文

ingress-nginx的443端口不监听了

现象:

服务器没有监听443端口,但是却能telnet通。

在 Kubernetes 中,当使用 hostPort 方式暴露 Ingress Controller(如 ingress-nginx 的 443 端口时,流量能够正常转发到 Pod,即使 系统层面(宿主机)没有直接监听该端口,这是由 Linux 内核网络机制 和 CNI(容器网络接口) 共同实现的。以下是详细解释:

客户端 → 访问 宿主机IP:443 → Linux 内核 DNAT 规则 → Pod 的 443 端口 → ingress-nginx 处理 → 后端 Service/Pod


1. hostPort 的工作原理

(1)hostPort 的本质

  • 当 Pod 配置了 hostPort: 443Kubernetes 的 CNI 插件(如 Calico、Flannel、Cilium)会在宿主机上设置网络规则,将宿主机的 443 端口的流量直接转发到 Pod 内的 443 端口。

  • 关键点

    • 宿主机没有真正的进程监听 443,但内核会通过 DNAT(目标地址转换) 将流量重定向到 Pod。

    • 类似于 docker run -p 443:443 的底层机制。

(2)流量转发流程

客户端 → 访问 宿主机IP:443 → Linux 内核 DNAT 规则 → Pod 的 443 端口 → ingress-nginx 处理 → 后端 Service/Pod

2. 底层实现:Linux 内核如何转发流量?

(1)iptables 规则(传统方式)

Kubernetes CNI 插件(如 kube-proxy)会创建 iptables 规则,将宿主机的 hostPort 流量转发到 Pod。

sudo iptables -t nat -L -n | grep "443"
示例输出:Chain KUBE-HOSTPORTS (1 references)
target     prot opt source     destination
KUBE-MARK-MASQ  tcp  --  0.0.0.0/0  0.0.0.0/0  tcp dpt:443
KUBE-HP-XXXXXX  tcp  --  0.0.0.0/0  0.0.0.0/0  tcp dpt:443
  • KUBE-HP-XXXXXX 会进一步将流量 DNAT 到 Pod IP + 容器端口。

(2)ipvs 模式(高性能场景)

如果 kube-proxy 使用 ipvs 模式,会通过 ipvsadm 管理转发规则:

sudo ipvsadm -Ln | grep "443"
TCP  192.168.1.100:443 rr-> 10.244.1.2:443            Masq    1      0      0
  • 192.168.1.100 是宿主机 IP,10.244.1.2 是 Pod IP。

(3)CNI 插件的实现

不同 CNI 插件(如 Calico、Cilium)可能会使用更高效的方式(如 eBPF)绕过 iptables,直接在内核层完成流量转发。


3. 为什么 netstat 看不到 443 端口监听?

运行 netstat -tulnp | grep 443 可能显示 无进程监听 443,但流量仍能到达 Pod,因为:

  1. hostPort 的流量由内核直接拦截,不依赖用户态进程。

  2. iptables/ipvs 规则在 PREROUTING 链处理,早于应用层监听检查。


4. 验证 hostPort 是否生效

(1)检查 Pod 是否绑定 hostPort

kubectl get pod -n ingress-nginx -o yaml | grep hostPort
​​​​​​​ports:
- containerPort: 443hostPort: 443protocol: TCP

(2)检查宿主机网络规则

# 查看 iptables 规则
sudo iptables -t nat -L -n | grep "443"# 查看 ipvs 规则(如果使用 ipvs 模式)
sudo ipvsadm -Ln

(3)测试流量是否可达

curl -v https://<宿主机IP> -k

  • 如果返回 ingress-nginx 的默认页面或后端服务响应,说明转发正常。


5. 常见问题

Q1:hostPort 和 NodePort 有什么区别?

特性hostPortNodePort
端口占用直接绑定宿主机端口(如 443)分配随机端口(30000-32767)
依赖组件CNI 插件 + 内核规则kube-proxy + iptables/ipvs
适用场景需要固定端口的场景(如 HTTPS)临时测试或云厂商 LB 代理

Q2:为什么 hostPort 不生效?

可能原因:

  1. CNI 插件不支持:某些 CNI(如 Flannel 的默认配置)可能不支持 hostPort

  2. 安全组/防火墙阻止:确保宿主机 443 端口开放。

  3. 端口冲突:宿主机已有其他进程占用 443。


6. 总结

  • hostPort: 443 的流量由 Linux 内核(通过 iptables/ipvs/eBPF)直接转发到 Pod,无需宿主机进程监听。

  • ingress-nginx 通过 hostPort 实现高性能入口流量代理,适合裸金属或需要固定端口的场景。

  • 生产环境建议结合 外部负载均衡(如 MetalLB、云厂商 LB) 实现高可用。

相关文章:

  • 百度怎么做公司的网站外贸营销网站制作公司
  • 微信小程序代码怎么弄山西优化公司
  • .net电影网站开发站长
  • 合肥网站推广电话排名公式
  • cms系统都有哪些简述seo
  • 网站添加白名单大数据营销推广精准粉
  • WPF/Net Core 简单显示PDF
  • HTML炫酷烟花
  • 【51单片机外部中断0控制流水灯2次】2022-5-4
  • 【大模型问题】ms-swift微调时,显存持续增长原因分析与解决方案
  • AIoT时代指纹模块的三大颠覆性进化
  • 论文阅读:2025 arxiv Qwen3 Technical Report
  • ros(一)使用消息传递图像+launch启动文件
  • Linux平台Oracle开机自启动设置
  • 【innovus基础】- 对某根线单独route
  • 基于深度学习的双色球智能预测系统:从原理到实现
  • Java并发编程中高效缓存设计的哲学
  • vscode 插件
  • AngularJS 待办事项 App
  • 【格与代数系统】示例
  • 关于 pdd:anti_content参数分析与逆向
  • leetcode83.删除排序链表中的重复元素
  • Java SE - 图书管理系统模拟实现
  • 数据标注师学习内容
  • leetcode82.删除排序链表中的重复元素II
  • 【格与代数系统】示例2