k8s 调优 参数优化

这些参数是 Kubernetes(K8s)中的一些配置选项,用于控制不同的行为和功能。让我逐个解释它们:

  1. --feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true

    • 这个参数用于启用或禁用一些实验性的功能。在这里,启用了两个功能:RotateKubeletClientCertificate 和 RotateKubeletServerCertificate。这些功能可能是用于定期轮换 Kubelet 的客户端证书和服务器证书,以增强安全性。
  2. --image-gc-high-threshold=70

    • 这个参数设置了镜像垃圾收集的高阈值。当节点上的磁盘使用率高于此阈值时,Kubernetes 将开始垃圾收集(删除不再使用的镜像)以释放空间。
  3. --image-gc-low-threshold=60

    • 这个参数设置了镜像垃圾收集的低阈值。一旦磁盘使用率下降到此阈值以下,垃圾收集过程将停止。
  4. --kube-reserved=cpu=500m,memory=512Mi,ephemeral-storage=1Gi

    • 这个参数设置了 Kubernetes 对节点上资源的保留量。具体来说,为 CPU 分配了 500 毫核(500m),内存分配了 512MB(512Mi),临时存储(ephemeral storage)分配了 1GB(1Gi)。
  5. --system-reserved=cpu=1000m,memory=1024Mi,ephemeral-storage=1Gi

    • 这个参数设置了系统对节点上资源的保留量。类似于上一个参数,为 CPU 分配了 1000 毫核(1000m),内存分配了 1024MB(1024Mi),临时存储(ephemeral storage)分配了 1GB(1Gi)。

这些参数可以根据你的集群需求进行调整,以确保系统的稳定性和性能。

 

控制节点上的 CPU 管理策略

1.前言
在业务中使用Kubernetes编排容器时,通常会使用到Request & Limits参数对容器进行CPU与内存的使用限制.
但是对于某些比较消耗系统资源的业务,可能需要进行资源的独占分配(以保证其运行的性能).
所以使用单一的资源限制,还不能达到pod运行的性能,所以需要进行资源独占的分配编排.
在Kubernetes 版本> v1.12中,有CPU Manager技术去实现Pod级别的绑定运行CPU.

1.1 理解CPU Manager作用
每个worker节点运行多个pod,某些Pods可能会运行高CPU负载的业务,这些高负载的pod,很有可能在当前的节点上
抢占CPU的资源,影响当前节点上其他pod的运行性能.所以采用此技术来解决这个问题.


1.2 CPU 管理策略配置
CPU 管理策略通过 kubelet 参数 --cpu-manager-policy 来指定。Kubernetes 支持两种管理策略:
none: 默认策略,表示现有的调度行为。
static: 允许为节点上的某些消耗CPU资源的pod对cpu有独占性。

CPU管理器定期通过CRI写入资源更新,以保证内存中CPU分配与cgroupfs一致.
同步频率通过新增的 Kubelet 配置参数 --cpu-manager-reconcile-period 来设置.
如果不指定,默认与 --node-status-update-frequency 的周期相同。


1.3 none策略
none 策略显式地启用现有的默认CPU亲和方式,
不提供操作系统调度器默认行为之外的亲和性策略.
通过 CFS 配额来实现 Guaranteed pods 的 CPU 使用限制.

1.4 static 策略
static 策略针对具有整数型(容器对 CPU 资源的限制值是一个大于或等于1的整数值) CPU requests的 Guaranteed Pod,
它允许该类 Pod 中的容器访问节点上的独占CPU资源.
这种独占性是使用 cpuset cgroup 控制器来实现的.

#独占的CPU资源计算
可用的独占性 CPU 资源数量等于节点的 CPU 总量减去通过 --kube-reserved 或 --system-reserved 参数保留的 CPU 。

#注意事项
当启用static策略时,要求使用--kube-reserved
或 --system-reserved 或 --reserved-cpus 来保证预留的CPU值大于零.(避免cpu共享池为空)

