Cgroups概念 

cgroups 的全称是 Linux Control Groups,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、IO 等)。

systemd是系统自带的cgroup管理器, 系统初始化就存在的, 和cgroups联系紧密,为每一个进程分配cgroups, 用它管理就行了. 如果设置成cgroupfs就存在2个cgroup控制管理器, 实验证明在资源有压力的情况下,会存在不稳定的情况。

由于 kubeadm 把 kubelet 视为一个系统服务来管理,所以对基于 kubeadm 的安装kubernetes, 我们推荐使用 systemd 驱动,不推荐 cgroupfs 驱动。

docker的cgroup配置

默认情况下docker的cgroups是 cgroupfs 驱动,修改配置如下:

#查看docker信息
docker info

#修改cgroups驱动

cat /etc/docker/daemon.json 
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {"max-size":"200m", "max-file":"3"}
}



#重启
systemctl restart docker

#确认是否生效
docker info | grep -i "Cgroup Driver"

主要是"exec-opts": ["native.cgroupdriver=systemd"]这个参数,修改之后,需要重启docker

kubernetes配置cgroup 驱动

配置 kubelet 的 cgroup 驱动

修改kubelet的配置文件(二进制方式,根据配置文件的目录不同而不同)

cat /etc/kubernetes/kubelet 
KUBELET_ARGS="--stderrthreshold=3 --v=0 --kubeconfig=/etc/kubernetes/admin.kubeconfig --address=10.20.0.200 --port=10250 --kube-reserved=cpu=1,memory=1Gi,ephemeral-storage=2Gi --system-reserv
ed=cpu=1,memory=1Gi,ephemeral-storage=2Gi --eviction-hard=memory.available<500Mi,nodefs.available<10% --hostname-override=10.30.0.3 --allow-privileged=true --pod-infra-container-image=k8s.gcr.io/pause-amd64:3.1 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --feature-gates=PersistentLocalVolumes=true,LocalStorageCapacityIsolation=true --pod-manifest-path=/etc/kubernetes/manifests --cluster-domain=internal-bigdata.com --cluster-dns=169.169.0.10 --root-dir=/data/kubelet --logtostderr=false --log-dir=/data/kubeletLogs/kubelet --cgroup-driver=systemd"

 修改kubelet的配置文件(kubeadm)

 kubelet配置/var/lib/kubelet/config.yaml添加

   

cgroupDriver: systemd

 kubelet配置/var/lib/kubelet/kubeadm-flags.env,KUBELET_KUBEADM_ARGS中添加 --cgroup-driver=systemd

vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.5"


#修改之后重启kubelet

systemctl restart kubelet

kubeadm 支持在执行 kubeadm init 时,传递一个 KubeletConfiguration 结构体。 KubeletConfiguration 包含 cgroupDriver 字段,可用于控制 kubelet 的 cgroup 驱动。

在版本 1.22 中,如果用户没有在 KubeletConfiguration 中设置 cgroupDriver 字段, kubeadm init 会将它设置为默认值 systemd

这是一个最小化的示例,其中显式的配置了此字段:

# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.21.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
kubeadm init --config kubeadm-config.yaml

 Kubeadm 对集群所有的节点,使用相同的 KubeletConfiguration。 KubeletConfiguration 存放于 kube-system 命名空间下的某个 ConfigMap 对象中。

执行 initjoin 和 upgrade 等子命令会促使 kubeadm 将 KubeletConfiguration 写入到文件 /var/lib/kubelet/config.yaml 中, 继而把它传递给本地节点的 kubelet

迁移到 systemd 驱动

要将现有 kubeadm 集群的 cgroup 驱动就地升级为 systemd, 需要执行一个与 kubelet 升级类似的过程。 该过程必须包含下面两个步骤:

修改 kubelet 的 ConfigMap

  • 用命令 kubectl get cm -n kube-system | grep kubelet-config 找到 kubelet 的 ConfigMap 名称。

  • 运行 kubectl edit cm kubelet-config-x.yy -n kube-system (把 x.yy 替换为 Kubernetes 版本)。

  • 修改现有 cgroupDriver 的值,或者新增如下式样的字段:

    cgroupDriver: systemd

 更新所有节点的 cgroup 驱动

对于集群中的每一个节点:

  • 执行命令 kubectl drain <node-name> --ignore-daemonsets,以 腾空节点
  • 执行命令 systemctl stop kubelet,以停止 kubelet
  • 停止容器运行时
  • 修改容器运行时 cgroup 驱动为 systemd
  • 在文件 /var/lib/kubelet/config.yaml 中添加设置 cgroupDriver: systemd
  • 启动容器运行时
  • 执行命令 systemctl start kubelet,以启动 kubelet
  • 执行命令 kubectl uncordon <node-name>,以 取消节点隔离

在节点上依次执行上述步骤,确保工作负载有充足的时间被调度到其他节点。

流程完成后,确认所有节点和工作负载均健康。

将现有 kubeadm 集群的 cgroup 驱动就地升级为 systemd还有一种方法:

可以用已配置了 systemd 的新节点替换掉集群中的老节点。 按这种方法,在加入新节点、确保工作负载可以安全迁移到新节点、及至删除旧节点这一系列操作之前, 只需执行以下第一个步骤。

 containerd配置cgroup驱动

kubenrnetes从1.24版本开始不再支持dockershim,containerd作为一个替代docker的选项

结合 runc 使用 systemd cgroup 驱动,在 /etc/containerd/config.toml 中设置
 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] 
   ......
   [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] 
      SystemdCgroup = true


#修改完之后重启containerd
systemctl restart containerd

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