---
title: 配置K8s Topology Manager
description: "配置K8s的Topology Manager，并通过查看应用是否被限制在一个NUMA上运行来验证是否配置成功。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcpfs/ecosystemEnable/Kubernetes/kunpengk8stopologmanager_04_0003.html
sourcePath: /source/zh/kunpengcpfs/ecosystemEnable/Kubernetes/kunpengk8stopologmanager_04_0003.html
indexId: 282ec75de752d2fdad77cdd7a26a14eaeb7b7b92bba92fb39deeb202bca2298f87
---
# 配置K8s Topology Manager

配置K8s的Topology Manager，并通过查看应用是否被限制在一个NUMA上运行来验证是否配置成功。

1. 安装Docker。
  1 yum install docker

2. 部署K8s集群。详细信息请参见部署K8s集群。
3. 修改配置文件。

  a. 打开配置文件。
    1 vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

    原配置文件默认内容如下。 1 2 3 4 5 6 7 8 9 10 11 # 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

  b. 按“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
```


  c. 按“Esc”键退出编辑模式，输入:wq!，按“Enter”键保存并退出文件。
4. 删除CPU管理状态文件cpu_manager_state。
  1 rm -f /var/lib/kubelet/cpu_manager_state

5. 重启kubelet服务。
  1 systemctl daemon-reload && systemctl restart kubelet

  查看kubelet服务状态。

  1 systemctl status kubelet

  当出现如下内容表示成功启动服务。

6. 修改创建应用的yaml文件。例如example.yaml文件。

  a. 打开文件。
    1 vi example.yaml

  b. 按“i”进入编辑模式，增加如下配置信息。请根据规划部署的Node节点的CPU、内存实际情况选择合适的CPU、内存配置值。
    1 2 3 4 5 6 7 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的配置值一样。

  c. 按“Esc”键退出编辑模式，输入:wq!，按“Enter”键保存并退出文件。
7. 在管理节点上重新部署应用。
  1 kubectl apply -f *.yaml

8. 查看Pod以及NUMA的使用情况。

  a. 查看应用的容器。
    1 docker ps | grep tp

    tp表示查找出用户应用容器的关键词。

    预期结果示例如下，678044fcecaf为应用的容器的ID。

  b. 查看Pod使用的CpusetCpus，观察应用是否被限制在一个NUMA上运行。
    1 docker inspect xxx | grep Cpuset

    xxx表示8.a中应用的容器的ID。

    可以看到Pod被限制在核2-11上。

    查看物理机NUMA上核的分布情况。

    1 lscpu

    物理机NUMA上核的分布范围包含了Pod所在NUMA的范围，可以确认应用确实被限制在一个NUMA上，K8s Topology Manager已经配置成功。
