LimitRange

This commit is contained in:
huanqing.shao
2019-10-18 23:47:36 +08:00
parent b04a44e4d4
commit 445e05855a
27 changed files with 1072 additions and 389 deletions

View File

@ -1,13 +1,14 @@
---
# vssueId: 135
vssueId: 143
titlePrefix: LimitRange
layout: LearningLayout
description: Kubernetes教程_
description: Kubernetes教程_默认情况下_容器在 Kubernetes 集群上运行时_不受计算资源的限制_使用Resourcequota集群管理员可以针对名称空间限定资源的使用情况
meta:
- name: keywords
content: Kubernetes
---
# Limit Ranges
# 概述
> 参考文档:[Limit Ranges](https://kubernetes.io/docs/concepts/policy/limit-range/)
@ -47,3 +48,30 @@ podtemplates tr
通常 LimitRange 是默认启用的。
<!-- FIXME 如何启用 LimitRange -->
## 基本介绍
* 集群管理员在名称空间中创建一个 `LimitRange` 对象
* 用户在名称空间中创建工作负载等对象,例如 Pod、Container、PersistentVolumeClaim 等
* 针对那些没有设置 [计算资源请求request和限制limit](/learning/k8s-intermediate/config/computing-resource.html) 的 Pod 和容器,`LimitRanger` 根据名称空间中的 `LimitRange` 对象为其设定默认的资源请求和响应,并确保 Pod 和容器对计算资源的实际消耗不会超过指定的值
* 如果创建或更新对象Pod、Container、PersistentVolumeClaim的请求与 Limit Range 的限定相冲突apiserver 将返回 HTTP status 状态码 `403 FORBIDDEN`,以及相应的错误提示信息
* 如果名称空间中激活了 limit range 来限定 cpu 和内存等计算资源的使用,则,用户创建 Pod、Container 时,必须指定 cpu 或内存的 `request` 和 `limit`,否则系统将拒绝创建 Pod
* Kubernetes 只在 Pod 创建阶段检查 `LimitRange` 的限定,而不在 Pod 运行时执行任何检查
使用 LimitRange 的例子有:
* 在一个总容量为 8G内存 16核CPU 的 2 节点集群上,限定某个名称空间中的 Pod 使用 100m的CPU请求request且不超过 500m的CPU上限limit200Mi的内存请求request且不超过 600Mi的内存上线limit
* 为没有定义cpu和内存请求的容器指定默认的 CPU 请求request和限制limit均为 150m默认的内存请求为 300Mi
当名称空间总的 limit 小于名称空间中 Pod/Container 的 limit 之和时,将发生资源争夺的现象,容器或者 Pod 将不能创建。
在资源争夺现象发生时,或者修改 limitrange 的时候,这两种情况都不会影响到已经创建的 Pod/Container。
更多内容请参考:
* [限定容器的计算资源](./lr_container.html)
* [限定Pod的计算资源]
* [限定存储资源]
* [Limit/Request 比例]
* [例子]

View File

@ -0,0 +1,172 @@
---
vssueId: 143
layout: LearningLayout
description: Kubernetes教程_本文讨论了如何在容器级别创建 LimitRange。假设有一个 Pod 包含 4个容器每个容器都定义了 spec.resource此时 LimitRanger 管理控制器在处理该 Pod 中的 4个容器是处理方式是不一样的。
meta:
- name: keywords
content: Kubernetes
---
# 限定容器的计算资源
> 参考文档:[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 将被创建

View File

@ -41,6 +41,9 @@ Kubernetes 对 Pod 进行调度时,以当时集群中各节点的可用资源
```
* 执行以下命令,启动 nfs 服务
```sh
# 创建共享目录,如果要使用自己的目录,请替换本文档中所有的 /root/nfs_root/
mkdir /root/nfs_root
systemctl enable rpcbind
systemctl enable nfs-server