Kubernetes 资源限制

Kubernetes对资源的限制实际上是通过cgroup来控制的,cgroup是容器的一组用来控制内核如何运行进程的相关属性集合。针对内存、CPU 和各种设备都有对应的 cgroup。
默认情况下,Pod 运行没有 CPU 和内存的限额。这意味着系统中的任何 Pod 将能够像执行该 Pod 所在的节点一样, 消耗足够多的 CPU 和内存。一般会针对某些应用的 pod 资源进行资源限制,这个资源限制是通过 containers.resources 的 requests 和 limits 来实现。requests 为创建 Pod 时初始要分配的资源,limits 为 Pod 最高请求的资源值。 

资源限制 - 通过containers.resources给每个容器设置资源限制

containers.resources方式限制(这种方法是给每个容器单独设置资源限制)

在创建pod时直接在容器的参数中指定

spec:
  containers:
  - image: xxxx
    imagePullPolicy: IfNotPresent
    name: auth
    ports:
    - containerPort: 8080
      protocol: TCP
    resources:
      limits:
        cpu: "2"
        memory: 1Gi
      requests:
        cpu: 250m
        memory: 250Mi

containers.resources这种方法只能对容器进行资源限制,而要对pod进行资源限制,则需要使用 ResourceQuota和LimitRanger准入控制器、




资源限制 - 通过准入控制器ResourceQuota和LimitRanger根据命名空间限制pod资源

●LimitRanger:用于给指定的命名空间中Pod或容器设置默认的 requests 和 limits 资源量限制(限制命名空间内单个pod使用资源量

●ResourceQuota:用于限制在指定的命名空间中能够创建的最大资源对象数量和 Pod 的 requests|limits 资源量限制(限制命名空间内所有pod使用资源总量

 使用准入控制器ResourceQuota限制某个命名空间资源使用总量 

1.计算资源配额(限制CPU 内存)

创建ResourceQuota资源指定命名空间进行限制

apiVersion: v1
kind: ResourceQuota        #使用 ResourceQuota 资源类型
metadata:
  name: compute-resources
  namespace: spark-cluster #指定命令空间
spec:
  hard:
    pods: "20"             #设置 Pod 数量最大值
    requests.cpu: "2"
    requests.memory: 1Gi   #资源请求量 比最小资源使用量大一点 为了防止雪崩
    limits.cpu: "4"
    limits.memory: 2Gi     #资源限制量 能够使用的最大值

K8S 会根据 limits 限制 Pod 使用资源,当内存超过 limits 时 cgruops 会触发 OOM。 

如果Pod没有设置requests和limits,则会使用当前命名空间的最大资源;如果命名空间也没设置,则会使用集群的最大资源。

2.配置对象数量配额限制(限制PVC存储卷数量 副本控制器数量 SVC数量 secret数量......)

apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-counts
  namespace: spark-cluster
spec:
  hard:
    configmaps: "10"
    persistentvolumeclaims: "4"        #设置 pvc 数量最大值
    replicationcontrollers: "20"       #设置 rc 数量最大值
    secrets: "10"
    services: "10"
    services.loadbalancers: "2"

 

使用准入控制器LimitRange限制命名空间内单个pod或container的使用资源量

创建 LimitRange 资源指定命名空间进行限制

设置 Pod 或其中的 Container 能够使用资源的最大默认值(限制单个pod或Container使用资源量)

apiVersion: v1
kind: LimitRange     #使用 LimitRange 资源类型
metadata:
  name: mem-limit-range
  namespace: test    #可以给指定的 namespace 增加一个资源限制
spec:
  limits:
  - default:         #default 即 limit 的值(最大使用量)
      memory: 512Mi
      cpu: 500m
    defaultRequest:  #defaultRequest 即 request 的值(请求量 比最小使用量略高 防止雪崩)
      memory: 256Mi
      cpu: 100m
    type: Container  #类型支持 Container、Pod、PVC

你可能感兴趣的:(kubernetes,容器,云原生,linux)