optimization

This commit is contained in:
huanqing.shao
2019-10-23 23:22:38 +08:00
parent afd41acbb0
commit ba09871630
26 changed files with 180 additions and 38 deletions

View File

@@ -0,0 +1,85 @@
---
vssueId: 148
layout: LearningLayout
description: Kubernetes教程_通过Pod安全策略_您可以在更细的颗粒度上授权您的用户执行Pod的创建和更新的操作
meta:
- name: keywords
content: Kubernetes 教程,Resource Quota,ResourceQuota
---
# Pod 优先权
<AdSenseTitle >
> 参考文档:[Pod Priority and Preemption](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/)
**FEATURE STATE** `Kubernetes v1.14` <Badge>stable</Badge>
Pod 中可以定义 优先级 `priority`,用于标识该 Pod 相对于其他 Pod 的重要程度。当存在 Pod 等待调度时(处于 Pending 状态调度器将尝试抢占preempt 或 驱逐 evict低优先级priority的 Pod以便调度 Pending 中的 Pod。
自 Kubernetes 1.9 开始Priority 也会对如下两个场景产生影响:
* Pod 的调度顺序
* 资源耗尽时,从节点上驱逐 Pod 的顺序
Pod 优先权priority and preemption的特性在 Kubernetes 1.11 中是 beta状态并默认激活在1.14 中是 GAGenerally Available 正式发布)状态。如下表所示:
| Kubernetes Version | Priority and Preemption State | Enabled by default |
| ------------------ | ----------------------------- | ------------------ |
| 1.8 | alpha | no |
| 1.9 | alpha | no |
| 1.10 | alpha | no |
| 1.11 | beta | yes |
| 1.14 | stable | yes |
::: danger 警告
如果集群中的用户并不是全部可信,可能会出现一些恶意的用户,创建最高优先级的 Pod使得其他的 Pod 被驱逐或者不能正常调度。可以通过在 [ResourceQuota](/learning/k8s-advanced/policy/rq.html) 中指定 priority 来解决此问题。
:::
[[TOC]]
</AdSenseTitle>
## 使用Pod优先权
在 Kubernetes v1.11 及以后的版本中参考下面的步骤启用Pod优先权Pod priority and preemption
1. 添加一个或多个 [PriorityClass](#priorityclass)
2. 创建Pod时指定 [priorityClassName](#pod-priority) 为其中一个 PriorityClass。通常在 Deployment/StatefulSet等 的 `spec.template.spec.priorityClassName` 中指定,而不是直接创建 Pod
如果你尝试过该特性之后,想要将其禁用,你必须在 API Server 和 Scheduler 的命令行启动参数中移除 `PodPriority` 参数,或者将其设置为 `false`。禁用该特性之后:
* 已经创建的 Pod 将保留 priority 字段但是抢占行为preemption)被禁用了,且 priority 字段也将被忽略
* 新创建的 Pod 将不能在设置 `priorityClassName` 字段
## 如何禁用 preemtion
> preemption英文愿意为先买权此处可以理解为抢占行为
::: tip
在 Kubernetes 1.12+,当前集群资源不足时,关键的 Pod 将依赖于抢占权才能被调度。因此,并不建议禁用 preemption
:::
::: tip
在 Kubernetes 1.15+,如果 `NonPreemptingPriority` 被启用了PriorityClass 可以设置为 `preemptionPolicy: Never`,此时,该 PriorityClass 的所有 Pod 将不会抢占preempty其他 Pod 的资源
:::
在 Kubernetes 1.11+preemption 由 kube-scheduler 的参数 `disablePreemption` 设置,默认为 `false`。如果在您已经知晓上面的提示的情况下,仍然要禁用 preemption可以将 `disablePreemption` 参数设置为 `true`
该参数需要通过 YAML 文件配置,而不能通过命令行参数设定。示例配置如下所示:
``` yaml {8}
apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
algorithmSource:
provider: DefaultProvider
...
disablePreemption: true
```
## PriorityClass
待续 ...
## Pod priority

View File

@@ -16,7 +16,7 @@ meta:
Secret 中的信息可以通过 `kubectl get secret` 命令获取。例如,执行命令 `kubectl get secret mysecret -o yaml
` 可获取前面章节中所创建的 Secret输出信息如下
```
``` yaml
apiVersion: v1
kind: Secret
metadata:

View File

@@ -34,7 +34,9 @@ Ingress Controller (通常需要负载均衡器配合)负责实现 Ingress A
2. Ingress Controller 根据请求的域名 `a.kuboard.cn` 和路径 `abc` 匹配集群中所有的 Ingress 信息,并最终找到 `Ingress B` 中有这个配置,其对应的 Service 为 `Service B``9080` 端口
3. Ingress Controller 通过 kube-proxy 将请求转发到 `Service B` 对应的任意一个 Pod 上 与 `Service B``9080` 端口对应的容器端口上。(从 Ingress Controller 到 Pod 的负载均衡由 kube-proxy + Service 实现)
<img src="./ingress.assets/image-20190910222649193.png" style="border: 1px solid #d7dae2; max-width: 720px;" alt="Kubernetes教程Ingress及其Controller"></img>
<p style="max-width: 720px;">
<img src="./ingress.assets/image-20190910222649193.png" alt="Kubernetes教程Ingress及其Controller"></img>
</p>
## Ingress Controller