Kubernetes——资源配额

文章目录

    • Pod资源配额
      • 最小资源配额
      • 最大资源配额
    • 全局资源配额
      • 默认配额策略
      • 资源配额范围
      • 基于 Pod 的资源配额
    • 全局 quota 配额
      • 基于总数量配额

Pod资源配额

  • 为什么要资源配额?

    • 当多个应用共享固定节点数目的集群时,人们会担心某些应用过度使用资源,从而影响到其他的服务,我们需要设定一些规则,用来保证应用能获得其运行所需的合理资源
  • CPU资源类型

    • CPU资源的约束和请求以毫核(m)为单位。在k8s中1m是最小的调度单位,CPU的一个核心可以看作1000m
    • 假如你有2颗CPU,且每个CPU为4核心,那么你的CPU资源总量就是8000m
  • 内存资源类型

    • memory的约束个请求以字节为单位

    • 可以使用以下单位表示内存:E、P、T、G、M、k

    • 也可以使用对应的2的幂数:Ei、Pi、Ti、Gi、Mi、Ki

      1k == 1000

      1Ki == 1024

最小资源配额

内存需求配额

[root@master ~]# vim minpod.yaml 
---
kind: Pod
apiVersion: v1
metadata:name: minpod
spec:terminationGracePeriodSeconds: 0restartPolicy: AlwaysnodeSelector:kubernetes.io/hostname: node-0003containers:- name: linuximage: myos:v2009command: ["awk", "BEGIN{while(1){}}"]resources:               # 设置配额requests:              # 最小配额memory: "1200Mi"     # 内存配额[root@master ~]# sed 's,minpod,app1,' minpod.yaml |kubectl apply -f -
pod/app1 created
[root@master ~]# sed 's,minpod,app2,' minpod.yaml |kubectl apply -f -
pod/app2 created
[root@master ~]# sed 's,minpod,app3,' minpod.yaml |kubectl apply -f -
pod/app3 created
[root@master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
app1   1/1     Running   0          16s
app2   1/1     Running   0          7s
app3   1/1     Running   0          1s
[root@master ~]# sed 's,minpod,app4,' minpod.yaml |kubectl apply -f -
pod/app4 created
# 超出服务器资源限制了,云主机2CPU,4G内存
[root@master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
app1   1/1     Running   0          24s
app2   1/1     Running   0          15s
app3   1/1     Running   0          9s
app4   0/1     Pending   0          2s
[root@master ~]# kubectl delete pod app{1..4}
pod "app1" deleted
pod "app2" deleted
pod "app3" deleted
pod "app4" deleted

计算资源需求配额

[root@master ~]# vim minpod.yaml 
---
kind: Pod
apiVersion: v1
metadata:name: minpod
spec:terminationGracePeriodSeconds: 0restartPolicy: AlwaysnodeSelector:kubernetes.io/hostname: node-0003containers:- name: linuximage: myos:v2009command: ["awk", "BEGIN{while(1){}}"]resources:requests:cpu: "800m"          # 计算资源需求memory: "1200Mi"[root@master ~]# sed 's,minpod,app1,' minpod.yaml |kubectl apply -f -
pod/app1 created
[root@master ~]# sed 's,minpod,app2,' minpod.yaml |kubectl apply -f -
pod/app2 created
[root@master ~]# sed 's,minpod,app3,' minpod.yaml |kubectl apply -f -
pod/app3 created
[root@master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
app1   1/1     Running   0          9s
app2   1/1     Running   0          6s
app3   0/1     Pending   0          3s
[root@master ~]# kubectl delete pod app{1..3}
pod "app1" deleted
pod "app2" deleted
pod "app3" deleted

最大资源配额

[root@master ~]# vim maxpod.yaml 
---
kind: Pod
apiVersion: v1
metadata:name: maxpod
spec:terminationGracePeriodSeconds: 0restartPolicy: Alwayscontainers:- name: linuximage: myos:v2009command: ["awk", "BEGIN{while(1){}}"]# 不设置配额内存与计算资源都没有限制
[root@master ~]# kubectl apply -f maxpod.yaml
[root@master ~]# kubectl cp memtest.py maxpod:/usr/bin/
[root@master ~]# kubectl exec -it maxpod -- /bin/bash
[root@maxpod /]# memtest.py 2500
use memory success
press any key to exit : 
[root@maxpod /]# ps aux
USER     PID   %CPU   %MEM    VSZ    RSS  TTY  STAT  START   TIME  COMMAND
root       1   99.9    0.0    9924   128   ?   Rs    07:45   3:52  awk BEGIN{while(1){}}

添加资源配额

[root@master ~]# vim maxpod.yaml 
---
kind: Pod
apiVersion: v1
metadata:name: maxpod
spec:terminationGracePeriodSeconds: 0restartPolicy: Alwayscontainers:- name: linuximage: myos:v2009command: ["awk", "BEGIN{while(1){}}"]resources:limits:cpu: "800m"memory: "2000Mi"[root@master ~]# kubectl delete -f maxpod.yaml 
pod "maxpod" deleted
[root@master ~]# kubectl apply -f maxpod.yaml 
pod/maxpod created
[root@master ~]# kubectl cp memtest.py maxpod:/usr/bin/
[root@master ~]# kubectl exec -it maxpod -- /bin/bash
[root@maxpod /]# memtest.py 2500
Killed
[root@maxpod /]# memtest.py 1500
use memory success
press any key to exit :
[root@maxpod /]# ps aux
USER     PID   %CPU   %MEM    VSZ    RSS  TTY  STAT  START   TIME  COMMAND
root       1   79.8    0.0    9924   484   ?   Rs    07:52   1:10  awk BEGIN{while(1){}}[root@master ~]# kubectl delete -f maxpod.yaml 
pod "maxpod" deleted

全局资源配额

  • 为每个Pod设置资源配额策略不方便且不好管理。管理员可以以名称空间为单位(namespace),限制其资源的使用与创建,在该名称空间创建的容器都会受到规则的限制

  • k8s支持的全局资源配额方式有:

    • 对内存、CPU、存储资源进行配额:LimitRange
    • 对Pod的进行配额:ResourceQuota
# 样例
---
apiVersion: v1
kind: LimitRange
metadata:name: mylimit			# 规则名称namespace: myns       # 规则生效的名称空间
spec:limits:               # 全局限制规则- type: Container     # 资源类型default:            # 如果没有配置资源配额,以下配置生效cpu: 300m 		# CPU限额memory: 500Mi     # 内存限额defaultRequest:cpu: 8m  			# 最小保留资源,CPUmemory: 8Mi 		# 最小保留资源,内存

默认配额策略

# 创建名称空间
[root@master ~]# kubectl create namespace myns
namespace/myns created
# 设置默认配额
[root@master ~]# vim mynslimit.yaml
---
apiVersion: v1
kind: LimitRange
metadata:name: mylimit namespace: myns       
spec:limits:               - type: Container     default:            cpu: 300m memory: 500Mi     defaultRequest:cpu: 8m  memory: 8Mi [root@master ~]# kubectl -n myns apply -f mynslimit.yaml
limitrange/mylimit created 

验证默认资源配额

# 删除配额策略,创建容器
[root@master ~]# vim maxpod.yaml
---
kind: Pod
apiVersion: v1
metadata:name: maxpod
spec:terminationGracePeriodSeconds: 0restartPolicy: Alwayscontainers:- name: linuximage: myos:v2009command: ["awk", "BEGIN{while(1){}}"][root@master ~]# kubectl -n myns apply -f maxpod.yaml
pod/maxpod created
[root@master ~]# kubectl -n myns cp memtest.py maxpod:/usr/bin/
[root@master ~]# kubectl -n myns exec -it maxpod -- /bin/bash
[root@maxpod /]# memtest.py 500
Killed
[root@maxpod /]# memtest.py 300
use memory success
press any key to exit : 
[root@maxpod /]# ps aux
USER     PID   %CPU   %MEM    VSZ    RSS  TTY  STAT  START   TIME  COMMAND
root       1   28.9    0.0    9924   720   ?   Rs    08:09   0:09  awk BEGIN{while(1){}}[root@master ~]# kubectl -n myns describe pod maxpod
... ...Limits:cpu:     300mmemory:  500MiRequests:cpu:     10mmemory:  8Mi
... ...

用户自定义资源配额

[root@master ~]# vim maxpod.yaml
---
kind: Pod
apiVersion: v1
metadata:name: maxpod
spec:terminationGracePeriodSeconds: 0restartPolicy: Alwayscontainers:- name: linuximage: myos:v2009command: ["awk", "BEGIN{while(1){}}"]resources:limits:cpu: "1000m"memory: "2000Mi"[root@master ~]# kubectl -n myns delete -f maxpod.yaml 
pod "maxpod" deleted
[root@master ~]# kubectl -n myns apply -f maxpod.yaml
pod/maxpod created[root@master ~]# kubectl -n myns exec -it maxpod -- /bin/bash
[root@maxpod /]# ps aux
USER     PID   %CPU   %MEM    VSZ    RSS  TTY  STAT  START   TIME  COMMAND
root       1   99.9    0.0    9924   720   ?   Rs    08:09   0:09  awk BEGIN{while(1){}}[root@master ~]# kubectl -n myns describe pod maxpod
... ...Limits:cpu:     1000mmemory:  2000MiRequests:cpu:     10mmemory:  8Mi
... ...

资源配额范围

# 样例
... ...
spec:					# LimitRange.spec配置limits:               # 全局限制规则- type: Container     # 资源类型... ...	            # 在默认资源配额下添加max:				# 最大限制cpu: "800m"		# CPU限额memory: "1000Mi"	# 内存限额min:				# 最小限额cpu: "2m"			# CPU限额memory: "8Mi"		# 内存限额
[root@master ~]# vim mynslimit.yaml 
---
apiVersion: v1
kind: LimitRange
metadata:name: mylimitnamespace: myns
spec:limits:               - type: Container     default:            cpu: 300m memory: 500Mi     defaultRequest:cpu: 8m  memory: 8Mi max:cpu: "800m"memory: "1000Mi"min:cpu: "2m"memory: "8Mi"[root@master ~]# kubectl -n myns apply -f mynslimit.yaml 
limitrange/mylimit configured[root@master ~]# kubectl -n myns delete -f maxpod.yaml 
pod "maxpod" deleted
[root@master ~]# kubectl -n myns apply -f maxpod.yaml 
Error from server (Forbidden): error when creating "maxpod.yaml": pods "maxpod" is forbidden: [maximum cpu usage per Container is 800m, but limit is 1, maximum memory usage per Container is 1000Mi, but limit is 2000Mi]

多容器资源配额

[root@master ~]# vim maxpod.yaml 
---
kind: Pod
apiVersion: v1
metadata:name: maxpod
spec:terminationGracePeriodSeconds: 0restartPolicy: Alwayscontainers:- name: c1image: myos:v2009command: ["awk", "BEGIN{while(1){}}"]resources:limits:cpu: "800m"memory: "1000Mi"- name: c2image: myos:v2009command: ["awk", "BEGIN{while(1){}}"]resources:limits:cpu: "800m"memory: "1000Mi"[root@master ~]# kubectl -n myns apply -f maxpod.yaml 
pod/maxpod created
[root@master ~]# kubectl -n myns get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE    IP            NODE
maxpod   2/2     Running   0          107s   10.244.2.65   node-0002
#----------------------------------------------------------------------
# 在节点上查看资源占用情况
[root@node-0002 ~]# ps aux |grep awk
root     20369 80.1  0.0   9924   720 ?     Rs   16:23   2:38 awk BEGIN{while(1){}}
root     20405 79.9  0.0   9924   720 ?     Rs   16:23   2:38 awk BEGIN{while(1){}}
... ...

基于 Pod 的资源配额

... ...
spec:					# LimitRange.spec配置limits:				# 全局限制规则- type: Pod			# 资源类型max:				# 最大限额cpu: "1200m"		# CPU限额memory: "1200Mi"	# 内存限额min:				# 最小限额cpu: "2m"			# CPU限额memory: "8Mi"		# 内存限额
[root@master ~]# vim mynslimit.yaml 
---
apiVersion: v1
kind: LimitRange
metadata:name: mylimitnamespace: myns
spec:limits:               - type: Container     default:            cpu: 300m memory: 500Mi     defaultRequest:cpu: 8m  memory: 8Mi max:cpu: "800m"memory: "1000Mi"min:cpu: "2m"memory: "8Mi"- type: Podmax:cpu: "1200m"memory: "1200Mi"min:cpu: "2m"memory: "8Mi"[root@master ~]# kubectl -n myns apply -f mynslimit.yaml
limitrange/mylimit configured[root@master ~]# kubectl -n myns delete -f maxpod.yaml 
pod "maxpod" deleted
[root@master ~]# kubectl -n myns apply -f maxpod.yaml 
Error from server (Forbidden): error when creating "maxpod.yaml": pods "maxpod" is forbidden: [maximum cpu usage per Pod is 1200m, but limit is 1600m, maximum memory usage per Pod is 1200Mi, but limit is 2097152k]

全局 quota 配额

多个 Pod 消耗资源

[root@master ~]# vim maxpod.yaml 
---
kind: Pod
apiVersion: v1
metadata:name: maxpod
spec:terminationGracePeriodSeconds: 0restartPolicy: Alwayscontainers:- name: c1image: myos:v2009command: ["awk", "BEGIN{while(1){}}"]resources:requests:cpu: "8m"memory: "8Mi"limits:cpu: "600m"memory: "1000Mi"# 创建太多Pod,资源也会耗尽
[root@master ~]# for i in app{1..9};do sed "s,maxpod,${i}," maxpod.yaml ;done |kubectl -n myns apply -f -
pod/app1 created
pod/app2 created
pod/app3 created
pod/app4 created
pod/app5 created
pod/app6 created
pod/app7 created
pod/app8 created
pod/app9 created#----------------------------------------------------------------------
# 在计算节点上查看资源占用情况
[root@node-0001 ~]# ps aux |grep awk
root     26768 60.7  0.0   9924   716 ?     Rs   16:35   0:29 awk BEGIN{while(1){}}
root     26842 60.2  0.0   9924   716 ?     Rs   16:35   0:29 awk BEGIN{while(1){}}
root     26870 60.1  0.0   9924   716 ?     Rs   16:35   0:29 awk BEGIN{while(1){}}

基于总数量配额

[root@master ~]# vim mynsquota.yaml
---
apiVersion: v1
kind: ResourceQuota				# 全局资源限额对象
metadata:name: myquota					# 规则名称namespace: myns				# 规则作用的名称空间
spec:							# ResoureQuota.spec定义hard:							# 创建强制规则requests.cpu: "1000m"		# 最小CPU配额总数requests.memory: "2000Mi"	# 最小内存配额总数limits.cpu: "5000m"			# 最大CPU配额总数limits.memory: "8Gi"		# 最大内存配额总数pods: "3"					# 限制创建资源对象总量[root@master ~]# kubectl -n myns apply -f mynsquota.yaml 
resourcequota/myquota created

验证 quota 配额

[root@master ~]# kubectl -n myns delete pod app{1..9}
pod "app1" deleted
pod "app2" deleted
pod "app3" deleted
pod "app4" deleted
pod "app5" deleted
pod "app6" deleted
pod "app7" deleted
pod "app8" deleted
pod "app9" deleted[root@master ~]# sed 's,maxpod,app1,' maxpod.yaml |kubectl -n myns apply -f -
pod/app1 created
[root@master ~]# sed 's,maxpod,app2,' maxpod.yaml |kubectl -n myns apply -f -
pod/app2 created
[root@master ~]# sed 's,maxpod,app3,' maxpod.yaml |kubectl -n myns apply -f -
pod/app3 created
[root@master ~]# sed 's,maxpod,app4,' maxpod.yaml |kubectl -n myns apply -f -
Error from server (Forbidden): error when creating "STDIN": pods "app4" is forbidden: exceeded quota: myquota, requested: pods=1, used: pods=3, limited: pods=3


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部