Kubernetes Pod QoS:它是什么以及为什么重要
大多数 Kubernetes 用户至少遇到过一次 OOMKilled
。
当这种情况发生时,我们通常会调整 Pod 的 QoS 设置或将其移动到另一个节点,认为节点存在内存问题。
在本文中,我将探讨 OOMKilled 的一个有趣方面,这可能会帮助您更有效地设置 Pod QoS。
什么是 OOMKilled?
在深入探讨 QoS 之前,我们先来谈谈 OOMKilled(内存不足被杀死)
。 这不是 Kubernetes 特有的——它是 Linux 内核的功能。 Linux 内核跟踪节点上的内存,如果内存不足,它会杀死进程以释放空间。这就是 OOMKilled 的全部内容。
什么是 Kubernetes QoS?
Kubernetes 服务质量(QoS)是一种内置机制,用于管理和优先分配 Kubernetes 集群中 Pod 的资源,如 CPU 和内存。它确保您的应用程序平稳高效地运行。
为什么您应该关心 Kubernetes QoS?
Kubernetes QoS 在管理有限的主机资源时非常重要。如果节点资源不足,kubelet
可以开始驱逐 Pod 以腾出空间。此驱逐过程有助于确保高优先级的 Pod 获得所需的资源以平稳运行。 因此,了解 QoS 可以在资源紧张时为您省去很多麻烦。
Kubernetes QoS 如何工作?
Kubernetes 使用三种 QoS 类别来管理 Pod 的优先级和资源:
保证(Guaranteed)
Kubernetes QoS — 保证类别
这些 Pod 获得最高优先级。它们被分配了它们请求的确切 CPU 和内存,确保它们始终拥有所需资源。这使得它们非常适合不能承受任何中断的关键应用程序。
保证 Pod 配置:
CopyapiVersion: v1
kind: Pod
metadata:
name: guaranteed-pod
spec:
containers:
- name: guaranteed-container
image: game-2048
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "500m"
可突增(Burstable)
Kubernetes QoS — 可突增类别
可突增 Pod 获得一定数量的 CPU 和内存,但如果有多余资源,它们可以使用额外的资源。然而,它们没有保证的性能,因此如果节点繁忙,这些 Pod 可能会遇到一些减速。
可突增 Pod 配置:
CopyapiVersion: v1
kind: Pod
metadata:
name: burstable-pod
spec:
containers:
- name: burstable-container
image: game-2048
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
尽力而为(Best Effort)
Kubernetes QoS — 尽力而为类别
尽力而为 Pod 位于优先级列表的底部。它们只有在其他所有资源都被分配后才会获得资源。这些 Pod 非常适合可以处理偶尔资源短缺的非关键任务。
尽力而为 Pod 配置:
CopyapiVersion: v1
kind: Pod
metadata:
name: besteffort-pod
spec:
containers:
- name: besteffort-container
image: game-2048
resources: {}
在节点资源耗尽的情况下,Kubernetes 使用这些 QoS 类别来决定驱逐哪些 Pod。首先,它会驱逐 尽力而为
Pod,然后是 可突增
Pod,只有在最后才会触及 保证
Pod。但请记住——在每个类别中,超出其请求资源的 Pod 会首先被驱逐。因此,保持您的资源请求和限制合理是关键!
使用 Kubernetes QoS 的好处
-
资源效率: QoS 让 Kubernetes 根据 Pod 的资源需求进行组织,确保一切平稳运行而不浪费资源。
-
可靠性: 关键应用程序获得优先权,因此它们始终拥有所需的资源。这使您的系统保持稳定和可靠运行。
-
成本管理: 高效的资源使用意味着您不会为基础设施支付过多费用。这对性能和预算都是双赢。
结论
Kubernetes QoS 是管理资源、防止 OOMKilled 错误和保持集群高效的关键。 通过选择正确的 QoS 类别:
-
保证 用于关键应用程序
-
可突增 用于灵活任务
-
尽力而为 用于低优先级任务
您可以提高可靠性、节省成本,并轻松应对资源紧张。这一切都是为了更智能、更具弹性的部署!