三种占用节点端口的方式
这三种配置都让容器能从节点地址被访问,但层次完全不同:一种是把单个容器端口映射到节点端口,一种是整个 Pod 共享节点网络栈,还有一种是由服务对象在每个节点开放固定端口。层次不同,调度约束、端口冲突风险与安全暴露面差别很大。
基本信息
| 适用平台 | Kubernetes 1.20+ |
|---|---|
| 调度影响 | 端口映射与共享网络栈都会带来节点级约束 |
| 排查工具 | 节点上的监听查看与进程查看 |
| 安全影响 | 监听范围取决于是否限制绑定地址 |
| 优先建议 | 能用服务对象表达,就不要直接占用节点端口 |
典型使用场景
- 网络插件与控制面组件需要直接使用节点网络
- 监控采集器需要访问节点本地端口
- 传统应用改造期需要保持原有端口暴露方式
- 临时把服务暴露给同网段调试,之后收回
- 排查端口冲突:确认是哪个对象占用了节点端口
三种方式对照
| 方式 | 含义 | 注意点 |
|---|---|---|
| 端口映射 | 容器端口映射到节点端口 | 端口冲突会导致调度失败,绕过服务对象体系 |
| 共享节点网络 | Pod 与节点共用网络栈 | 端口直接占用节点,解析配置需专门声明 |
| 节点端口服务 | 由转发规则在每个节点开放端口 | 端口范围固定,具备负载均衡语义 |
排查端口占用
排查端口占用
kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}/{.metadata.name} {.spec.hostNetwork} {.spec.containers[*].ports[*].hostPort}{"\n"}{end}' | grep -v ' false $'
ss -lntp | grep <端口> # 节点上谁在监听该端口
kubectl describe pod <名称> | grep -A3 'Host Port' # 对象的端口映射
kubectl get svc -A -o wide | grep <端口> # 是否被服务对象占用端口映射把工作负载绑定到具体节点资源:副本数、扩缩容与滚动更新都受端口数量限制,负载均衡也要靠上游自行处理。能用服务对象表达的需求,尽量不用它。
不限制绑定地址时,端口会监听在所有网卡上。原本只是给同机进程或内网使用的端口,会变成整张网络都能访问,暴露面明显扩大。