前言为了防止容器被调度到资源不足的节点,可以为容器指定最小资源需求。为了防止容器无节制地使用CPU、内存等资源,可以为容器指定资源的最大允许使用量。更新历史20200714-初稿-左成礼原文地址-https://blog.zuolinux.com/2020/07/14/container-resources-request-limit.htmlResourcerequestsandresourceconstraints可以指定资源请求量和资源限制.资源一般是指CPU和内存。资源请求是指容器要求节点分配的最小容量。如果节点的可用容量小于容器所需的请求,容器将被调度到其他合适的节点。资源约束是指容器要求节点限制其使用的最大容量。如果容器内存使用超过内容限制,容器将被杀死。如果指定了重启策略,容器将在被杀死后重新启动。涉及参数约束数量spec.containers[].resources.limits.cpuspec.containers[].resources.limits.memoryspec.containers[].resources.limits.hugepages-请求数量spec.containers[].resources。requests.cpuspec.containers[].resources.requests.memoryspec.containers[].resources.requests.hugepages-示例apiVersion:v1kind:Podmetadata:name:frontendspec:containers:-name:appimage:images.my-company.example/app:v4环境:-名称:MYSQL_ROOT_PASSWORD值:“密码”资源:请求:内存:“64Mi”cpu:“250m”限制:内存:“128Mi”cpu:“500m”-名称:日志聚合器image:images.my-company.example/log-aggregator:v6resources:requests:memory:"64Mi"cpu:"250m"limits:memory:"128Mi"cpu:"500m"K8S中的一个cpu等于云1平台上的vCPU/核心或裸机英特尔处理器上的1个超线程。spec.containers[].resources.requests.cpu为0.5的容器保证获得请求1个CPU的容器的一半CPU资源。表达式0.1相当于表达式100m,可以认为是“100millicpu”。带有小数点(比如0.1)的请求会被API转换为100m;最大精度为1m。优先使用100m表格。记忆可以用E、P、T、G、M、K。也可以用2的对应次方:Ei、Pi、Ti、Gi、Mi、Ki。Pod的资源请求和约束一个Pod的请求等于所有内部容器请求的总和。一个pod的约束等于所有容器约束的总和。如何调度具有资源请求的Pod调度程序确保调度的Pod具有小于节点容量的资源请求。即调度器会寻找一个资源可用性足够,且可用性大于请求量的节点来放置Pod。具有资源约束的Pod如何处理内存资源约束如果容器超过其内存最大限制,它可能会被终止。如果容器是可重启的,kubelet将重启容器。如果容器的内存使用量超过了它的内存请求,当节点内存不足时,容器所在的Pod可能会被驱逐。CPU资源限制每个容器可能会或可能不会被允许使用超过其CPU限制的处理时间。但是,容器不会因为CPU使用率过高而被杀死。spec.containers[].resources.limits.cpu首先转换为毫核值,然后乘以100。结果是容器每100毫秒可以使用的CPU时间总量。在此期间(100毫秒),容器使用的CPU时间不会超过分配给它的时间。默认配额周期为100毫秒。CPU配额的最小精度为1毫秒。如何知道集群资源的使用情况需要通过metrics-server获取。metrics-server检查是否安装了metrics-server,未安装则执行以下指令#kubectltopnodeErrorfromserver(NotFound):theservercouldnotfindtherequestedresource(getserviceshttp:heapster:)#kubectlgetpods,svc,deployments-nkube-system|grepmetrics-server#开始安装metrics-servergitclonehttps://github.com/kubernetes-incubator/metrics-servercdmetrics-server/gitcheckoutrelease-0.3modifymetrics-server/deploy/1.8+/metrics-server-deployment.yaml容器:-名称:metrics-server#image:k8s.gcr.io/metrics-server/metrics-server:v0.3.6image:registry.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6imagePullPolicy:IfNotPresent参数:---cert-dir=/tmp---secure-port=4443---metric-resolution=30s---kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP---kubelet-insecure-tls参数说明--metric-resolution=30s:从kubelet收集数据的周期;--kubelet-首选-address-types:优先使用InternalIP访问kubelet,可以避免节点名没有DNS解析记录时通过节点名调用节点kubeletAPI失败(不配置时默认);--kubelet-insecure-tls:kubeletPort10250使用https协议,连接需要验证tls证书--kubelet-insecure-tls不验证客户端证书。安装kubectlapply-fdeploy/1.8+/再次检查。您需要等待一段时间以确保收集到数据。[root@master01~]#kubectlget--raw"/apis/metrics.k8s.io/v1beta1/nodes"{"kind":"NodeMetricsList","apiVersion":"metrics.k8s.io/v1beta1","metadata":{"selfLink":"/apis/metrics.k8s.io/v1beta1/nodes"},"items":[]}[root@master011.8+]#kubectltopnodesNAMECPU(cores)CPU%MEMORY(字节)内存%master01163m4%2093Mi56%master02147m3%1638Mi44%master03151m3%1609Mi43%work01141m3%1084Mi29%work02150m3%1097Mi29%work03138m3%0master@39171.8+]#kubectltoppodNAMECPU(cores)MEMORY(bytes)mysql-015m202Mimysql-114m191Mimysql-213m182Minfs-client-provisioner-7db698bbc9-8ph552m8Mi已经可以看到资源使用情况练习内存限制创建一个命名空间用于测试#kubectlcreatenamespacemem-examplenamespace/mem-examplecreated创建一个最大限制为100M但最小限制为250M的容器#catmemory-request-limit-2.yamlapiVersion:v1kind:Podmetadata:名称:memory-demo-2命名空间:mem-examplespec:容器:-名称:memory-demo-2-ctr图像:polinux/stress资源:请求:内存:“50Mi”限制:内存:“100Mi”命令:["stress"]args:["--vm","1","--vm-bytes","250M","--vm-hang","1"]#kubectlapply-fmemory-request-limit-2.查看yamlpod/memory-demo-2created发现创建失败#kubectlgetpod-nmem-exampleNAMEREADYSTATUSRESTARTSAGEmemory-demo-20/1CrashLoopBackOff388s查看原因#kubectlgetpod-nmem-example-ogo-template='{{range.status.containerStatuses}}{{"容器名称:"}}{{.name}}{{"\r\nLastState:"}}{{.lastState}}{{end}}'memory-demo-2Container名称:memory-demo-2-ctrLastState:map[terminated:map[containerID:docker://aaf41eexitCode:1reason:OOMKilled]]有reason:OOMKilled,表示已经超过最大内存限制,导致OOM,然后被kill。确保容器能够在资源充足的节点上运行,同时不会因为占用太多资源而影响该节点上的其他容器。联系我微信公众号:zuolinux_com