默认的情况下, 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
项目, 必须设置java虚拟机
的参数, 而且这个参数不能大于容器设置的限定值, 否则容器会因为内存过大不停的重启
相关参考: https://kubernetes.io/docs/tasks/administer-cluster/cpu-memory-limit/