Resources
初始: CPU 内存 GPU 持久化存储
应该先知每个资源的大小,可配置适应资源大小的 应用
核心设计
Requests 容器希望被分配到的,可以完成保证的资源量 ,提供给调度器,调度器根据这个值设置策略,从而找到最优的节点。
Limits 容器使用的一个资源的上限,整个节点资源不足参考的上限,把那个节点杀掉
项目地址 https://gitee.com/dy-k8s/deep-in-kubernetes.git
web-dev.yaml 单位换算。
1核cpu=1000m
kubectl apply -f web-dev.yaml kubectl get pods -A -o wide # 查看部署位置 kubectl describe node w2 # 查看看节点部署后的资源
在部署机器w2上查看docker参数配置
docker ps|grep web-demo # 查看启动的容器ID docker inspect ba5bd45ba22c # 查看参数设置, 查看已启动的
describe说明
CpuShares:102, Memory: "524288000" # 值 除1024除1024=值M CpuPeriod:" 100000" # docker默认值,到位纳秒 100000纳秒=100毫秒 CpuQuata: " 20000" # 200m=0.2核。 0.2* 10000=20000; 100毫秒内最多分配的量
docker exec -it ba5bd45ba22c bash #进入容器内部压测cpu dd if=/dev/zero of=/dev/null & #cpu压测
free超了则直接杀掉进程,cpu则不会。
Requests & Limits
Requests == Limits # 服务完全可靠,等级哦最高的
不设置(不建议)
Limits > Requests # 比较可靠的服务,会按照优先级分配。
1、节点内存只有4g, requests为5g,则调度失败。
2、资源足够的,随便定义一个requests 100g,应用只用了1g,浪费资源,应用需要多少内存。
错误的不合理配置产生
k8S给了一种方案 limtis
kubectl create ns test kubectl create -f limits-test.yaml -n test # 可以对namespace命名空间进行做限制 kubectl describe limits -n test
部署应用测试。
kubectl apply -f web-test.yaml #不做任何资源做限制 kubectl get deploy -n test web-demo -o yaml # 查看详细信息 kubectl get pods -n test -o yaml #resources 里面配置,则是default默认值。
多个团队,同时使用一个集群,合理分配资源,不能让一个团队把资源占用过多
资源配额quota限制 指定namespace,给每个namespace做限制
kubectl apply -f compute-resource.yaml -n test kubectl apply -f object-count.yaml -n test kubectl get quota -n test # 查看 quota类型 # 查看限制信息 kubectl describe quota object-counts -n test kubectl describe quota resource-quota -n test # 部署修改超出限制测试
Pod驱逐 -Eviction
常见驱逐策略配置
--eviction-soft=memory.available<1.5Gi # 持续1m30S小于1.5Gi时候,进行驱逐。 --eviction-soft-grace-period=memory.available=1m30s # 这些条件满足的时候立刻驱逐 --eviction-hard=menory.available<100Mi, nodesfs.available<1G,nodefs.indesFree<5
磁盘紧缺
删除死掉的pod、容器
删除没用的镜像
按优先级,资源占用情况驱逐pod
内存紧缺
驱逐不可靠的pod
驱逐基本可靠的pod
删除可靠的pod
# 测试一个吃内存的项目,访问。达到上限看效果。
end...