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: 443
,Kubernetes 的 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,因为:
-
hostPort
的流量由内核直接拦截,不依赖用户态进程。 -
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
有什么区别?
特性 | hostPort | NodePort |
---|---|---|
端口占用 | 直接绑定宿主机端口(如 443) | 分配随机端口(30000-32767) |
依赖组件 | CNI 插件 + 内核规则 | kube-proxy + iptables/ipvs |
适用场景 | 需要固定端口的场景(如 HTTPS) | 临时测试或云厂商 LB 代理 |
Q2:为什么 hostPort
不生效?
可能原因:
-
CNI 插件不支持:某些 CNI(如 Flannel 的默认配置)可能不支持
hostPort
。 -
安全组/防火墙阻止:确保宿主机 443 端口开放。
-
端口冲突:宿主机已有其他进程占用 443。
6. 总结
-
hostPort: 443
的流量由 Linux 内核(通过iptables/ipvs/eBPF
)直接转发到 Pod,无需宿主机进程监听。 -
ingress-nginx
通过hostPort
实现高性能入口流量代理,适合裸金属或需要固定端口的场景。 -
生产环境建议结合 外部负载均衡(如 MetalLB、云厂商 LB) 实现高可用。