Kubernetes中的cgroup驱动和容器运行时(containerd)
安装和配置先决条件
网络配置
默认情况下,Linux 内核不允许 IPv4 数据包在接口之间路由。大多数 kubernetes 集群网络实现都会更改此配置
启用 IPv4 数据包转发
手动启用 IPv4 数据包转发:
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system #应用 sysctl 参数而不重启启动
sysctl net.ipv4.ip_forward #验证
net.ipv4.ip_forward是否设置为 1
cgroup 驱动
在 Linux 上,控制组(CGroup)用于限制分配给进程的资源。
kubelet 和底层容器运行时都需要对接控制组来强制执行为 Pod 和Container 管理资源并为诸如CPU、内存这类资源设置请求和限制。若要对接控制组,kubelet 和容器运行时需要使用一个 cgroup 驱动。关键一点是 kubelet 和容器运行时需要使用相同的 cgroup 驱动并且采用相同的配置。
可用的 cgroup 驱动有两个:
- cgroupfs
- systemd
cgroupfs 驱动
cgroupfs 驱动是 kubelet 中默认的 cgroup 驱动。当使用 cgroup 驱动时,kubelet 和容器运行时将直接对接 cgroup 文件系统来配置 cgroup。
当 systemd 是初始化系统时,不推荐使用 cgroupfs 驱动,因为 systemd 期望系统上只有一个 cgroup 管理器。此外,如果你使用 cgroup v2,则应用 systemd cgroup 驱动取代 cgroupfs。
systemd cgroup驱动
当某个 Linux 系统发行版使用 systemd 作为初始化系统时,初始化进程会生成并使用一个 root 控制组(croup),并充当 cgroup 管理器。
systemd 与 cgroup 集成紧密,并将为每个 systemd 单元分配一个 cgroup。因此,如果你把 systemd 用作初始化系统,同时使用 cgroupfs 驱动,则系统中会存在两个不同的 cgroup 管理器。
同时存在两个 cgroup 管理器将造成系统中针对可用的资源和使用中的资源出现两个视图。某些情况下,将 kubelet 和容器运行时配置为使用 cgroupfs、但为剩余的进程使用 systemd 的那些节点将在资源压力增大时变得不稳定。
当 systemd 是选定的初始化系统时,缓解这个不稳定问题的方法是针对 kubelet 和 容器运行时都将 systemd 用作 cgroup 驱动。
要将 systemd 设置为 cgroup 驱动,需编辑 kubeletconfiguration 的 cgroupDriver 选项,并将其设置为 systemd。例如:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
...
cgroupDriver: systemd
后者在"/var/lib/kubelet"路径下,编辑config.yaml文件中的 cgroupDriver 字段的值。
如果你将 systemd 配置为 kubelet 的 cgroup 驱动,你也必须将 systemd 配置为容器运行时的 cgroup 驱动。例如:
- containerd
Containerd 容器运行时
安装 Containerd 运行时2.x版本
参看 《Containerd 运行时安装》文章
配置 systemd cgroup 驱动
要在 /etc/containerd/cofig.toml 中将 runc 配置为使用 systemd cgroup 驱动:
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc]
...
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]
SystemdCgroup = true
重启启动 containerd:
systemctl restart containerd
所有评论(0)