CRI (containerd/CRI-O) + hostNetwork

在 Kubernetes 1.24 中移除了 Dockershim,转而使用 CRI(如 containerd 或 CRI-O)来管理容器运行时;此时若在 PodSpec 中设置 hostNetwork: true,Pod 就会跳过独立网络命名空间的创建,直接附着到节点的网络命名空间上,容器进程绑定的端口和接口即为宿主机的端口和接口,无需中间的代理或 DNAT 规则。下面分几部分详细说明这一机制在 “无 Docker” 环境下的实现原理。


1. Docker Shim 移除与 CRI 架构变更

  • Dockershim 移除
    Kubernetes 1.24 正式删除了对 Docker Engine 作为容器运行时的原生支持(Dockershim)(Kubernetes)。
  • CRI 取代方案
    当前主流集群通常采用 containerd 或 CRI-O,通过 Kubelet 的 CRI 接口管理容器生命周期与网络命名空间(Network Namespace)(Kubernetes)。

2. hostNetwork: true 的网络暴露原理

  • 共享网络命名空间
    hostNetwork: true 时,Kubelet 不会为 Pod sandbox 创建独立的网络命名空间,而是让其共享所在节点的网络命名空间——容器的 eth0、IP、路由等即为主机的(support.huaweicloud.com)。
  • 直接绑定宿主机接口
    容器里应用监听的端口直接绑定到宿主机的网络接口,等同在宿主机上启动该进程;访问时使用节点 IP + 对应端口即可命中容器服务,无需 Docker-proxy 或 iptables DNAT 规则(腾讯云, GitHub)。
  • 跳过 CNI 插件
    对于 hostNetwork 模式,CNI 插件通常不对网络进行额外配置,因为不需要创建或设置独立的网络命名空间(tetrate.io, tigera.io)。

3. CRI-O / containerd 中的实现流程

  1. Pod 调度与沙箱创建
    Kubelet 调用 CRI(containerd 或 CRI-O)创建一个 Pod-level 的沙箱容器(Pause Container),并准备网络命名空间。此步骤在非 hostNetwork 时会通过 CNI 创建独立命名空间(博客园)。
  2. HostNetwork 跳过
    如果检测到 hostNetwork: true,CRI 直接将沙箱和后续应用容器附加到节点的默认网络命名空间,不执行 CNI 的网络 namespace 配置(support.huaweicloud.com)。
  3. 容器启动与端口绑定
    应用容器在此共享的命名空间中启动,监听的端口即为宿主机接口上的端口。容器运行时(containerd/cri-o + crun/runc)直接调用 bind() 到宿主机接口,无需任何中间转发(GitHub, GitHub)。

4. 与旧有 Docker-proxy 方案的对比

特性Docker + docker-proxyCRI (containerd/CRI-O) + hostNetwork
端口转发通过独立进程 /usr/bin/docker-proxy 或者 iptables DNAT 实现直接在容器进程中绑定宿主机接口,无额外代理或 DNAT
性能与延迟存在一层进程/iptables 转发开销无额外转发环节,性能更优
网络隔离Pod 仍在独立网络命名空间,通过 hostPort 或 Proxy 暴露端口无隔离,容器与宿主机、其他 hostNetwork Pod 共享网络
CNI 插件参与度通常不影响 CNI 配置不调用 CNI 插件,跳过网络 namespace 及 IPAM 配置

5. 典型使用场景与注意事项

  • 高性能网络服务
    需要最低延迟或较大带宽的场景(如网络探针、监控代理)常用此模式。
  • 端口冲突与安全风险
    多个 Pod 或宿主机进程监听同一端口会导致冲突;且失去网络隔离,必须谨慎评估安全边界。
  • DNS 策略
    若同时使用内部服务发现,建议将 dnsPolicy 设置为 ClusterFirstWithHostNet,确保能正确解析集群内服务名。

