kubernetes限制pod的cpu和内存
1、在创建容器的配置文件中指定
spec: containers: - image: gcr.io/google_containers/serve_hostname imagePullPolicy: Always name: kubernetes-serve-hostname resources: limits: cpu: "1" #限制pod申请最大的cpu数量为1个cpu memory: 512Mi #申请内存最大值 requests: cpu: "0.5" #pod申请的cpu数量为0.5个cpu memory: 400Mi #申请内存的最小值
2、参数解释
requests requests用于schedule阶段,在调度pod保证所有pod的requests总和小于node能提供的计算能力 requests.cpu被转成docker的--cpu-shares参数,与cgroup cpu.shares功能相同 设置容器的cpu的相对权重 该参数在CPU资源不足时生效,根据容器requests.cpu的比例来分配cpu资源 CPU资源充足时,requests.cpu不会限制container占用的最大值,container可以独占CPU requests.memory没有对应的docker参数,作为k8s调度依据 使用requests来设置各容器需要的最小资源 limits limits限制运行时容器占用的资源 limits.cpu会被转换成docker的–cpu-quota参数。与cgroup cpu.cfs_quota_us功能相同 限制容器的最大CPU使用率 cpu.cfs_quota_us参数与cpu.cfs_period_us结合使用,后者设置时间周期 k8s将docker的–cpu-period参数设置100毫秒。对应着cgroup的cpu.cfs_period_us limits.cpu的单位使用m,千分之一核 limits.memory会被转换成docker的–memory参数。用来限制容器使用的最大内存 当容器申请内存超过limits时会被终止
kubernetes限制pod的cpu和内存
默认的情况下, k8s不会限制pod的cpu和内存的, 也就是只要pod内应用需要, 完全可以占满宿主机的cpu和内存, 如果是这种情况, 当有大量的服务一起部署时, 相互之间是会相互影响的, 所以k8s也有相应的办法限制pod及里面容器的cpu和内存
准备工作
# 创建namespace xxx kubectl create namespace xxx # 下载官方提供的示例文件 wget https://k8s.io/docs/tasks/configure-pod-container/limits.yaml # 内容如下 ############################## apiVersion: v1 kind: LimitRange metadata: name: mylimits spec: limits: - max: cpu: "2" memory: 1Gi min: cpu: 200m memory: 6Mi type: Pod - default: cpu: 300m memory: 200Mi defaultRequest: cpu: 200m memory: 100Mi max: cpu: "2" memory: 1Gi min: cpu: 100m memory: 3Mi type: Container ##############################
Pod相关限制
cpu最大限制2核, 最小200MHZ 内存最大限制1G, 最小6M
Container相关限制
cpu最大限制2核, 最小200MHZ 内存最大限制1G, 最小6M 默认启动cpu最大限制300MHZ, 内存最大限制200M
创建指定namespace资源限制
kubectl create -f limits.yaml -n xxx # 查看创建好的资源限制 kubectl get limits -n xxx
之后在这个namespace下创建的Pod及容器都遵循这个规则
在创建容器的配置文件中指定
spec: containers: - image: gcr.io/google_containers/serve_hostname imagePullPolicy: Always name: kubernetes-serve-hostname resources: limits: cpu: "1" memory: 512Mi requests: cpu: "1" memory: 512Mi
如果按照这个规范, 相关的容器会限制在这个范围内
如果两者都配置?
有些时候, 我们大部分容器遵循一个规则就好, 但有一小部分有特殊需求, 这个时候, 小部分的就需要单独在容器的配置文件中指定. 这里有一点要注意的是, 单独在容器中配置的参数是不能大于指定的k8s资源限制, 否则会报错, 容器无法启动
PS: 对于一些java项目, 必须设