配置K8s Topology Manager
配置K8s的Topology Manager,并通过查看应用是否被限制在一个NUMA上运行来验证是否配置成功。
- 安装Docker。
yum install docker
- 部署K8s集群。详细信息请参见部署K8s集群。
- 修改配置文件。
- 打开配置文件。
vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
原配置文件默认内容如下。# Note: This dropin only works with kubeadm and kubelet v1.11+ [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file. EnvironmentFile=-/etc/sysconfig/kubelet ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
- 按“i”进入编辑模式,将配置文件修改为如下内容。
# Note: This dropin only works with kubeadm and kubelet v1.11+ [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file. EnvironmentFile=-/etc/sysconfig/kubelet # 修改1 增加两行ExecStartPre配置 ExecStartPre=/usr/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service ExecStartPre=/usr/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.service ExecStart= # 修改2 在ExecStart配置末尾增加--kube-reserved、--cpu-manager-policy、--feature-gates、--topology-manager-policy等参数 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --kube-reserved=cpu=2,memory=250Mi --cpu-manager-policy=static --feature-gates=CPUManager=true --topology-manager-policy=single-numa-node
- 按“Esc”键退出编辑模式,输入:wq!,按“Enter”键保存并退出文件。
- 打开配置文件。
- 删除CPU管理状态文件cpu_manager_state。
rm -f /var/lib/kubelet/cpu_manager_state
- 重启kubelet服务。
systemctl daemon-reload && systemctl restart kubelet
查看kubelet服务状态。
systemctl status kubelet
当出现如下内容表示成功启动服务。
- 修改创建应用的yaml文件。例如example.yaml文件。
- 打开文件。
vi example.yaml
- 按“i”进入编辑模式,增加如下配置信息。请根据规划部署的Node节点的CPU、内存实际情况选择合适的CPU、内存配置值。
resources: limits: cpu: 16 memory: 64Gi requests: cpu: 16 memory: 64Gi
为了使Pod能够生效single-numa-node模式的功能,必须配置Pod的resources字段中limits下的cpu和memory值,且resources字段中limits下的cpu和memory值需要和requests下的cpu和memory值一样。如果不指定requests的配置值,则默认requests的配置值和limits的配置值一样。
- 按“Esc”键退出编辑模式,输入:wq!,按“Enter”键保存并退出文件。
- 打开文件。
- 在管理节点上重新部署应用。
kubectl apply -f *.ymal
- 查看Pod以及NUMA的使用情况。
- 查看应用的容器。
docker ps | grep tp
tp表示查找出用户应用容器的关键词。
预期结果示例如下,678044fcecaf为应用的容器的ID。
- 查看Pod使用的CpusetCpus,观察应用是否被限制在一个NUMA上运行。
docker inspect xxx | grep Cpuset
xxx表示8.a中应用的容器的ID。
可以看到Pod被限制在核2-11上。
查看物理机NUMA上核的分布情况。
lscpu
物理机NUMA上核的分布范围包含了Pod所在NUMA的范围,可以确认应用确实被限制在一个NUMA上,K8s Topology Manager已经配置成功。
- 查看应用的容器。