参考文献

  1. Kubernetes 1.24 将移除 Dockershim,转而使用 containerd/CRI-O(Kubernetes)
  2. CRI 支持的多种容器运行时(containerd, CRI-O, Docker Engine)概述(Kubernetes)
  3. Kubernetes 的 hostNetwork 用法与示例(华为云文档)(support.huaweicloud.com)
  4. hostNetwork vs hostPort 区别与示例(腾讯云社区)(腾讯云)
  5. CRI-O 端口绑定问题讨论:无需 docker-proxy 即可直接绑定(GitHub)
  6. CNI 插件在 hostNetwork 情况下的跳过逻辑(Tetrate 博客)(tetrate.io)
  7. CNI 基本原理:网络命名空间与 IP 分配流程(tigera.io)
  8. containerd-cri 工作架构:网络命名空间由 CNI 负责配置(博客园)
  9. CRI-O 文档:与 Kubelet 集成的运行时网络处理(GitHub)
  10. Dockershim 移除影响及替代建议(阿里云 ACK Release Notes)(alibabacloud.com)
[root@his ~]# kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.25.0 --apiserver-advertise-address=192.168.8.109 [init] Using Kubernetes version: v1.25.0 [preflight] Running pre-flight checks [WARNING Hostname]: hostname "his" could not be reached [WARNING Hostname]: hostname "his": lookup his on 192.168.8.254:53: no such host error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR CRI]: container runtime is not running: output: E0714 18:14:51.757340 11481 remote_runtime.go:616] "Status from runtime service failed" err="rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing dial unix /var/run/containerd/containerd.sock: connect: no such file or directory\"" time="2023-07-14T18:14:51+08:00" level=fatal msg="getting status of runtime: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing dial unix /var/run/containerd/containerd.sock: connect: no such file or directory\"" , error: exit status 1 [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1 [ERROR KubeletVersion]: the kubelet version is higher than the control plane version. This is not a supported version skew and may lead to a malfunctional cluster. Kubelet version: "1.27.3" Control plane version: "1.25.0" [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higher
07-15
根据您提供的命令输出,您在执行`kubeadm init`命令时遇到了一些错误。让我们逐个来解决这些问题: 1. [WARNING Hostname]: hostname "his" could not be reached [WARNING Hostname]: hostname "his": lookup his on 192.168.8.254:53: no such host 这个警告意味着您的主机名无法解析。您可以通过编辑`/etc/hosts`文件来解决此问题,并将`his`主机名映射到正确的IP地址。示例如下: ```shell sudo nano /etc/hosts ``` 在文件中添加以下行: ``` 192.168.8.109 his ``` 保存并关闭文件。 2. [ERROR CRI]: container runtime is not running: output: E0714 18:14:51.757340 11481 remote_runtime.go:616] "Status from runtime service failed" err="rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing dial unix /var/run/containerd/containerd.sock: connect: no such file or directory\"" 此错误指示容器运行时未运行。这可能是由于您的容器运行时(例如containerd)未正确安装或配置导致的。请确保您已按照正确的步骤安装和配置了容器运行时。您可以尝试重新安装或重新配置容器运行时来解决此问题。 3. [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1 这个错误表示`/proc/sys/net/bridge/bridge-nf-call-iptables`文件的内容不是1。您可以通过运行以下命令来解决此问题: ```shell echo 1 | sudo tee /proc/sys/net/bridge/bridge-nf-call-iptables ``` 4. [ERROR KubeletVersion]: the kubelet version is higher than the control plane version. This is not a supported version skew and may lead to a malfunctional cluster. Kubelet version: "1.27.3" Control plane version: "1.25.0" 这个错误表示您的kubelet版本高于控制平面版本。这不是受支持的版本差异,并且可能导致集群功能异常。为了解决此问题,您需要确保kubelet和控制平面使用相同的Kubernetes版本。您可以尝试升级或降级kubelet版本,以与控制平面版本匹配。 请根据上述解决方案逐个解决问题,并尝试重新执行`kubeadm init`命令。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助您解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值