目录标题
摘要
StatefulSet(STS)所创建的 Pod 并不会默认使用宿主机网络命名空间;它们和普通的 Pod 一样,默认运行在独立的(“Pod 网络”)命名空间中,只有在其 PodSpec 中显式设置 hostNetwork: true
时,才会切换到使用宿主机网络。STS 控制器本身并不会对网络模式做特殊处理,也不会为 StatefulSet Pod 强制启用 hostNetwork。
1. Kubernetes Pod 的网络模式由 PodSpec 决定
- 在 Kubernetes 中,是否使用宿主机网络(Host Networking)是由 Pod 的
spec.hostNetwork
字段控制的,默认值为false
。当hostNetwork: true
时,Pod 将与节点共享网络命名空间;否则,Pod 运行在独立的网络命名空间中。 (Manifests.io) - 这一设定同样适用于所有通过任何控制器(包括 StatefulSet、Deployment、DaemonSet 等)创建的 Pod,控制器不会自动将
hostNetwork
打开,需要在 Pod 模板里手动配置。 (Kubernetes)
2. StatefulSet 的网络身份与 hostNetwork 无关
- StatefulSet 提供的 “稳定网络标识”(stable network identity)是通过为每个 Pod 分配有序的名字(如
web-0
,web-1
)和配合 Headless Service 实现的 DNS 记录,而 并非通过 hostNetwork。 (Kubernetes) - 即使开启了
hostNetwork
,Pod 的 hostname 也会退化为节点名(见 issue #55404),并不会保留 StatefulSet 分配的有序主机名,这也是一个已知的行为差异。 (GitHub)
3. 如何在 StatefulSet 中启用 hostNetwork
如果确实需要让 StatefulSet Pod 使用宿主机网络,必须在 StatefulSet.spec.template.spec
段中显式配置:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: example-sts
spec:
serviceName: "example"
replicas: 3
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
hostNetwork: true # <—— 启用 hostNetwork
dnsPolicy: ClusterFirstWithHostNet # 推荐同时调整 DNS 策略
containers:
- name: ...
image: ...
- 配置
hostNetwork: true
后,Pod 会直接使用节点的 IP、网络接口和端口。 (Manifests.io) - 同时,建议将
dnsPolicy
设为ClusterFirstWithHostNet
,以避免 DNS 查询行为退回到Default
政策。 (Kubernetes)
4. 与 DaemonSet 的对比
- DaemonSet 常用于在每个节点上部署一份 Pod(如日志收集 or 网络代理),有时也会配合 hostNetwork 使用,但这与 StatefulSet 的用途和网络模式是两回事。 (Medium)
- 如果你的目标是在每个节点上运行一个有序的、带有持久标识的 Pod,且都使用宿主机网络,则需要自己在 StatefulSet spec 中加上
hostNetwork: true
。 (loft.sh)
小结
- 默认情况:STS Pod 在独立网络命名空间中,和宿主机网络隔离。
- 手动开启:在
spec.template.spec
中显式加hostNetwork: true
,并调整dnsPolicy
为ClusterFirstWithHostNet
。 - 控制器行为:StatefulSet 控制器不会自动打开 hostNetwork,所有网络模式都完全遵循 PodSpec。
如需进一步探讨网络隔离、安全策略或 DNS 配置,欢迎继续交流!
docker-proxy
这两行输出是你在宿主机上用 ps -ef | grep 3714
查到的进程信息,具体含义如下:
-
/usr/bin/docker-proxy --proto tcp --host-ip 0.0.0.0 --host-port 9090 --container-ip 172.x.x.7 --container-port 9090
- 这是 Docker 启动的一个 docker-proxy 进程,用于在宿主机和容器之间做 TCP 端口转发。
--host-ip 0.0.0.0 --host-port 9090
:表示在宿主机的所有网卡(0.0.0.0)上监听 9090 端口。--container-ip 172.22.22.7 --container-port 9090
:表示将收到的数据透传到容器内网 IP 172.22.22.7 的 9090 端口上。- 这个进程是由 Docker 在你运行
docker run -p 9090:9090
(或等效的docker-compose
配置)时自动创建的,用来实现端口映射(Port Mapping)。
-
grep --color=auto 3714
- 这是你执行
ps -ef | grep 3714
时,管道中用来过滤出包含 “3714” 字符串的那条grep
命令本身。 - 它出现在结果里是因为
ps
列出了所有进程,而grep 3714
也匹配了自身命令行。
- 这是你执行
小结:docker-proxy
负责把宿主机的指定端口(这里是 9090)和容器内部的端口做转发,保证外部(或其他容器)可以通过宿主机 IP:端口访问到容器服务。