Files
kuboard-press/learning/k8s-advanced/policy/lr_container.md
huanqing.shao c2c0ac677c 错别字修改
2019-11-19 20:45:19 +08:00

173 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
vssueId: 143
layout: LearningLayout
description: Kubernetes教程_本文讨论了如何在容器级别创建 LimitRange。假设有一个 Pod 包含 4个容器每个容器都定义了 spec.resource此时 LimitRanger 管理控制器在处理该 Pod 中的 4个容器时处理方式是不一样的。
meta:
- name: keywords
content: Kubernetes教程, LimitRange, Kubernetes Limit Range
---
# 限定容器的计算资源
> 参考文档:[Limit Ranges](https://kubernetes.io/docs/concepts/policy/limit-range/)
<AdSenseTitle>
</AdSenseTitle>
本文讨论了如何在容器级别创建 LimitRange。假设有一个 Pod 包含 4个容器每个容器都定义了 `spec.resource`,此时 LimitRanger 管理控制器在处理该 Pod 中的 4个容器时处理方式是不一样的。
演示步骤如下:
* 执行如下命令创建名称空间 `limitrange-demo`
``` sh
kubectl create namespace limitrange-demo
```
将 kubectl 默认名称空间切换至 `limitrange-demo`
``` sh
kubectl config set-context --current --namespace=limitrange-demo
```
* LimitRange 对象的 yaml 文件如下所示:
<<< @/.vuepress/public/statics/learning/policy/lr-container-limit-range.yaml
该对象为名称空间中的容器定义了:
* 最大和最小的CPU/内存
* 默认的 CPU/内存限定
* 默认的 CPU/内存请求
执行命令以创建该对象:
``` sh
kubectl create -f https://kuboard.cn/statics/learning/policy/lr-container-limit-range.yaml -n limitrange-demo
```
执行命令查看结果
``` sh
kubectl describe limitrange/limit-mem-cpu-per-container -n limitrange-demo
```
输出结果如下所示
```
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu 100m 800m 110m 700m -
Container memory 99Mi 1Gi 111Mi 900Mi -
```
* 前面提到的包含 4 个容器的 Pod其 yaml 文件如下所示:
<<< @/.vuepress/public/statics/learning/policy/lr-container-pod.yaml
执行命令以创建该 Pod
``` sh
kubectl apply -f https://kuboard.cn/statics/learning/policy/lr-container-pod.yaml
```
## 容器包含有效的 CPU/内存的requests/limits
执行以下命令,查看 `busybox-cnt01` 的配置信息
``` sh
kubectl get po/busybox1 -n limitrange-demo -o json | jq ".spec.containers[0].resources"
```
输出结果如下所示
``` json
{
"limits": {
"cpu": "500m",
"memory": "200Mi"
},
"requests": {
"cpu": "100m",
"memory": "100Mi"
}
}
```
* `busybox` Pod 中的容器 `busybox-cnt01` 定义了 `requests.cpu=100m` 和 `requests.memory=100Mi`
* `100m <= 500m <= 800m` 容器的 cpu limit500m在名称空间 LimitRange 指定的范围内
* `99Mi <= 200Mi <= 1Gi` 容器的内存 limit200Mi在名称空间 LimitRange 指定的范围内
* 没有为CPU/内存指定 request/limit 比例
* 此时容器的定义是有效的,将被创建
## 容器包含有效的 CPU/内存requests且没有指定limits
执行以下命令,查看 `busybox-cnt02` 的配置信息
```sh
kubectl get po/busybox1 -n limitrange-demo -o json | jq ".spec.containers[1].resources"
```
输出结果如下所示
``` json
{
"limits": {
"cpu": "700m",
"memory": "900Mi"
},
"requests": {
"cpu": "100m",
"memory": "100Mi"
}
}
```
* `busybox` Pod 中的容器 `busybox-cnt02` 定义了 `requests.cpu=100m` 和 `requests.memory=100Mi`,且为指定 CPU/内存的最大限定
* 由于容器没有定义 limits则名称空间的 LimitRange 定义的 `limits.cpu=700mi` 和 `limits.memory=900Mi` 被注入到该容器
* `100m <= 700m <= 800m` 容器的CPU最大限定700m在名称空间 LimitRange 指定的范围内
* `99Mi <= 900Mi <= 1Gi` 容器的内存 limit900Mi在名称空间 LimitRange 指定的范围内
* 没有为CPU/内存指定 request/limit 比例
* 此时容器的定义是有效的,将被创建
## 容器包含有效的CPU/内存limits且没有指定requests
执行以下命令,查看 `busybox-cnt03` 的配置信息
``` sh
kubectl get po/busybox1 -n limitrange-demo -o json | jq ".spec.containers[2].resources"
```
输出结果如下所示
``` json
{
"limits": {
"cpu": "500m",
"memory": "200Mi"
},
"requests": {
"cpu": "500m",
"memory": "200Mi"
}
}
```
* `busybox` Pod 中的容器 `busybox-cnt03` 定义了 `limits.cpu=500m` 和 `limits.memory=200Mi`,且没有指定 CPU/内存的 `requests`
* 由于容器没有定义 `requests`,名称空间中 LimitRange 定义的 `defaultRequest` 并没有注入到容器的 `request` 字段,反而,容器定义的 `limits` 被设置到了其 `requests` 字段: `limits.cpu=500m` 和 `limits.memory=200Mi`
* `100m <= 500m <= 800m` 容器的 cpu 最大限定500m在名称空间 LimitRange 指定的范围内
* `99Mi <= 200Mi <= 1Gi` 容器的内存最大限定200Mi在名称空间 LimitRange 指定的范围内
* 没有为CPU/内存指定 request/limit 比例
* 此时容器的定义是有效的,将被创建
## 容器不包含CPU/内存的requests/limits
执行以下命令,查看 `busybox-cnt04` 的配置信息
``` sh
kubectl get po/busybox1 -n limitrange-demo -o json | jq ".spec.containers[3].resources"
```
输出结果如下所示:
```json
{
"limits": {
"cpu": "700m",
"memory": "900Mi"
},
"requests": {
"cpu": "110m",
"memory": "111Mi"
}
}
```
* `busybox` Pod 中的容器 `busybox-cnt04` 既没有定义 request也没有定义 limits
* 由于容器没有定义 limits则名称空间的 LimitRange 定义的 `limits.cpu=700mi` 和 `limits.memory=900Mi` 被注入到该容器
* 由于容器没有定义 requests则名称空间的 LimitRange 定义的 `requests.cpu=110m` 和 `requests.memory=110Mi` 被注入到该容器
* `100m <= 700m <= 800m` 容器的 cpu 最大限定700m在名称空间 LimitRange 指定的范围内
* `99Mi <= 900Mi <= 1Gi` 容器的内存 limit900Mi在名称空间 LimitRange 指定的范围内
* 没有为CPU/内存指定 request/limit 比例
* 此时容器的定义是有效的,将被创建
Pod `busybox` 中所有的容器都通过了名称空间的 LimitRange 检查,此 Pod 将被创建