配置缺省内存运行与请求限制


有时候忘记设置pod的内存请求大小和内存运行大小。
对于k8s集群调度器的资源管理说不是很友好,而且在pod突然内存暴增的时候容易引起节点内核OOM杀掉服务。
这个时候我们可以设置NS级别缺省内存请求和内存缺省限制。

最佳实践原则(设置动机):

1.每一个容器运行在每个命名空间中都要有自己的内存限制。
2.整个命名空间的容器的,运行内存总量不能超过NS限制的pod内存设置。
3.缺省的在每一个业务的ns上配置内存资源限制,防止POD被节点OOM。

创建命名空间

kubectl create namespace sklinux

设置sklinux缺省限制

设置NS级别的内存运行和请求限制如:

#mem.limit.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: sklinux
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container
kubectl create -f mem.limit.yaml

这样将sklinux命名空间设置容器类型请求缺省内存请求和大小限制为512M和256M。上面的default表示不设置,则缺省。

验证限制

创建pod
#nginx.pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-mem-demo
spec:
  containers:
  - name: nginx-mem-demo
    image: nginx

kubectl create -f pod.yaml -n sklinux
获取配置
kubectl get pod/nginx-mem-demo -n sklinux -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    cni.projectcalico.org/podIP: 172.19.173.193/32
    kubernetes.io/limit-ranger: 
    'LimitRanger plugin set: memory request for container
      nginx-mem-demo; memory limit for container nginx-mem-demo'
  creationTimestamp: "2020-08-14T04:05:37Z"
  name: nginx-mem-demo
  namespace: sklinux
  resourceVersion: "53291457"
  selfLink: /api/v1/namespaces/sklinux/pods/nginx-mem-demo
  uid: 86794b0a-49f3-4bea-825f-43470607a141
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: nginx-mem-demo
    resources:
      limits:
        memory: 512Mi
      requests:
        memory: 256Mi
        ...

单独配置内存请求和运行限制

resources:
  limits:
    memory: 1Gi
  requests:
    memory: 1Gi

cpu限制

apiVersion: v1
kind: LimitRange
metadata:
  name: sklinux
spec:
  limits:
  - max:
      cpu: "4"
      memory: 2Gi
    min:
       cpu: 200m
       memory: 6Mi
    maxLimitRequestRatio:
      cpu: 3
      memory: 2
    type: pod       
  - default:
      cpu: 300m
      memory: 512Mi
    defaultRequest:
      cpu: 200m 
      memory: 256Mi
    max:
      cpu: "2"
      memory: 1Gi
    min:
      cpu: 100m
      memory: 3Mi
    maxLimitRequestRatio:
      cpu:5
      memory: 4      
    type: Container

pod部分:
对Pod中所有容器资源总和进行限制(一般场景在pod)。
max表示pod中最大的cpu和内存限制值,min表示资源请求下限。
不能请求小于该值的cpu和内存,否则创建失败。
使用场景:
1.节点内存和pod之间的关系:比如节点内存2G,你不希望有超过2G的pod。
2.共享集群,生产和研发混部。
允许产品工作负载集能到8G内存,研发pod只能限制在512M。
这样就可以在不同的NS设置不同的策略。
maxLimitRequestRatio表示最大的请求比。比如上面是3:2 表示cpu:memory比值,比如cpu3:memory0.5=1:6 这样创建会失败。

Container部分:
max、min、maxLimitRequestRatio和pod类似。
对 Container 使用资源进行限制,在Pod中的每一个容器都受此限制(一般场景在deployment、sts这种)。
如果container设置了max, pod中的容器必须设置limit,如果未设置,则使用defaultlimt的值,如果defaultlimit也没有设置,则无法成功创建。
如果设置了container的min,创建容器的时候必须设置request的值,如果没有设置,则使用defaultrequest,如果没有defaultrequest,则默认等于容器的limit值,如果limit也没有,启动就会报错。
defaultrequest和defaultlimit则是默认值,注意:pod级别没有这两项设置。

k8s