在 Kubernetes 环境中管理服务器本身的 scale-in/out 时,可以使用 ClusterAutoscaler(以下简称 CA)。
我认为在使用 CA 进行缩放时我必须小心 DaemonSet 的行为,所以我将对其进行描述。

  • 本文假设环境
    • Kubernetes 平台
      • AWS EKS
        • Ver1.21
    • 集群自动缩放器
      • Ver1.21.3

“日志收集”是 DaemonSet 的用途之一。
如果您的应用程序 pod 记录到标准输出,它们将被打印到主机上的 /var/log/containers/
这是因为 DaemonSet 用于将主机上的日志传输到使用 Fluentd 等的日志收集目的地。

在将 DaemonSet 用于此类目的时,在删除 Node 时,由 DaemonSet 管理的 Pod 不得早于 DaemonSet 以外的 Pod 消失。
这是因为在删除节点时,会执行 Drain 来弹出 Pod,但即使在那个时候,日志也会继续发出。
如果 DaemonSet 的 Fluentd Pod 在应用程序的 Pod 之前消失,那么之后的日志输出将无法收集。

那么当使用 CA 进行扩展时会发生什么行为呢?

所以让我们验证一下。

使用 CA 缩小时验证 DaemonSet 的默认行为

我有一个像下面这样的吊舱。

$ kubectl get po -A -o jsonpath='{.items}' | jq -c '.[] | [.metadata.name,.status.phase]'
["aws-node-gccws","Running"]
["kube-proxy-q7v7h","Running"]
["daemonset-fluentd-cwzb2","Running"]
["deployment-app-6d4b447dfb-7zhgt","Running"]

如您所见,它假定了一个 DaemonSet 的 Fluentd Pod 和一个 Deployment 的应用程序 Pod。
spec.containers.lifecycle.preStopsleep 15 在应用程序 pod 中设置,以便在 pod 终止后它们不会立即消失。

如果 CA 在此状态下缩小...

$ kubectl get po -A -o jsonpath='{.items}' | jq -c '.[] | [.metadata.name,.status.phase]'
["aws-node-gccws","Running"]
["kube-proxy-q7v7h","Running"]
["deployment-app-6d4b447dfb-7zhgt","Running"]

DaemonSet 的 Fluentd Pod 首先消失了。
这样就无法收集到应用 Pod 输出的日志了。

为什么 DaemonSet Pods 先消失?

查看 CA 默认设置,我发现以下设置:

选项名称 默认 描述
daemonset-eviction-for-empty-nodes 错误的 DaemonSet pods 是否会从空节点优雅终止
daemonset-eviction-for-occupied-nodes 真的 DaemonSet pods 是否会从非空节点优雅终止

似乎默认设置是为non-empty nodes 弹出 DaemonSet Pods。
通过更改此选项,似乎可以防止 DaemonSet Pod 被删除。

*此选项可用于 CA 版本 v1.21.3 或更高版本。

更改默认行为并运行

--daemonset-eviction-for-occupied-nodes=false 添加到 CA 参数中。
之后,按如下方式启动验证 pod

$ kubectl get po -A -o jsonpath='{.items}' | jq -c '.[] | [.metadata.name,.status.phase]'
["aws-node-s2bdl","Running"]
["kube-proxy-wtfhh","Running"]
["daemonset-fluentd-9zbl4","Running"]
["deployment-app-6d4b447dfb-2q7f4","Running"]

如果您在此状态下使用 CA 进行扩展...

$ kubectl get po -A -o jsonpath='{.items}' | jq -c '.[] | [.metadata.name,.status.phase]'
["aws-node-s2bdl","Running"]
["kube-proxy-wtfhh","Running"]
["daemonset-fluentd-9zbl4","Running"]

DaemonSet Pod 的寿命比 Deployment Pod 长!

因此,我们需要注意 pod 在缩小时如何消失。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308631561.html

相关文章: