本文共 5662 字,大约阅读时间需要 18 分钟。
Kubernetes 作为当下最流行的的容器集群管理平台,需要统筹集群整体的资源使用情况,将合适的资源分配给pod容器使用,既要保证充分利用资源,提高资源利用率,又要保证重要容器在运行周期内能够分配到足够的资源稳定运行。
对于一个pod来说,资源最基础的2个的指标就是:CPU和内存。
Kubernetes提供了个采用requests和limits 两种类型参数对资源进行预分配和使用限制。limit 会限制pod的资源利用:部署一个压测容器,压测时会分配250M内存,但实际pod的内存limit为100Mi
apiVersion: v1kind: Podmetadata: name: memory-demo namespace: examplespec: containers: - name: memory-demo-2-ctr image: polinux/stress resources: requests: memory: "50Mi" limits: memory: "100Mi" command: ["stress"] args: ["--vm", "1", "--vm-bytes", "250M", "--vm-hang", "1"]
部署后查看pod状态,可以看到pod被OOM,
kubectl -n example get poNAME READY STATUS RESTARTS AGEmemory-demo 0/1 OOMKilled 1 11s
apiVersion: v1kind: Podmetadata: name: cpu-demo namespace: examplespec: containers: - name: cpu-demo-ctr image: vish/stress resources: limits: cpu: "1" requests: cpu: "0.5" args: - -cpus - "2"
查看容器信息,可以看到pod 虽然不会被kill掉,但是实际使用cpu被限制只有1000m。
kubectl -n example top po cpu-demoNAME CPU(cores) MEMORY(bytes)cpu-demo 1000m 0Mi
Kubernetes 提供服务质量管理,根据容器的资源配置,将pod 分为Guaranteed, Burstable, BestEffort 3个级别。当资源紧张时根据分级决定调度和驱逐策略,这三个分级分别代表:
计算qos代码:
Kubernetes会根据QoS设置oom的评分调整参数oom_score_adj
,oom_killer 根据 内存使用情况算出oom_score, 并且和oom_score_adj
综合评价,进程的评分越高,当发生oom时越优先被kill。
QoS | oom_score_adj |
---|---|
Guaranteed | -998 |
BestEffort | 1000 |
Burstable | min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999) |
当节点内存不足时,QoS为Guaranteed 的pod 最后被kill。 而BestEffort 级别的pod优先被kill。 其次是Burstable,根据计算公式 oom_score_adj 值范围2到999,设置的request越大,oom_score_adj越低,oom时保护程度越高。
节点信息:# kubectl describe no cn-beijing.i-2zeavb11mttnqnnicwj9 | grep -A 3 CapacityCapacity: cpu: 4 memory: 8010196Ki pods: 110
apiVersion: v1kind: Podmetadata: name: memory-demo-qos-1 namespace: examplespec: containers: - name: memory-demo-qos-1 image: polinux/stress resources: requests: memory: "200Mi" command: ["stress"] args: ["--vm", "1", "--vm-bytes", "50M", "--vm-hang", "1"] ---apiVersion: v1kind: Podmetadata: name: memory-demo-qos-2 namespace: examplespec: containers: - name: memory-demo-qos-2 image: polinux/stress resources: requests: memory: "400Mi" command: ["stress"] args: ["--vm", "1", "--vm-bytes", "50M", "--vm-hang", "1"]---apiVersion: v1kind: Podmetadata: name: memory-demo-qos-3 namespace: examplespec: containers: - name: memory-demo-qos-3 image: polinux/stress resources: requests: memory: "200Mi" cpu: "2" limits: memory: "200Mi" cpu: "2" command: ["stress"] args: ["--vm", "1", "--vm-bytes", "50M", "--vm-hang", "1"]
单个节点可分配内存为8010196Ki, 大约7822.45Mi。
根据Burstable 的计算方式:request 200Mi: (1000 - 1000*200/7822.45) 约为975request 400Mi: (1000 - 1000*400/7822.45) 约为950
我们分别查看这3个pod的oom参数
// request 200Mi kubectl -n example exec memory-demo-qos-1 cat /proc/1/oom_score_adj975// request 400Miß kubectl -n example exec memory-demo-qos-2 cat /proc/1/oom_score_adj949// Guaranteed kubectl -n example exec memory-demo-qos-3 cat /proc/1/oom_score_adj-998
设置oom 规则代码:
当节点的内存和cpu资源不足,开始驱逐节点上的pod时。QoS同样会影响驱逐的优先级。顺序如下:
Kubernetes提供ResourceQuota对象,用于配置限制namespace内的每种类型的k8s对象数量和资源(cpu,内存)。
apiVersion: v1kind: ResourceQuotametadata: name: mem-cpu-demo namespace: examplespec: hard: requests.cpu: "3" requests.memory: 1Gi limits.cpu: "5" limits.memory: 2Gi pods: "5"
LimitRange 是用来设置 namespace 中 Pod 的默认的资源 request 和 limit 值,以及大小范围。
apiVersion: v1kind: LimitRangemetadata: name: mem-limit-range namespace: examplespec: limits: - default: # default limit memory: 512Mi cpu: 2 defaultRequest: # default request memory: 256Mi cpu: 0.5 max: # max limit memory: 800Mi cpu: 3 min: # min request memory: 100Mi cpu: 0.3 maxLimitRequestRatio: # max value for limit / request memory: 2 cpu: 2 type: Container # limit type, support: Container / Pod / PersistentVolumeClaim
limitRange支持的参数如下:
转载地址:http://mgvhl.baihongyu.com/