1. 资源限制对象

k8s资源限制对象从大到小为 namespace --> Pod --> Container

2. 资源限制类型

Pod 本身不直接设置资源限制,而是通过容器资源的总和间接限制:

  • Pod 的总 requests 是所有容器 requests 之和(决定调度节点)。
  • Pod 的总 limits 是所有容器 limits 之和(决定节点资源是否足够容纳)。

Container:

资源类型 如何表示
CPU 1000m = 1核
Memory 单位:Ki/Mi/Gi,1Gi=1024Mi
hugepages 巨页(Huge Page)资源,默认内存块大小是4KB,可以设置为2MB或者更大

namespace:

资源类型 如何表示
CPU 1000m = 1核
Memory 单位:Ki/Mi/Gi,1Gi=1024M
API 对象配额 pods,services,replicationcontrollers,resourcequotas,secrets,persistentvolumeclaims,services.nodeports,services.loadbalancers

3. 资源限制实验

信息来源官方文档:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/manage-resources/

3.1. 配置命名空间下默认的内存和CPU请求和限制,和限制最小和最大请求限制。

创建一个命名空间:

kubectl create namespace test

创建LimitRange资源限制清单:
cpu-memory-defaults.yaml

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-cpu-limit-range
  namespace: test
spec:
  limits:
  - default:
      memory: 512Mi  # 默认内存限制
      cpu: 500m      # 添加默认CPU限制(0.5核)
    defaultRequest:
      memory: 256Mi  # 默认内存请求
      cpu: 100m      # 添加默认CPU请求(0.1核)
	min: 
	  memory: 64Mi   # 不能小于此内存请求
	  cpu: 50m		 # 不能小于此cpu请求
	max:
      memory: 1Gi    # 不能大于此内存请求
	  cpu: 1000m	 # 不能大于此cpu请求	
	type: Container  # 资源对象为容器
kubectl create -f  cpu-memory-defaults.yaml

使用kubectl describe ns test 可以查看到资源限制情况:

Resource Limits
 Type       Resource  Min   Max  Default Request  Default Limit  Max Limit/Request Ratio
 ----       --------  ---   ---  ---------------  -------------  -----------------------
 Container  cpu       50m   1    100m             500m           -
 Container  memory    64Mi  1Gi  256Mi            512Mi          -

创建一个Pod,不设置资源限制,来查看是否使用了默认配置:

kubectl run nginx --image=nginx  --restart='Never' -n test
kubectl describe  pod nginx  -n test
 Limits:
      cpu:     500m
      memory:  512Mi
    Requests:
      cpu:        100m
      memory:     256Mi

可以看出走的是默认的请求和限制。

创建一个Pod单个内存限制为2G,查看效果:

apiVersion: v1
kind: Pod
metadata:
 name: nginx01
 namespace: test
spec:
  containers:
    - name: nginx01
      image: nginx
      resources:
        limits:
          memory: 2Gi
[root@k8s-master01 ~]# kubectl create -f  nginx01-pod.yaml --dry-run=server
Error from server (Forbidden): error when creating "nginx01-pod.yaml": pods "nginx01" is forbidden: maximum memory usage per Container is 1Gi, but limit is 2Gi

可以看出有报错提示,最大内存为1Gi,但是我设置的是2Gi

根据现有的默认策略,我们不设置limits、requests或者只设置一个会有什么效果:

  • 不设置声明和限制
    当容器既没有设置资源请求,也没有设置资源限制时,会默认使用namespace设置的默认值。

  • 只设置请求值,而不设置限制值时
    当容器只设置请求值时,限制为为namespace设置的默认值

  • 只设置限制值,而不设置请求值时
    当容器只设置限制值而不设置请求值时,请求值默认你为namespace设置的默认值。

3.2. 为命令空间下内存、CPU、Pod创建数配额

还是延用之前创建的test命名空间

创建一个配额资源清单:
quota-memcpupods-resourcequota.yaml

apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-pods-resourcequota
  namespace: test               # 作用在test命名空间
spec:
  hard:
    requests.cpu: "1"           #
    requests.memory: 2Gi
    limits.cpu: "2"
    limits.memory: 4Gi
    pods: "2"
  • 在该命名空间中的每个 Pod 的所有容器都必须要有内存请求和限制,以及 CPU 请求和限制。
  • 在该命名空间中所有 Pod 的内存请求总和不能超过 2 GiB。
  • 在该命名空间中所有 Pod 的内存限制总和不能超过 4 GiB。
  • 在该命名空间中所有 Pod 的 CPU 请求总和不能超过 1 cpu。
  • 在该命名空间中所有 Pod 的 CPU 限制总和不能超过 2 cpu。
  • 在该命名空间中创建的Pod不能超过2个。
kubectl create -f  quota-memcpupods-resourcequota.yaml
kubectl describe ns test

原来test ns是有po的但是被我删掉了。

Resource Quotas
  Name:            mem-cpu-pods-resourcequota
  Resource         Used  Hard
  --------         ---   ---
  limits.cpu       0     2
  limits.memory    0     4Gi
  pods             0     2
  requests.cpu     0     1
  requests.memory  0     2Gi

如上可以看出限制和使用情况,目前使用率是0。

使用deploy创建一个包含3个副本的Pod实验:

kubectl create deployment nginx --image=nginx --replicas=3 -n test
kubectl get pod -n test
NAME                     READY   STATUS    RESTARTS   AGE
nginx-66686b6766-dxnp4   1/1     Running   0          12s
nginx-66686b6766-rq9vd   1/1     Running   0          12s

如上可以看出我指定的是3个副本的Pod但是只创建了两个。

kubectl describe ns test
Resource Quotas
  Name:            mem-cpu-pods-resourcequota
  Resource         Used   Hard
  --------         ---    ---
  limits.cpu       1      2
  limits.memory    1Gi    4Gi
  pods             2      2
  requests.cpu     200m   1
  requests.memory  512Mi  2Gi
  
Resource Limits
 Type       Resource  Min   Max  Default Request  Default Limit  Max Limit/Request Ratio
 ----       --------  ---   ---  ---------------  -------------  -----------------------
 Container  cpu       50m   1    100m             500m           -
 Container  memory    64Mi  1Gi  256Mi            512Mi          -

如上是test ns内资源的使用情况,我创建deploy时没有指定Pod的资源请求和限制,默认走的是之前设置的。

再次创建一个Pod会发生什么:

 kubectl run nginx01 --image=nginx --restart='Never' -n test
Error from server (Forbidden): pods "nginx01" is forbidden: exceeded quota: mem-cpu-pods-resourcequota, requested: pods=1, used: pods=2, limited: pods=2

Pod为API 对象,更多API对象配额参考:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/quota-api-object/,容器巨页配置这里就不演示了。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