大家好,Kubernetes世界的航海家们!👋 在运营集群时,总会有一些重要的工作负载,让你觉得“这个Pod绝对不能死!”或者“如果没有空间,即使要挤掉其他Pod也必须运行!”例如,像监控系统、日志代理或核心API服务器这样的Pod。
今天,我们将详细了解如何保护这些重要的Pod,也就是Kubernetes的PriorityClass。我们一起来看看如何设置你珍贵Pod的优先级,并确保它们总是能比其他Pod优先占据位置,好吗?🧐

🤔 为什么需要PriorityClass?
Kubernetes调度器默认平等对待所有Pod。但是,当集群资源(CPU、内存)不足时会发生什么呢?新创建的Pod将无限期地处于Pending状态,直到有可用空间。如果这个Pod扮演着非常关键的角色,可能会导致整个服务中断。😱
此外,当集群空间不足时,可能需要决定首先驱逐(Evict)哪些Pod。在这种情况下,应该首先驱逐重要性较低的Pod,并尽可能保护重要的Pod。
PriorityClass正是为了应对这种情况而存在的。它为Pod分配一个 extit{‘优先级’} extit{}等级,告诉调度器和节点(kubelet)哪些Pod应该被更重要地对待。
- 调度优先级 (Scheduling Priority): 当资源不足时,高优先级Pod会比低优先级Pod更早地被放置在调度队列的前面。
- 抢占 (Preemption): 如果没有空间调度更重要的Pod,它可以驱逐 (Evict)节点上正在运行的、重要性较低的Pod,并占据其位置。
⚙️ PriorityClass使用方法:3步搞定!
创建具有最高优先级的Pod的过程非常简单。只需记住这3个步骤!
第1步:创建PriorityClass对象
首先,你需要定义要创建的优先级等级。value字段中的数字越大,优先级越高。系统使用的最高优先级通常是10亿(1,000,000,000),所以我们创建的优先级不应高于此。这里,我们将其设置为100万,以创建一个非常高的等级。
preemptionPolicy设置为PreemptLowerPriority,允许具有此优先级的Pod在没有空间时驱逐优先级较低的Pod。
high-priority.yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for critical pods only."
preemptionPolicy: PreemptLowerPriority
- value: 优先级分数。数字越大,优先级越高。(最大值:1,000,000,000)
- globalDefault: 如果设置为true,所有未指定priorityClassName的Pod都将获得此优先级。通常情况下,将其设置为false并明确指定更安全。
- preemptionPolicy:
- PreemptLowerPriority (默认值): 可以抢占优先级较低的Pod。
- Never: 绝不抢占其他Pod。
现在,将此YAML文件应用到集群。
$ kubectl apply -f high-priority.yaml
priorityclass.scheduling.k8s.io/high-priority created
####
第2步:为Pod指定PriorityClass
现在,让我们将创建的high-priority等级应用到实际的Pod上。只需在Pod的spec中添加priorityClassName字段,并填入刚刚创建的PriorityClass的名称即可。
high-priority-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-critical-app
spec:
containers:
- name: my-app-container
image: nginx
priorityClassName: high-priority
第3步:创建并验证Pod
现在,让我们创建这个Pod。
$ kubectl apply -f high-priority-pod.yaml
pod/my-critical-app created
现在,这个Pod已被赋予high-priority等级。如果集群资源不足导致此Pod处于Pending状态,Kubernetes调度器将尝试从节点中移除优先级低于high-priority的其他Pod,以腾出空间并运行my-critical-app Pod。
⚠️ 注意事项和提示
- 抢占并非没有代价!: 抢占功能非常强大,但终止正在运行的Pod会产生开销。被终止的Pod会经历正常的终止过程(termination grace period),但这可能导致服务暂时中断。因此,只有对真正必要的关键Pod才应赋予高优先级。
- 与PodDisruptionBudget (PDB)的关系: 在抢占过程中,Kubernetes会尊重PDB。这意味着,如果尝试驱逐某个Pod违反了其所属组的PDB策略,抢占可能会失败。建议为关键Pod组设置PDB,以确保最小可用性。
- 避免滥用: 为所有Pod赋予高优先级毫无意义。优先级是一个相对概念。识别真正重要的工作负载并分层设计优先级至关重要。
✨ 结论
PriorityClass是维护复杂繁忙的Kubernetes集群秩序、确保关键应用程序稳定性的核心功能。通过调度优先级和抢占(Preemption)机制,它保证了即使在资源不足的极端情况下,核心服务也能不间断地运行。
现在,你也可以识别集群中的重要Pod,并使用PriorityClass为它们披上坚实的保护罩了!🛡️