• 如何为k8s中的pod配置QoS等级?


    1、概述

    本文介绍如何为pod分配特定的QoS等级。

    我们知道,在k8s的环境中,通过使用QoS等级来做决定,在资源紧张的时候,将哪些的pod进行驱逐,或者说如何对pod进行调度。

    OK,话不多说,让我们来一一的介绍和说明。

    2、如何为pod定义QoS等级

    在k8s中,通过为pod中的容器设置资源(cpu、内存的requests和limits)来决定pod的QoS等级。

    3、QoS等级

    当在k8s的集群中创建一个pod的时候,就会将下面中的一个QoS等级分配给POD:

    • Guaranteed
    • Burstable
    • BestEffort

    4、实验验证

    OK,那我们通过一些实验,来看下,在什么情况,会给pod分配什么样的QoS等级。

    4.1、创建一个临时的命名空间

    kubectl create namespace qos-example

    4.2、创建Guarateed QoS等级的Pod

    满足以下的条件,POD会被分配Guaranteed的QoS等级:

    • POD中的每个容器必须有内存limit和内存request
    • 对于pod中的每个容器,内存的limit和内存的request必须相等
    • pod中的每个容器必须要有cpu limit和cpu request
    • 对于pod中的每个容器,cpu的limit和cpu的request必须相等

    简单来说,pod中的每个容器都要有cpu和内存的limit和request,并且limit和request要相等。

    通过以下的命令创建一个pod

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: qos-demo
      namespace: qos-example
    spec:
      containers:
      - name: qos-demo-ctr
        image: 172.20.58.152/middleware/nginx:1.21.4
        resources:
          limits:
            memory: "200Mi"
            cpu: "700m"
          requests:
            memory: "200Mi"
            cpu: "700m"
    EOF


    在以上的pod的配置文件中,包含一个容器。容器中包含内存的limit和request,都是200M,容器包含CPU的limit和request,值都是700m.

    查看pod的详细信息

    [root@nccztsjb-node-23 ~]# kubectl get pod qos-demo -n qos-example -o yaml | grep qosClass
      qosClass: Guaranteed
    [root@nccztsjb-node-23 ~]# 

    通过以上pod的输出可以看到,k8s给了pod一个Guaranteed的QoS等级。

    删除pod

    kubectl delete pod qos-demo -n qos-example

    注意:如果一个容器指定了memory的limit,但是没有指定memory的request,这个时候,在创建容器的时候,k8s会自动分配memory的requests,并且这个值会和limits的值相同。同样的,如果一个容器指定了CPU的limits但是没有指定cpu的requests,k8s也会自动的分配和cpu limit相等的cpu request.

    如下示例,进行说明:

    通过以下的命令(没有request 设置)创建pod

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: qos-demo
      namespace: qos-example
    spec:
      containers:
      - name: qos-demo-ctr
        image: 172.20.58.152/middleware/nginx:1.21.4
        resources:
          limits:
            memory: "200Mi"
            cpu: "700m"
    EOF

    查看pod的内容

    kubectl get pod qos-demo -n qos-example -o yaml
    
    ...省略...
    spec:
      containers:
      - image: 172.20.58.152/middleware/nginx:1.21.4
        imagePullPolicy: IfNotPresent
        name: qos-demo-ctr
        resources:
          limits:
            cpu: 700m
            memory: 200Mi
          requests:
            cpu: 700m
            memory: 200Mi
    ...省略...
    status:
    ...省略...
      qosClass: Guaranteed

    ok,我们看到,已经自动加上了requests的值,并且和limits的值相等。

          requests:
            cpu: 700m
            memory: 200Mi

    4.3、创建Burstable QoS等级的POD

    当满足以下的条件时,pod就会被分配Burstable的QoS等级:

    • pod不满足guaranteed QoS等级的标准
    • pod中至少一个容器配置了memory或者cpu requests

    ok,我们创建以下的pod

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: qos-demo-2
      namespace: qos-example
    spec:
      containers:
      - name: qos-demo-2-ctr
        image: 172.20.58.152/middleware/nginx:1.21.4
        resources:
          limits:
            memory: "200Mi"
          requests:
            memory: "100Mi"
    EOF

    以上的pod配置中,有一个容器。容器的内存 limits 是200M,内存requests是100Mi。

    查看pod的信息

    kubectl get pod -n qos-example qos-demo-2 -o yaml
    
    ...省略...
    spec:
      containers:
      - image: 172.20.58.152/middleware/nginx:1.21.4
        imagePullPolicy: IfNotPresent
        name: qos-demo-2-ctr
        resources:
          limits:
            memory: 200Mi
          requests:
            memory: 100Mi
    ...省略...
    status:
    ...省略...
      qosClass: Burstable

    从以上的输出可以看到pod的QoS等级是Burstable。

    删除pod

    kubectl delete pod qos-demo-2 --namespace=qos-example

    4.4、创建BestEffort QoS等级的Pod

    如果在创建pod时,pod中容器都没有指定memory和cpu的request和limit的设置。那么,k8s就会给pod一个BestEffort的QoS级别。

    创建以下的pod示例:

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: qos-demo-3
      namespace: qos-example
    spec:
      containers:
      - name: qos-demo-3-ctr
        image: 172.20.58.152/middleware/nginx:1.21.4
    EOF

    查看pod的详细信息:

    kubectl get pod -n qos-example qos-demo-3 -o yaml
    
    ...省略...
    spec:
      containers:
      - image: 172.20.58.152/middleware/nginx:1.21.4
        imagePullPolicy: IfNotPresent
        name: qos-demo-3-ctr
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
          name: kube-api-access-ff2lf
          readOnly: true
    status:
    ...省略...
      qosClass: BestEffort
    ...省略...

    OK,从以上的输出可以看到pod的QoS等级是BestEffort。

    在创建pod的时候,没有指定任何内存、CPU的requests和limits的值。

    删除pod

    kubectl delete pod qos-demo-3 --namespace=qos-example

    4.5、创建包含2个容器的pod

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: qos-demo-4
      namespace: qos-example
    spec:
      containers:
    
      - name: qos-demo-4-ctr-1
        image: 172.20.58.152/middleware/nginx:1.21.4
        resources:
          requests:
            memory: "200Mi"
    
      - name: qos-demo-4-ctr-2
        image: 172.20.58.152/middleware/redis:6.2.6
    EOF

    通过以上的pod配置文件创建pod,其中包含2个容器,其中一个容器指定内存requests,另外的一个容器没有指定任何的资源配置。

    查看pod的运行状态

    [root@nccztsjb-node-23 ~]# kubectl get pod -n qos-example 
    NAME         READY   STATUS    RESTARTS         AGE
    qos-demo-4   2/2     Running   10 (3m55s ago)   25m

    查看pod的QoS等级

    [root@nccztsjb-node-23 ~]# kubectl get pod -n qos-example qos-demo-4 -o yaml | grep qosClass
      qosClass: Burstable
    [root@nccztsjb-node-23 ~]# 

    从输出的结果来看,该pod的QoS等级是Burstable。即pod中容器的request,limits的请求不满足guaranteed和besteffort的要求的,都是Burstable。

    删除pod

    kubectl delete pod qos-demo-4 --namespace=qos-example

    删除命名空间

    kubectl delete namespace qos-example

    OK,以上的验证示例,就说明了,在什么情况下,pod会被设置为什么样的QoS等级。

    5、总结

    pod中的所有容器都配置内存、cpu的requests和limits,并且requests的值和limits的值相等时,QoS等级:Guaranteed。

    pod中的所有容器都没有设置,cpu,内存的limits和requests,QoS等级:BestEffort

    其他情况,QoS等级:Burstable

  • 相关阅读:
    position : sticky
    学习笔记之段落里面最后出现省略号
    two or more web modules defined in the configuration have the same context root
    Android笔记:ActivitySpinner
    设计一个通讯录的XML文件
    使用JDBC连接SQL Server数据库
    SNMP使用UDP传送报文。为什么不使用TCP?
    计算Java程序运行时间
    android在xml的textStyle中,设置一个字体是粗体或斜体或带有下划线
    schema.xml文件里datatype的定义格式
  • 原文地址:https://www.cnblogs.com/chuanzhang053/p/15990140.html
Copyright © 2020-2023  润新知