在 Kubernetes 环境中管理服务器本身的 scale-in/out 时,可以使用 ClusterAutoscaler(以下简称 CA)。
我认为在使用 CA 进行缩放时我必须小心 DaemonSet 的行为,所以我将对其进行描述。
- 本文假设环境
- Kubernetes 平台
- AWS EKS
- Ver1.21
- AWS EKS
- 集群自动缩放器
- Ver1.21.3
- Kubernetes 平台
“日志收集”是 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.preStop 和 sleep 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