1.5 具体配置
#增加参数配置
--cpu-manager-policy=static
--kube-reserved=cpu=0.5,memory=1G
--feature-gates=CPUManager=true

#配置项(注意修改主机名)
[root@node-1 bin]#cat >/etc/kubernetes/cfg/kubelet<<EOF
KUBELET_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=192.168.91.21 \
--kubeconfig=/etc/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/etc/kubernetes/cfg/bootstrap.kubeconfig \
--config=/etc/kubernetes/cfg/kubelet.config \
--cert-dir=/etc/kubernetes/ssl \
--kube-reserved=cpu=0.5,memory=1G \
--cpu-manager-policy="static" \
--feature-gates="CPUManager=true" \
--pod-infra-container-image=docker.io/kubernetes/pause:latest"
EOF


#说明
--kube-reserved:节点保留的cpu与内存


#重启服务
[root@node-1 ~]# systemctl daemon-reload && systemctl restart kubelet


1.6 测试
#注意测试之前需要将节点cpu调整到4 CORE
#查询当前机器的核心
[root@node-1 ~]# cat /proc/cpuinfo | grep process
processor : 0
processor : 1
processor : 2
processor : 3

#导入镜像
[root@node-1 ~]# docker load -i k8s.gcr.io.pause.3.1.tar.gz

#创建yaml
[root@master-1 nginx]# cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: cpu-manager-demo
labels:
app: cpu-manager-demo
spec:
replicas: 2
selector:
matchLabels:
app: cpu-manager-demo
template:
metadata:
labels:
app: cpu-manager-demo
spec:
containers:
- name: cpu-manager-demo
image: nginx
resources:
requests:
cpu: 2
memory: "256M"
limits:
cpu: 2
memory: "256M"
ports:
- containerPort: 80

#创建deployment
[root@master-1 nginx]# kubectl apply -f nginx-deployment.yaml
deployment.apps/cpu-manager-demo created


#在节点获取容器
[root@node-1 ~]# docker ps | grep cpu-manager-demo
e5efcefacc84 nginx "/docker-entrypoint.…" 2 minutes ago
Up 2 minutes
k8s_cpu-manager-demo_cpu-manager-demo-67bbfc5d96-bvp5w_default_271fa62c-089f-4677-9c2b-778dfb898411_0

#获取容器pid
[root@node-1 ~]# docker inspect e5efcefacc84 | grep Pid
"Pid": 20114,
"PidMode": "",
"PidsLimit": null,

#查询 PID= 20114 的线程可用的CPU核心
[root@node-1 ~]# taskset -c -p 20114
pid 20114's current affinity list: 0,1


#如果没有设置CPU绑定,则是每个核心都可以运行
[root@node-3 ~]# taskset -c -p 5634
pid 5634's current affinity list: 0-3

 

 

Kubernetes中的LimitRangerResourceQuota是用于资源管理和限制的两个重要功能。

  1. LimitRanger:

    • LimitRanger允许你为单个Pod中的各种资源(如CPU、内存)设置限制。这可以防止某个Pod占用过多的资源,从而影响其他Pod的正常运行。通过LimitRanger,你可以指定每个Pod的资源限制,确保集群中的资源分配合理,提高整体性能和稳定性。
  2. ResourceQuota:

    • ResourceQuota允许你为整个命名空间设置资源配额。这意味着你可以限制命名空间中所有Pod、容器和持久卷的资源使用量。ResourceQuota可以帮助你控制资源的消耗,避免过度使用集群资源,并在资源使用达到指定限制时触发警报或采取其他措施。

这两个功能结合起来,可以有效地管理Kubernetes集群中的资源,确保每个应用程序都能获得足够的资源,并且不会耗尽整个集群的资源。通过合理设置资源限制和配额,可以提高集群的可靠性和稳定性,同时最大化资源利用率。

 

 

 
 
posted @ 2024-05-16 08:09  滴滴滴  阅读(24)  评论(0编辑  收藏  举报