一、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, Burstable与 Best-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:requests与limit均指定且值相等。
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中只要有一个容器的requests和limits的设置不相同,该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 requests与 limits均未设置。
containers: name: foo resources: requests: cpu: 10m memory: 1Gi name: bar
Best-Effort:如果对于全部的resources来说requests与limits均未设置,该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>