k8s pod 绑核

这篇具有很好参考价值的文章主要介绍了k8s pod 绑核。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

默认配置下,kubelet/Linux 使用 CFS(完全公平调度)算法来为 Pod 分配 CPU,工作负载(Pod 中的进程)会被调度到不同的可用的 CPU 核心,而且大多数工作负载对这种迁移带来的性能损失并不敏感。

CFS 是 Linux 内核中 SCHED_NORMAL 类任务(普通进程)的默认调度算法,摒弃了原先的固定时间片优先级概念,致力于公平地将 CPU 时间分配给任务。

但是 CPU 缓存的亲和性和调度延迟会对少数进程带来显著影响,这类工作负载需要独占 CPU(“绑核”)。

之前的文章中已经讲了如何在生产环境中进行资源的预留和pod的绑核策略(https://blog.csdn.net/weixin_40579389/article/details/134147788?spm=1001.2014.3001.5501)

本篇文章来讲解k8s pod绑核在cgroup中的实现。

二、环境信息

1:k8s version
[root@node1 ~]# kubectl get node 
NAME    STATUS   ROLES                  AGE   VERSION
node1   Ready    control-plane,master   44d   v1.23.17
node2   Ready    control-plane,master   44d   v1.23.17
node3   Ready    control-plane,master   44d   v1.23.17


#########################
2:kubelet配置
[root@node1 ~]# ps -ef | grep kubelet
root       7080      1 25 Feb21 ?        1-05:16:18 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --container-runtime=remote --container-runtime-endpoint=/run/containerd/containerd.sock --node-ip=172.28.30.163 --node-labels=topology.kubeclipper.io/region=mgmt,kubeclipper.io/agent-id=c9722e0c-4511-4885-a986-9afca2f73265 --pod-infra-container-image=172.28.30.163:5000/pause:3.6 --root-dir=/var/lib/kubelet --kube-reserved=cpu=4,memory=16Gi --system-reserved=cpu=12,memory=16Gi --eviction-hard=memory.available<8Gi,nodefs.available<10% --cpu-manager-policy=static --reserved-cpus=0-3,64-67,32-35,96-99 --memory-manager-policy=Static --topology-manager-policy=single-numa-node --reserved-memory 0:memory=40Gi

确认目前cpu的策略为static
###############################
3:cpu numa 架构
[root@node1 ~]# numactl -H
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
node 0 size: 515468 MB
node 0 free: 318958 MB
node distances:
node   0 
  0:  10 


####################################
4:cgroup 管理的 cgroup 子系统
[root@node1 ~]# cat /sys/fs/cgroup/cpuset/kubepods.slice/cpuset.cpus
0-127
[root@node1 ~]# 
128 个核心都被绑定至 kubepods.slice 子系统。

三、启动pod测试

  • 启动pod
[root@node1 ~]# cat wzb/nginx.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx 
spec:
  replicas: 1
  selector: 
    matchLabels:
      app: nginx
  template: 
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/library/nginx:latest
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 1     ###设置pod的requests和limits数量为1
            memory: 1Gi
          limits: 
            cpu: 1
            memory: 1Gi

[root@node1 ~]# kubectl apply -f  wzb/nginx.yaml 
deployment.apps/nginx-deployment created
[root@node1 ~]# 
[root@node1 ~]# kubectl get po  -o wide 
NAME                                READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
nginx-deployment-554f5cbccb-zfxsv   1/1     Running   0          6s    172.25.40.67   cmu82   <none>           <none>
[root@node1 ~]# 
[root@node1 ~]# 

  • 获取pod id
[root@node1 ~]# kubectl get po nginx-deployment-554f5cbccb-zfxsv -o jsonpath='{.metadata.uid}'
3a9b7ef4-ee9b-45a2-97e7-aa1eb38e5860
  • 获取stress(业务) 容器id
进入node2 
[root@node2 ~]# ctr -n k8s.io c ls   |grep nginx    获取容器id
9f77debb3ea8b0d99906e82514d6e289713411a2a7848d2b2390bf5ca35bac70    docker.io/library/nginx:latest                                           io.containerd.runc.v2
  • 查看pod 的cgroup 子系统能够使用的cpu 集合
[root@node2 ~]# cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice/cpuset.cpus
0-127
能够使用所有的cpu 
  • 查看pause和nginx容器 cpuset.cpus 和 tasks 文件
    pause容器
    通过上面获取到的pod id,nginx 容器id判断pause容器的id
[root@node2 ~]# ll /sys/fs/cgroup/cpuset/   | grep kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860
drwxr-xr-x 2 root root 0 Feb 26 10:38 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:559f861df124ed69d350629030e47664ef9e7a993bfd3e03404dcc29767449d1
drwxr-xr-x 2 root root 0 Feb 26 10:38 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:9f77debb3ea8b0d99906e82514d6e289713411a2a7848d2b2390bf5ca35bac70
[root@node2 ~]# 

进入pause 容器目录,查看cpuset.cpus和tasks文件


[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:559f861df124ed69d350629030e47664ef9e7a993bfd3e03404dcc29767449d1]# cat cpuset.cpus 
0-127

[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:559f861df124ed69d350629030e47664ef9e7a993bfd3e03404dcc29767449d1]# cat tasks 
353184

[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:559f861df124ed69d350629030e47664ef9e7a993bfd3e03404dcc29767449d1]# taskset -cp 353184 
pid 353184's current affinity list: 0-127

[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:559f861df124ed69d350629030e47664ef9e7a993bfd3e03404dcc29767449d1]# 

cpuset.cpus 文件输出 0-127,128 个核心都在列,表示进程可以随意使用这 0 - 127 号 CPU。
tasks 文件输出 pause 进程的 pid,将该 cpuset 与 pause 进程绑定,所以 pause 容器可以随意使用这 0 - 127 号 CPU。

nginx容器文章来源地址https://www.toymoban.com/news/detail-860503.html

   进入nginx 容器cgroup目录
[root@node2 cpuset]# cd kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:9f77debb3ea8b0d99906e82514d6e289713411a2a7848d2b2390bf5ca35bac70

[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:9f77debb3ea8b0d99906e82514d6e289713411a2a7848d2b2390bf5ca35bac70]# cat cpuset.cpus 
17

[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:9f77debb3ea8b0d99906e82514d6e289713411a2a7848d2b2390bf5ca35bac70]# cat tasks 
353213
353249
353250
353251
353252
......
[root@node2 kubepods-pod3a9b7ef4_ee9b_45a2_97e7_aa1eb38e5860.slice:cri-containerd:9f77debb3ea8b0d99906e82514d6e289713411a2a7848d2b2390bf5ca35bac70]# taskset -cp 353213
pid 353213's current affinity list: 17


cpuset.cpus 文件输出 17,表示进程只能使用 17 号 CPU。
tasks 文件输出 nginx 进程的 pid,将该 cpuset 与 stress 进程绑定,所以 stress 容器就与 17 号 CPU 绑定了。


查看node2主机上的cpu_manager_state文件,该文件记录了该节点上容器的 cpuset 状态:uuid 为 3a9b7ef4-ee9b-45a2-97e7-aa1eb38e5860 的 Pod 中 nginx 容器的绑核。
[root@node2 ~]# cat /var/lib/kubelet/cpu_manager_state  | jq .
{
 "policyName": "static",
 "defaultCpuSet": "0-3,18-67,81-127",
 "entries": {
   "3a9b7ef4-ee9b-45a2-97e7-aa1eb38e5860": {
     "nginx": "17"     ####与cgroup 中绑核一致
   }
 },
 "checksum": 3276404201
}
[root@node2 ~]# 

到了这里,关于k8s pod 绑核的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【k8s】pod详解

    Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象,一个pod代表着集群中运行的一个进程。kubernetes中其它大多数组件都是围绕着pod来进行支持和扩展pod功能的。 例如,用于管理pod运行的statefulset和deployment 等控制器对象,用于暴露应用的service和i

    2024年02月06日
    浏览(33)
  • k8s 终止pod

    cat  test.yaml apiVersion: v1        #必选,版本号,例如v1 kind: Pod       #必选,Pod metadata:       #必选,元数据   name: string        #必选,Pod名称   namespace: string     #必选,Pod所属的命名空间   labels:       #自定义标签     - name: string      #自定义标签名字   annotations:  

    2024年02月13日
    浏览(32)
  • K8s Pod详解

    每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的容器,数量可多可少 Pause容器,这是每个Pod都会有的一个 根容器 ,它的作用有两个: 可以以它为依据,评估整个Pod的健康状态 可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现

    2024年02月01日
    浏览(29)
  • k8s --pod详解

    目录 一、Pod基础概念 1、pod简介 2、在Kubrenetes集群中Pod有如下两种使用方式 3、pause容器使得Pod中的所有容器可以共享两种资源:网络和存储。 (1)网络 (2)存储 4、kubernetes中的pause容器主要为每个容器提供以下功能 6、Pod分类 (1)自主式Pod   (2)控制器管理的Pod  (3)

    2024年02月13日
    浏览(22)
  • 【 K8S 】 Pod 进阶

    当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时,代表容器运行所需的最小资源量,调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还为容器指定了

    2024年02月13日
    浏览(23)
  • k8s关于pod

      目录 1、POD 的创建流程 kubectl 发起创建 Pod 请求: API Server 接收请求并处理: 写入 Etcd 数据库: Kubelet 监听并创建 Pod: Pod 状态更新和汇报: 2、POD 的状态解析 1. Pending Pod 2. Running Pod 3. Succeeded Pod 4. Failed Pod 5. Unknown 6. CrashLoopBackOff 7. ImagePullBackOff Pod 8. Terminating 9. Evicted 10.

    2024年03月18日
    浏览(36)
  • k8s之pod

    Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。 网上的资料对这块的讲解几乎都是纯文字性的,结果可能会导致在入门kubernetes的时候,就忽略了这个非常重要的知识点,先糊涂一阵,等实际操作了后,再回过头来,原来如此啊。本文在讲解特性的同时,配

    2023年04月09日
    浏览(25)
  • 【K8s】Pod一文详解

    每个Pod中都可以包含一个或者多个容器 ,这些容器可以分为两类: 1) 用户容器 :用户程序所在的容器,数量可多可少 2) 根容器 :Pause容器,由Kubernetes创建,这是每个Pod都会有的一个根容器,它的作用有两个: 可以以它为依据,评估整个Pod的健康状态 可以在根容器上设

    2024年02月04日
    浏览(25)
  • k8s概念-深入pod

    回到目录  工作负载(workload)是在kubernetes集群中运行的应用程序。无论你的工作负载是单一服务还是多个一同工作的服务构成,在kubernetes中都可以使用pod来运行它 workloads分为pod与controllers pod通过控制器实现应用的运行,如何伸缩,升级等 controllers 在集群中管理pod pod与控制

    2024年02月14日
    浏览(30)
  • K8S:深入理解POD

    它的基本语法规则如下: 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格。 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 # 表示注释,从这个字符一直到行尾,都会被解析器忽略。 在我们的 kubernetes 中,你只需要两种结构类型就行

    2024年04月28日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包