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