作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。
我们上一小节介绍主动维护服务器,对服务器进行隔离(Cordon)和驱逐(Drain)操作。但是在实际运维中,总有意外的情况发生,我们如何保证在意外发生的时候能够尽量降低对服务器的影响呢?这就是我们这一小节的QoS介绍。
我们在前面文章中反复提到一个词语OOM(out of memory),实际上就是Linux内核为了保证稳定性对而对进程执行的杀死动作,通过杀死服务器里面运行的部分进程来降低服务器的资源占用(主要是内存),来维持服务器的稳定性,保证服务器里面大多数业务的可靠性。
在kubernetes里面,我们也曾经介绍两种资源,Request和Limit,实际上在Kubernetes里面,他也承担服务器稳定性任务。前面介绍只讲解如何配置Ruques和Limit,但是应该如何合理的配置才能更加保证服务器的稳定性呢,我们首先来介绍的就是Kubernetes给我们提供的资源服务器质量(QoS)。
Kubernetes (通常简称 K8s) 是一个用于自动化部署、扩展和管理容器化应用程序的开源平台。在 Kubernetes 中,服务质量(Quality of Service, QoS)是一个关键概念,它帮助确保不同优先级的应用程序能够在资源受限的情况下获得适当的资源分配。
QoS 的重要性
当节点上的资源变得紧张时,Kubernetes 必须决定哪些 Pod 应该被驱逐以释放资源。QoS 类别决定了这些决策的优先级,并有助于防止关键任务或高优先级的服务受到影响,简单来说每个Pod都有一个QoS分数。
QoS 类别
Kubernetes 定义了三种 QoS 类别,按照优先级从高到低排序:
Guaranteed
所有容器都必须指定内存和 CPU 的 requests 和 limits,并且两者的值相等。
这类 Pod 在资源充足时能够得到稳定的资源保障,在资源不足时最不容易被驱逐。
Burstable
至少有一个容器指定了 requests 或者 limits,但不是所有的容器都有相同且相等的 requests 和 limits。
Burstable Pod 可以使用超过其请求的资源量,直到资源变得稀缺为止。在资源不足时,这类 Pod 会比 Guaranteed Pod 更容易被驱逐。
BestEffort
Pod 中的所有容器都没有指定任何 requests 或 limits。
这类 Pod 没有任何资源保障,在资源不足时是最先被驱逐的对象。
资源管理和 OOM 分数
为了实现 QoS 管理,Kubernetes 使用 cgroup 来限制 Pod 的资源使用。每个 Pod 都会被赋予一个 oom_score_adj 值,这个值影响 Linux 内核在内存不足时选择哪个进程来杀死以回收内存。oom_score_adj 的值范围是 -1000 到 +1000,值越高,Pod 被杀死的优先级越高。
Guaranteed: -997
Burstable: 2 到 999
BestEffort: 1000
对于系统关键组件如 kubelet 和 docker,它们的 oom_score_adj 设置为 -999,意味着它们不应该因为内存不足而被杀死,当然默认他们并没有加入到cgroup里面。
刚刚介绍了当资源紧张的时候会触发驱逐,但是什么是资源紧张,是否有具体的标准呢?
Kubelet 可以根据节点的状态主动驱逐 Pod,以确保节点的稳定性和可用性。这种机制被称为“Eviction”(驱逐),它帮助防止节点由于资源耗尽而变得不可用。默认情况下,Kubernetes 定义了一组触发驱逐的条件,这些条件基于节点上可用资源的阈值。
驱逐信号
Kubelet 使用以下几种资源信号来决定是否需要驱逐 Pod:
memory.available:节点上所有用户态和内核态内存减去缓存和缓冲区后的剩余内存。
nodefs.available:节点根文件系统的可用空间。
nodefs.inodesFree:节点根文件系统的可用 Inode 数量。
imagefs.available:容器镜像层存储使用的文件系统的可用空间(如果存在独立的 imagefs 文件系统)。
imagefs.inodesFree:容器镜像层存储使用的文件系统的可用 Inode 数量(如果存在独立的 imagefs 文件系统)。
默认驱逐阈值
以下是 Kubelet 的默认驱逐策略(在 Kubernetes 1.31beta 版本中),具体细节可以查看官方文档。请注意,这些值可能会随着版本更新而有所变化:
memory.available < 100Mi
nodefs.available < 10%
nodefs.inodesFree < 5%
imagefs.available < 15%
imagefs.inodesFree < 5%
驱逐日志显示磁盘不足,尝试释放(删除未使用的镜像),然后开始驱逐Pod。然后这里还显示了部分高优先级的Pod无法被驱逐。这个时候其实唯一可以被驱逐的Nginx容器已经被驱逐,参考下图。
Feb 11 21:56:52 node01 kubelet[897]: I0211 21:56:52.114658 897 eviction_manager.go:237] "Eviction manager: synchronize housekeeping"
Feb 11 21:56:52 node01 kubelet[897]: I0211 21:56:52.118993 897 eviction_manager.go:328] "Eviction manager: no resources are starved"
Feb 11 21:57:02 node01 kubelet[897]: I0211 21:57:02.121163 897 eviction_manager.go:237] "Eviction manager: synchronize housekeeping"
Feb 11 21:57:02 node01 kubelet[897]: I0211 21:57:02.135444 897 eviction_manager.go:289] "Eviction manager: node conditions - observed" nodeCondition=[DiskPressure]
Feb 11 21:57:02 node01 kubelet[897]: I0211 21:57:02.135523 897 eviction_manager.go:298] "Eviction manager: node conditions - transition period not met" nodeCondition=[DiskPressure]
Feb 11 21:57:23 node01 kubelet[897]: I0211 21:57:23.621057 897 eviction_manager.go:237] "Eviction manager: synchronize housekeeping"
Feb 11 21:57:23 node01 kubelet[897]: I0211 21:57:23.625234 897 eviction_manager.go:289] "Eviction manager: node conditions - observed" nodeCondition=[DiskPressure]
Feb 11 21:57:23 node01 kubelet[897]: I0211 21:57:23.625238 897 eviction_manager.go:298] "Eviction manager: node conditions - transition period not met" nodeCondition=[DiskPressure]
Feb 11 21:57:23 node01 kubelet[897]: I0211 21:57:23.625268 897 eviction_manager.go:338] "Eviction manager: attempting to reclaim" resourceName="ephemeral-storage"
Feb 11 21:57:23 node01 kubelet[897]: I0211 21:57:23.648319 897 eviction_manager.go:349] "Eviction manager: must evict pod(s) to reclaim" resourceName="ephemeral-storage"
Feb 11 21:57:23 node01 kubelet[897]: I0211 21:57:23.648352 897 eviction_manager.go:367] "Eviction manager: pods ranked for eviction" pods=[kube-system/openebs-device-controller-0 kube-system/calico-kube-controllers-64cc74d646-8c224 kube-system/calico-node-5bkjk kube-system/kube-proxy-j49v2]
Feb 11 21:57:23 node01 kubelet[897]: E0211 21:57:23.648364 897 eviction_manager.go:560] "Eviction manager: cannot evict a critical pod" pod="kube-system/openebs-device-controller-0"
Feb 11 21:57:23 node01 kubelet[897]: E0211 21:57:23.648369 897 eviction_manager.go:560] "Eviction manager: cannot evict a critical pod" pod="kube-system/calico-kube-controllers-64cc74d646-8c224"
Feb 11 21:57:23 node01 kubelet[897]: E0211 21:57:23.648373 897 eviction_manager.go:560] "Eviction manager: cannot evict a critical pod" pod="kube-system/calico-node-5bkjk"
Feb 11 21:57:23 node01 kubelet[897]: E0211 21:57:23.648379 897 eviction_manager.go:560] "Eviction manager: cannot evict a critical pod" pod="kube-system/kube-proxy-j49v2"
Feb 11 21:57:23 node01 kubelet[897]: I0211 21:57:23.648383 897 eviction_manager.go:390] "Eviction manager: unable to evict any pods from the node"
历史推荐内容Docker-docker基本信息,基本命令,dockerfile,原理,仓库,存储网络日志,番外篇云计算&虚拟化-包括服务器购买,虚拟化介绍,虚拟磁盘,虚拟网络,创建虚拟机,安装虚拟机,dashboard,xml解释,克隆,快照,初始化,esxi介绍。Linux进阶-包括硬件,日常运维,基础软件,日志,进阶命令,防火墙,shell编程,内核,linux系统及初始化Linux基础-包括文件的增删改查,磁盘管理,网络配置,用户配置,权限配置、 |
---|