一、QoS如何使用

1.1 示例1:实现QoS为Guaranteed的Pod

Guaranteed级别的Pod具有最高的优先级,Kubernetes会确保这些Pod获得足够的资源,也就是Kubernetes调度器会确保这些Pod调度到能够提供所需资源的节点上。

配置Guaranteed级别的Pod,需要满足如下条件:

  • 1)Pod中的每个容器必须指定limits.memory和requests.memory,并且两者需要相等

  • 2)Pod中的每个容器必须指定limits.cpu和limits.cpu,并且两者需要相等

yaml limits: memory: "200Mi" cpu: "700m" requests: memory: "200Mi" cpu: "700m"

下面进行示例演示:

1.定义一个yaml文件

[root@k8s-master01 study]# vim qos-guaranteed.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: qos-demo
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-ctr
    image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    resources:
      limits:
        memory: "200Mi"
        cpu: "700m"
      requests:
        memory: "200Mi"
        cpu: "700m"

2.创建一个命名空间

[root@k8s-master01 study]# kubectl create ns qos-example

3.创建Pod

[root@k8s-master01 study]# kubectl create -f qos-guaranteed.yaml -n qos-example

4.查看pod

[root@k8s-master01 study]# kubectl get po -n qos-example
NAME       READY   STATUS    RESTARTS   AGE
qos-demo   1/1     Running   0          33s

5.将pod输出到yaml文件,观察到qosClass: Guaranteed

[root@k8s-master01 study]# kubectl get po -n qos-example qos-demo -oyaml
...
...
    started: true
    state:
      running:
        startedAt: "2022-12-11T07:47:56Z"
  hostIP: 192.168.100.35
  phase: Running
  podIP: 172.27.14.203
  podIPs:
  - ip: 172.27.14.203
  qosClass: Guaranteed
  startTime: "2022-12-11T07:47:55Z"
...
...

1.2 示例2:实现QoS为Burstable的Pod

Burstable级别的Pod具有中等优先级,Kubernetes会尽量满足其资源请求,但在资源紧张时可能会被驱逐,Kubernetes调度器会确保这些Pod调度到能够提供所需资源的节点上,如果节点上有额外的资源,这些Pod可以使用超过其请求的资源。

配置Burstable级别的Pod,需要满足如下条件:

  • 1)Pod不符合Guaranteed的配置要求

  • 2)Pod中至少有一个容器配置了requests.cpu或requests.memory

yaml limits: memory: "200Mi" requests: memory: "100Mi"

下面进行示例演示:

1.定义一个yaml文件

[root@k8s-master01 study]# vim qos-burstable.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: qos-demo-2
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-2-ctr
    image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi"

2.创建一个命名空间

[root@k8s-master01 study]# kubectl create ns qos-example

3.创建Pod

[root@k8s-master01 study]# kubectl create -f qos-burstable.yaml  -n qos-example

4.查看pod

[root@k8s-master01 study]# kubectl get po -n qos-example

NAME         READY   STATUS    RESTARTS   AGE
qos-demo     1/1     Running   0          11m
qos-demo-2   1/1     Running   0          6s

5.将pod输出到yaml文件,观察到qosClass: Burstable

[root@k8s-master01 study]# kubectl get po -n qos-example qos-demo-2 -oyaml
...
...
...
    state:
      running:
        startedAt: "2022-12-11T07:59:20Z"
  hostIP: 192.168.100.34
  phase: Running
  podIP: 172.17.125.8
  podIPs:
  - ip: 172.17.125.8
  qosClass: Burstable
  startTime: "2022-12-11T07:59:19Z"

1.3 示例3:实现QoS为BestEffort的Pod

BestEffort级别的Pod是最低优先级,Kubernetes不保证这些Pod获得任何资源,在资源紧张时,这些Pod最先被驱逐。同时Kubernetes调度器会尝试将这些Pod调度到任何节点上,但不保证节点上有足够的资源。

配置BestEffort级别的Pod,不配置resources字段即可。

下面进行示例演示:

1.定义一个yaml文件

[root@k8s-master01 study]# vim qos-besteffort.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: qos-demo-3
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-3-ctr
    image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2

2.创建一个命名空间

[root@k8s-master01 study]# kubectl create ns qos-example

3.创建Pod

[root@k8s-master01 study]# kubectl create -f qos-besteffort.yaml   -n qos-example

4.查看pod

[root@k8s-master01 study]# kubectl get po -n qos-example

NAME         READY   STATUS    RESTARTS   AGE
qos-demo     1/1     Running   0          14m
qos-demo-2   1/1     Running   0          3m31s
qos-demo-3   1/1     Running   0          8s

5.将pod输出到yaml文件,观察到qosClass: BestEffort

[root@k8s-master01 study]# kubectl get po -n qos-example qos-demo-3 -oyaml
...
...
...
  - ip: 172.18.195.4
  qosClass: BestEffort
  startTime: "2022-12-11T08:02:42Z"