Kubernetes资源管理
kubernetes中容器技术使用了一系列的系统级别的机制,诸如利用Linux Namespace进行空间隔离,通过文件系统的挂载点决定容器可以访问哪些文件,通过Cgroup确定每个容器可以利用多少资源。此外,容器之间共享同一个系统内核,这样当同一个内核被多个容器使用时,内存的使用效率会得到提升。
Kubernetes是一个容器集群管理平台,Kubernetes需要统计整体平台的资源使用情况,合理地将资源分配给容器使用,并且要保证容器生命周期内有足够的资源来保证其运行。 更进一步,如果资源发放是独占的,即资源已发放给了个容器,同样的资源不会发放给另外一个容器,对于空闲的容器来说占用着没有使用的资源比如CPU是非常浪费的,Kubernetes需要考虑如何在优先度和公平性的前提下提高资源的利用率。
常见的资源限制方法有三种:
-
LimitRange
-
Resource Quotas
-
单独容器中设置resources
LimitRange
默认情况下,Kubernetes中所有容器都没有任何CPU和内存限制。LimitRange用来给Namespace增加一个资源限制,包括最小、最大和默认资源
apiVersion: v1 kind: LimitRange metadata: name: mylimits spec: limits: - max: cpu: "15" ##是指15core memory: 4Gi min: cpu: 200m memory: 6Mi type: Pod - default: cpu: 300m ##其中1000m为1core memory: 200Mi defaultRequest: cpu: 200m memory: 100Mi max: cpu: "2" memory: 1Gi min: cpu: 100m memory: 3Mi type: Container
需要注意的是需要没有设置资源limit选项的话,默认default为资源请求的最大值!!!以上yaml需要分两部分开启中一个限制的是pod,另外一个限制的是单个Container是有区别的,具体区别如下(有的pod中里那个个Container):
资源请求是容器所需的最小资源需求,资源限制则是容器不能超过的资源上限。它们的大小关系是:0<=request<=limit<=infinity
Resource Quotas
资源配额(Resource Quotas)是用来限制用户资源用量的一种机制。
它的工作原理为
-
资源配额应用在Namespace上,并且每个Namespace最多只能有一个ResourceQuota对象
-
开启计算资源配额后,创建容器时必须配置计算资源请求或限制(也可以用LimitRange设置默认值)
-
用户超额后禁止创建新的资源
资源配额的类型
-
计算资源,包括cpu和memory
-
cpu, limits.cpu, requests.cpu
-
memory, limits.memory, requests.memory
-
存储资源,包括存储资源的总量以及指定storage class的总量
-
requests.storage:存储资源总量,如500Gi
-
persistentvolumeclaims:pvc的个数
-
.storageclass.storage.k8s.io/requests.storage
-
.storageclass.storage.k8s.io/persistentvolumeclaims
-
对象数,即可创建的对象的个数
-
pods, replicationcontrollers, configmaps, secrets
-
resourcequotas, persistentvolumeclaims
-
services, services.loadbalancers, services.nodeports
具体看下样例:
apiVersion: v1 kind: ResourceQuota metadata: name: quota spec: hard: cpu: "20" memory: 1Gi persistentvolumeclaims: "10" pods: "10" replicationcontrollers: "20" resourcequotas: "1" secrets: "10" services: "5"
单独容器中设置resources
apiVersion: v1 kind: ReplicationController metadata: name: nginx namespace: develop labels: name: nginx spec: replicas: 2 selector: name: nginx template: metadata: labels: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 resources: limits: cpu: 100m memory: 100Mi
原理:Docker 通过使用Linux Cgroup来实现对容器资源的控制,具体到启动参数上是–memory和–cpu-shares。Kubernetes中是通过控制这两个参数来实现对容器资源的控制。
参考文章:
https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/
https://kubernetes.io/docs/concepts/policy/resource-quotas/