Pod资源限制

Pod资源限制:

限制两个维度:

  • pod

    • cpu、内存、gpu、网络、磁盘io
  • namespace

    • 对pod使用总资源限制
    • 对pvc使用总资源限制

限制策略

  • requests: 需求,最低运行环境。但不是立即使用,用多少占多少
  • limits: 限制,最大使用上限

可限制资源:

CPU资源:

例:1核心的cpu,使用时支持小数、毫核

1c=1000m	 millicores(毫核)
0.5c=500m

内存资源:

E、P、T、G、M、K
Ei、Pi、Ti、Gi、Mi、Ki

hugepages(大内存页):

不建议手动分配,如果每个系统内存页不同,可能会出现奇怪的问题

hugepages-<size>: 内存
hugepages-2Mi: 80Mi			#在默认内存页为4KiB的系统上,如果容器尝试分配超过40个2MiB的大页面(总共 80MiB),则分配失败

gpu:

对于图形计算才用得到,同时也需要物理机有英伟达显卡
需要装相应的插件才能识别gpu资源

nvidia.com/gpu: 1
amd.com/gpu: 1

Qos服务质量类别:

当容器被限制了资源后,自动归类到此

Guranteed(确保)

同时设置了cpu和内存的requests和limits,且满足以下

cpu.limits = cpu.requests
mem.limits = mem.requests

此类优先级最高,如果其他pod也要运行,但有标记了此类的,优先运行他们

Burstable

至少一个容器设置了cpu或内存资源的requests

BestEffort

没有一个容器设置了requests或limits
当资源不足时,此类资源优先被终止,腾出资源给前面的两种

查看pod的Qos:

kubectl get po b1-689bb88886-2dssl -o template --template={{.status.qosClass}} ;echo

POD级别配置语法:

kubectl explain pod.spec.containers.resources

pod.spec.containers.resources:
	requests: <map[string]string>
		cpu: 0.5
		memory: 500M
		hugepages-内存大小:
	limits: <map[string]string>
		cpu:
		memory:
		hugepages-内存大小:
例1: 限制pod运行资源
apiVersion: v1
kind: Pod
metadata:
  name: tomcat
  namespace: default
  labels:
    app: tomcat
spec:
  containers:
  - name: tomcat
    image: tomcat
    imagePullPolicy: IfNotPresent
    ports:
      - containerPort: 8080
    resources:
      requests:
        cpu: "100m"
        memory: "100Mi"
      limits:
        cpu: "0.3"
        memory: "100Mi"
apiVersion: v1
kind: LimitRange
metadata:
  namespace: default
  name: limits-default
spec:
  limits: 
  - type: Container
    default:
      cpu: 1
      memory: 200Mi
    defaultRequest:
      cpu: 1
      memory: 200Mi
    min:
      cpu: 1
      memory: 100Mi
    max:
      cpu: 2
      memory: 2Gi
    maxLimitRequestRatio:
      cpu: 2
      memory: 2
  - type: PersistentVolumeClaim
    default:
      storage: 1Gi
    defaultRequest:
      storage: 1Gi
    max:
      storage: 5Gi
  - type: Pod
    max:
      cpu: 4
      memory: 5Gi

Namespace级别配置语法

命名空间内资源限制

只是限制命令空间单个pod、容器、pvc的容量限制,并不是对命名空间总共允许使用的资源限制

kubectl explain limits.spec

apiVersion: v1
kind: LimitRange
metadata:
  name: default
spec:
  limits:
  - type: 限制类型
        #Pod
        #Container
        #PersistentVolumeClaim
        #PodTemplate
        #Namespace
    default:        	#此处定义默认限制值
      cpu: 500m
      memory: 100Mi
      storage: 10Gi     #此选项仅用于pvc类型,配置pvc创建大小
    defaultRequest:     #此处定义默认请求值
    min:
    max:
    maxLimitRequestRatio:
      cpu: 2        	#限制cpu limit和request比例最大为2,也就是pod创建时,request指定的大小*2后,必须等于limit指定的值,如:
      	#request: 1,limit: 2。合法创建,如果为1.5就不能被创建
      	request: 1,limit: 4。不合法创建,两者的比例是1/4了
      memory: 2     	#限制内存limit和request比例最大为2
