一、kuberneters中Request和Limit限制方式说明

Request: 容器使用的最小资源需求,作为容器调度时资源分配的判断依赖。只有当节点上可分配资源量>=容器资源请求数时才允许将容器调度到该节点。但Request参数不限制容器的最大可使用资源。

Limit: 容器能使用资源的资源的最大值,设置为0表示使用资源无上限。

Request能够保证Pod有足够的资源来运行,而Limit则是防止某个Pod无限制地使用资源,导致其他Pod崩溃。两者之间必须满足关系: 0<=Request<=Limit<=Infinity (如果Limit为0表示不对资源进行限制,这时可以小于Request)

资源需求(Requests)和限制( Limits)

对于每一个资源,container可以指定具体的资源需求(requests)和限制(limits),requests申请范围是0到node节点的最大配置,而limits申请范围是requests到无限,即0 <= requests <=Node Allocatable, requests <= limits <= Infinity。

对于CPU,如果pod中服务使用CPU超过设置的limits,pod不会被kill掉但会被限制。如果没有设置limits,pod可以使用全部空闲的cpu资源。

对于内存,当一个pod使用内存超过了设置的limits,pod中container的进程会被kernel因OOM kill掉。当container因为OOM被kill掉时,系统倾向于在其原所在的机器上重启该container或本机或其他重新创建一个pod。

QoS分类

Kubelet提供QoS服务质量管理,支持系统级别的OOM控制。在Kubernetes中,pod的QoS级别包括:Guaranteed, BurstableBest-Effort。下面对各级别分别进行相应说明:

Guaranteed:pod中的所有容器都必须对cpu和memory同时设置limits,如果有一个容器要设置requests,那么所有容器都要设置,并设置参数同limits一致,那么这个pod的QoS就是Guaranteed级别。
注:如果一个容器只指明limit而未设定request,则request的值等于limit值。

Guaranteed举例1:容器只指明了limits而未指明requests)。

containers:
name: foo
resources:
  limits:
    cpu: 10m
    memory: 1Gi
name: bar
resources:
  limits:
    cpu: 100m
    memory: 100Mi

Guaranteed举例2:requestslimit均指定且值相等。

containers:
name: foo
resources:
  limits:
    cpu: 10m
    memory: 1Gi
  requests:
    cpu: 10m
    memory: 1Gi

name: bar
resources:
  limits:
    cpu: 100m
    memory: 100Mi
  requests:
    cpu: 100m
    memory: 100Mi

Burstable: pod中只要有一个容器的requestslimits的设置不相同,该pod的QoS即为Burstable。举例如下:

Container bar没有指定resources

containers:
name: foo
resources:
  limits:
    cpu: 10m
    memory: 1Gi
  requests:
    cpu: 10m
    memory: 1Gi

name: bar

Burstable举例2:pod中只要有一个容器没有对cpu或者memory中的request和limits都没有明确指定。

containers:
name: foo
resources:
  limits:
    memory: 1Gi

name: bar
resources:
  limits:
    cpu: 100m

Burstable举例3:Container foo没有设置limits,而bar requestslimits均未设置。

containers:
name: foo
resources:
  requests:
    cpu: 10m
    memory: 1Gi  
name: bar

Best-Effort:如果对于全部的resources来说requestslimits均未设置,该pod的QoS即为Best-Effort。举例如下:

containers:
name: foo
resources:
name: bar
resources:

可压缩资源与不可压缩资源

Kubernetes根据资源能否伸缩进行分类,划分为可压缩资源和不可以压缩资源2种。
CPU资源是目前支持的一种可压缩资源,而内存资源和磁盘资源为目前所支持的不可压缩资源。

QoS优先级

3种QoS优先级从有低到高(从左向右):

Best-Effort pods -> Burstable pods -> Guaranteed pods

静态pod

在Kubernetes中有一种DaemonSet类型pod,此类pod可以常驻在某个Node上运行,由该Node上kubelet服务直接管理而无需api server介入。静态pod也无需关联任何RC,完全由kubelet服务来监控,当kubelet发现静态pod停止时,kubelet会重新启动静态pod。




本文出自链接:https://www.jianshu.com/p/4c0763967b3c

参考Kubernetes 资源分配之 Request 和 Limit 解析 链接https://www.cnblogs.com/robinunix/articles/11413059.html

示例:

Containers:

  cloud-gateway:

    Container ID:   docker://3ea58021ffef1416d508008a606e601234fe436ed600b36db4eb7b5fe729e861

    Image:          registry.cn-hangzhou.aliyuncs.com/fugle/cloud_gateway:2004101448

    Image ID:       docker-pullable://registry.cn-hangzhou.aliyuncs.com/fugle/cloud_gateway@sha256:c304c42e65dc3503131eda462ea05c49a7726ca1028c7b087419b87146496801

    Port:           <none>

    Host Port:      <none>

    State:          Running

      Started:      Thu, 30 Jul 2020 15:08:09 +0800

    Ready:          True

    Restart Count:  0

    Limits:

      cpu:  4

    Requests:

      cpu:  1

    Environment:

      JAVA_OPTS:  -Xms1024m -Xmx1024m -Xmn512m -XX:+UseConcMarkSweepGC -Dahas.namespace=default -Dproject.name=gateway-test -Drap.redis.server=r-bp1usanbbv4xldesxy.redis.rds.aliyuncs.com:6379 -Drap.redis.auth.password=GqdLSFUhnm6MpyeVKIu3 -Dspring.cloud.nacos.config.endpoint=addr-hz-internal.edas.aliyun.com -Dspring.cloud.nacos.config.access-key=LTAI4FouGjrhSaYJQx8v1icq -Dspring.cloud.nacos.config.secret-key=1zoLwDHTojELEVWmHaCzQFD58NcsIJ -Dspring.cloud.nacos.config.namespace=49e95a77-24e3-4b2a-b657-4d51463da9d0 -Dspring.cloud.nacos.config.file-extension=yaml -Dspring.application.name=gateway-test -Dspring.security.user.password=chrdwhdhxt -Dspring.profiles.active=test -Drap.cloud.gateway.test.enable=true -Drap.cloud.gateway.test.server=https://grafana-test.dingtax.cn -Dfile.encoding=utf-8

    Mounts:

      /var/run/secrets/kubernetes.io/serviceaccount from default-token-56rxd (ro)

Conditions:

  Type              Status

  Initialized       True

  Ready             True

  ContainersReady   True

  PodScheduled      True

Volumes:

  default-token-56rxd:

    Type:        Secret (a volume populated by a Secret)

    SecretName:  default-token-56rxd

    Optional:    false

QoS Class:       Burstable

Node-Selectors:  <none>

Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s

                 node.kubernetes.io/unreachable:NoExecute for 300s

Events:          <none>