16、kubernetes之 容器资源需求和资源限制

第十三部分 (Pod)容器资源和容器限制

CPU资源,属于可压缩资源,一个pod或一个容器应该获取指定的资源获取不到时,无非就是等待,
内存:属于非可压缩型资源,可能会因为内存资源耗尽而被kill掉。
资源的起始值和终止值
官网:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/

容器的资源需求,资源限制
   Request:需求,最低保障;
   Limits:限制,硬限制
   CPU:
     1颗逻辑(虚拟)CPU
     1=1000,millcores(毫核)
     500m=0.5CPU
   内存:
     E、P、T、G、M、K、Ei、Pi

Request保障容器CPU资源可用。示图。

 

创建资源配置案例。
[root@k8s-master metrics]# cat pod-res-demo.yaml

[root@k8s-master metrics]# cat pod-res-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-res-demo
  namespace: default
  labels:
    app: resapp
    tier: frontend
spec:
  containers:
  - image: ikubernetes/stress-ng
    name: resapp
    command: ["/usr/bin/stress-ng","-m 1","-c 1","--metrics-brief"]
    resources:
      requests:
        cpu: "200m"
        memory: "128Mi"
      limits:
        cpu: "500m"
        memory: "512Mi"

[root@k8s-master metrics]# kubectl create -f pod-res-demo.yaml
[root@k8s-master metrics]# kubectl exec -it pod-res-demo -- /bin/sh
[root@k8s-master metrics]# kubectl exec -it pod-res-demo -- top

查看CPU压缩使用情况
[root@master ~]# cat /proc/cpuinfo |grep "processor" |wc –l 查看CPU个数,宿主机是2个
1
500m占整个cpu的50%,测试正常。
内存压测限制,导致直接进不去,这里就不演示了。

Qos是被自动配置的

  Guranteed:每个容器cpu和内存资源设置了相同值request、limits,当集群资源紧张时,拥有最高优先级调度。
    同时设置CPU和内存的request和limits,且相等,自动归类为guranteed。
      Cpu.limits=cpu.requests
      Memory.limites=memory.request
  Burstable:
     至少有一个容器设置CPU或内存资源的requests属性,具有中等优先级BestEffort:没有任何一个容器设置了request或limit是属性,最低优先级;

查看上面的Qos,因为设置了cpu,所有术语Burstable中等优先级。
下面我们试试最高优先级的

[root@k8s-master metrics]# cat pod-res-gurantee.yaml  
apiVersion: v1
kind: Pod
metadata:
  name: pod-res-gur
  namespace: default
  labels:
    app: resapp-gur
    tier: frontend
spec:
  containers:
  - image: ikubernetes/myapp:v1
    name: resapp-gur
    resources:
      requests:
        cpu: "500m"
        memory: "400Mi"
      limits:
        cpu: "500m"
        memory: "400Mi"
[root@k8s-master metrics]# kubectl create -f pod-res-gurantee.yaml 
pod/pod-res-gur created
[root@k8s-master metrics]# kubectl get pod/pod-res-gur
NAME          READY   STATUS    RESTARTS   AGE
pod-res-gur   1/1     Running   0          9s

[root@k8s-master metrics]# kubectl describe pod/pod-res-gur |grep QoS 如上,自动升级,优先级提升到最高
QoS Class: Guaranteed

没有设置QoS会自动匹配
[root@k8s-master metrics]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx-deploy created
[root@k8s-master metrics]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deploy-55d8d67cf-zkctp 1/1 Running 0 10s
pod-res-gur 1/1 Running 0 7m9s
[root@k8s-master metrics]# kubectl describe pod nginx-deploy-55d8d67cf-zkctp|grep QoS
QoS Class: BestEffort
综上当资源不够使用是,BestEffort上面的容器会被优先终止,以腾出资源,确保另外两类pod中容器能够正常运行。优先保证高优先级的容器运行。相同条件下,优先会kill(最低需要保证/最大限制)比率高

怎么看容器资源使用情况。
生产环境配置参数一般需要根据实际情况来配置这些参数,因此,这些数据的采集需要通过监控服务来采集。
[root@k8s-master ~]# kubectl top     #需要部署数据采集和存储
Display Resource (CPU/Memory/Storage) usage.

 ====新版以下作废,仅供参考

本人采用的是prometheus监控模式,高版本的kubelet已弃用内置cadvisor,所以这里不介绍Influxdb+headster+grafana监控。

关于prometheus监控,可参与前期章节(https://www.cnblogs.com/sunnyyangwang/p/10950382.html)。

Influxdb默认没有存储卷。

Heapster汇聚指标数据

 

 默认采集工具,HeapSter只采集数据,在本节点采集。

新版本的Kubelet内置的cadvisor手机工具,可在单节点查看。默认4194端口。

Cadvisor主动向heapster输入数据,数据缓存在内存中。

需要依赖外部时序数据库系统。

posted @ 2019-06-06 10:27  wang_wei123  阅读(311)  评论(0编辑  收藏  举报