hostNetwork 和 docker-proxy

摘要

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,并调整 dnsPolicyClusterFirstWithHostNet
  • 控制器行为:StatefulSet 控制器不会自动打开 hostNetwork,所有网络模式都完全遵循 PodSpec。

如需进一步探讨网络隔离、安全策略或 DNS 配置,欢迎继续交流!

docker-proxy

这两行输出是你在宿主机上用 ps -ef | grep 3714 查到的进程信息,具体含义如下:

  1. /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)。
  2. grep --color=auto 3714

    • 这是你执行 ps -ef | grep 3714 时,管道中用来过滤出包含 “3714” 字符串的那条 grep 命令本身。
    • 它出现在结果里是因为 ps 列出了所有进程,而 grep 3714 也匹配了自身命令行。

小结docker-proxy 负责把宿主机的指定端口(这里是 9090)和容器内部的端口做转发,保证外部(或其他容器)可以通过宿主机 IP:端口访问到容器服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值