kubernetes中容器技术使用了一系列的系统级别的机制,诸如利用Linux Namespace进行空间隔离,通过文件系统的挂载点决定容器可以访问哪些文件,通过Cgroup确定每个容器可以利用多少资源。此外,容器之间共享同一个系统内核,这样当同一个内核被多个容器使用时,内存的使用效率会得到提升。

  Kubernetes是一个容器集群管理平台,Kubernetes需要统计整体平台的资源使用情况,合理地将资源分配给容器使用,并且要保证容器生命周期内有足够的资源来保证其运行。 更进一步,如果资源发放是独占的,即资源已发放给了个容器,同样的资源不会发放给另外一个容器,对于空闲的容器来说占用着没有使用的资源比如CPU是非常浪费的,Kubernetes需要考虑如何在优先度和公平性的前提下提高资源的利用率。

    常见的资源限制方法有三种:

  1. LimitRange

  2. Resource Quotas

  3. 单独容器中设置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):
image.png

资源请求是容器所需的最小资源需求,资源限制则是容器不能超过的资源上限。它们的大小关系是: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/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注