kubernetes之配置Pod的QoS

余生长醉 提交于 2020-01-19 17:16:40

简介

此文讲述如何配置Pod的QoS(Quality of Service)即服务质量。Kubernetes使用QoS类来做出有关调度和驱逐Pod的决策。

备注:此文档参考官方文档,并加以自己的理解。如有误导性的内容,请批评指正。

QoS类

当Kubernetes创建Pod时,它将为这些Pod分配以下QoS类之一:

  • Guaranteed
  • Burstable
  • BestEffort

创建一个分配了QoS类Guaranteed的Pod

创建namespace

# kubectl create namespace qos-example

为Pod提供QoS类为Guaranteed的条件:

  • Pod中的每个容器必须有内存请求和内存限制,而且它们的值必须相同
  • Pod中的每个容器必须有CPU请求和CPU限制,而且它们的值必须相同

创建一个Pod,该Pod中只有一个容器。该容器中自定义了内存请求和内寸限制,均等于200MiB,CPU请求和CPU限制均等于 700 milli CPU。文件名:qos-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: qos-demo
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-ctr
    image: nginx
    resources:
      limits:
        memory: "200Mi"
        cpu: "700m"
      requests:
        memory: "200Mi"
        cpu: "700m"
# kubectl apply -f /root/k8s-example/pods/qos-pod.yaml --namespace=qos-example

查看Pod资源详情

# kubectl get pod qos-demo --namespace=qos-example --output=yaml

从输出结果看出,Kubernetes为Pod提供了QoS类的Guaranteed。输出还验证Pod容器的内存请求与其内存限制相匹配,并且其CPU请求与其CPU限制相匹配。

spec:
  containers:
    ...
    resources:
      limits:
        cpu: 700m
        memory: 200Mi
      requests:
        cpu: 700m
        memory: 200Mi
...
  qosClass: Guaranteed

备注:如果容器自定义了自己的内存限制,但是没有定义内存请求,Kubernetes自动将默认的内存限制数设置为改容器的内存请求数;如果容器自定义了CPU限制,但是没有定义CPU请求,Kubernetes自动将默认的CPU限制数设置为该容器的CPU请求数。

删除改Pod

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

创建一个分配了QoS级Burstable的Pod

如果满足以下条件,则为Pod提供burstable的QoS类:

  • Pod不符合QoS类别保证的标准。
  • Pod中至少有一个容器具有内存或CPU请求。

创建一个Pod,该Pod中只有一个容器,容器的内存限制数为200 MiB,内存请求数为100 MiB。文件名:qos-pod-2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: qos-demo-2
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-2-ctr
    image: nginx
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi"
# kubectl apply -f /root/k8s-example/pods/qos-pod-2.yaml --namespace=qos-example

查看Pod资源详情

# kubectl get pod qos-demo-2 --namespace=qos-example --output=yaml

输出显示Kubernetes为Pod提供了burstable的QoS类

spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: qos-demo-2-ctr
    resources:
      limits:
        memory: 200Mi
      requests:
        memory: 100Mi
...
  qosClass: Burstable

删除Pod

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

创建一个分配了BestEffort QoS类的Pod

为了使Pod获得BestEffort的QoS类,Pod中的容器不得具有任何内存或CPU限制或请求。

创建一个Pod,Pod中只有一个容器。容器没有内存或CPU限制和请求

apiVersion: v1
kind: Pod
metadata:
  name: qos-demo-3
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-3-ctr
    image: nginx
# kubectl apply -f /root/k8s-example/pods/qos-pod-3.yaml --namespace=qos-example  

查看Pod资源详情

# kubectl get pod qos-demo-3 --namespace=qos-example --output=yaml

输出显示Kubernetes为Pod提供了BestEffort的QoS类。

spec:
  containers:
    ...
    resources: {}
  ...
  qosClass: BestEffort

删除Pod

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

在一个Pod中创建两个容器

创建包含两个容器的Pod。一个容器自定义内存请求200 MiB。另一个容器不定义资源任何请求或限制。文件名:qos-pod-4.yaml

apiVersion: v1
kind: Pod
metadata:
  name: qos-demo-4
  namespace: qos-example
spec:
  containers:

  - name: qos-demo-4-ctr-1
    image: nginx
    resources:
      requests:
        memory: "200Mi"

  - name: qos-demo-4-ctr-2
    image: redis
# kubectl apply -f /root/k8s-example/pods/qos-pod-4.yaml --namespace=qos-example

查看Pod资源详情

# kubectl get pod qos-demo-4 --namespace=qos-example --output=yaml

注意,此Pod符合QoS类别Burstable的标准。也就是说,它不符合Guaranteed的QoS类别的标准,并且其“容器”之一具有内存请求。

spec:
  containers:
    ...
    name: qos-demo-4-ctr-1
    resources:
      requests:
        memory: 200Mi
    ...
    name: qos-demo-4-ctr-2
    resources: {}
    ...
  qosClass: Burstable

删除Pod

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

删除namespace

# kubectl delete namespace qos-example

总结

1、Pod的QoS类有三种GuaranteedBurstableBestEffort

2、为Pod提供QoS类为Guaranteed的条件:

  • Pod中的每个容器必须有内存请求和内存限制,而且它们的值必须相同
  • Pod中的每个容器必须有CPU请求和CPU限制,而且它们的值必须相同

3、为Pod提供burstable的QoS类的条件:

  • Pod不符合QoS类别Guaranteed的标准。
  • Pod中至少有一个容器具有内存或CPU请求。

4、为Pod提供BestEffort的QoS类的条件:Pod中的容器不得具有任何内存或CPU限制或请求。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!