例1: 命名空间资源限制
1)创建资源限制
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: LimitRange
metadata:
  namespace: default
  name: limits-default
spec:
  limits: 
  - type: Container
    default:
      cpu: 1
      memory: 200Mi
    defaultRequest:
      cpu: 1
      memory: 200Mi
    min:
      cpu: 1
      memory: 100Mi
    max:
      cpu: 2
      memory: 2Gi
    maxLimitRequestRatio:
      cpu: 2
      memory: 2
  - type: PersistentVolumeClaim
    default:
      storage: 1Gi
    defaultRequest:
      storage: 1Gi
    max:
      storage: 5Gi
  - type: Pod
    max:
      cpu: 4
      memory: 5Gi
EOF

2)创建测试pod

cat <<eof |kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: tomcat
  namespace: default
  labels:
    app: tomcat
spec:
  containers:
  - name: tomcat
    image: tomcat
    imagePullPolicy: IfNotPresent
    ports:
      - containerPort: 8080
    resources:
      requests:
        cpu: 2
        memory: 200Mi
      limits:
        cpu: 1
        memory: 100Mi
eof

image-20230721000500362

命名空间资源配额

对命名空间的资源使用配置上限,超过后拒绝创建pod
支持配额的资源:https://kubernetes.io/zh-cn/docs/concepts/policy/resource-quotas/

kubectl explain quota.spec

apiVersion: v1
kind: ResourceQuota
metadata:
    name: quota
    namespace: default
spec:
    hard:
        requests.cpu: "1"       #命名空间中所有 Pod 的内存请求总和不能超过 1 GiB
        requests.memory: 1Gi    #命名空间中所有 Pod 的 CPU 请求总和不能超过 1 cpu
        limits.cpu: "2"         #命名空间中所有 Pod 的 CPU 限制总和不能超过 2 cpu
        limits.memory: 2Gi      #命名空间中所有 Pod 的内存限制总和不能超过 2 GiB
    scopeSelector:          #指定命名空间中哪些Pod会受到限制
        matchExpressions:   #使用标签选择器
            operator:   
                #DoesNotExist
                #Exists
                #In
                #NotIn
            scopeName:
                #BestEffort,Pod没有设置资源请求和限制,即使用集群中的剩余资源
                #CrossNamespacesPodAffinity,只有符合跨命名空间Pod亲和性策略的Pod会受到限制,跨命名空间Pod亲和性策略是指Pod与其他命名空间中的Pod有亲和性要求
                #NotBestEffort,不符合BestEffort策略的Pod会受到限制
                #NotTerminating,不符合终止状态的pod受到限制
                #PriorityClass,只有设置了优先级的Pod会受到限制
                #Terminating,只有在终止状态pod受到限制
            values:
            - 命名空间
    scopes:         #指定命名空间中哪些Pod会受到配额限制
        #BestEffort
        #NotTerminating
例1: 命名空间资源配额
1)创建资源配额
cat <<-eof |kubectl apply -f -
apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-demo
  namespace: default
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.nvidia.com/gpu: 4
    pods: 4
    services: 6
eof
2)创建测试pod
cat <<-eof |kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: quota-mem-cpu-demo
spec:
  containers:
  - name: quota-mem-cpu-demo-ctr
    image: nginx
    resources:
      limits:
        memory: 800Mi
        cpu: 2
      requests:
        memory: 400Mi
        cpu: 1
eof
3)查看配额使用情况
#可以看到,已经cpu已经使用完了,内存还剩600Mi
kubectl describe quota

image-20230721002555018

posted @ 2022-09-02 16:00  suyanhj  阅读(403)  评论(0)    收藏  举报