我想使用 Amazon Elastic Kubernetes Service(Amazon EKS)Worker 节点,按指定的磁盘使用百分比来清理映像缓存。
简短描述
要使用 Amazon EKS Worker 节点清理映像缓存,请使用以下 kubelet 垃圾回收参数:
- --image-gc-high-threshold 参数用于定义启动映像垃圾回收的磁盘使用百分比。默认值为 85%。
- --image-gc-low-threshold 参数用于定义 LowThresholdPercent 值。kubelet 会删除映像,直到磁盘使用率达到该值。默认值为 50%。
注意:在以下解决方法中,当磁盘使用率达到 70% 时,kubelet 垃圾回收参数会清理 Worker 节点中的映像缓存。--image-gc-high-threshold 设置为 70%。--image-gc-low-threshold 设置为 50%。
根据您的用例情况,按照解决步骤将 kubelet 垃圾回收添加到默认配置文件或现有节点中。然后,验证参数是否存在于节点端点中。
有关更多信息,请参阅 Kubernetes 网站上的 Garbage collection of unused containers and images。
解决方法
**注意:**以下解决方案适用于 Amazon EKS 优化的 Linux AMI。
将 kubelet 垃圾回收参数添加到默认 kubelet-config
使用 Amazon EKS 的自定义启动模板功能,将 kubelet 垃圾回收参数添加到亚马逊机器映像(AMI)的默认 kubelet-config 文件中。创建启动模板时,请在 UserData 中指定参数。
- 以下命令会更新 AMI 中的 KUBELET_CONFIG 文件。该命令会设置 imageGCHighThresholdPercent=70,imageGCLowThresholdPercent=60。有关更多信息,请参阅配置实例详细信息。
#!/bin/bash
set -o xtrace
KUBELET_CONFIG=/etc/kubernetes/kubelet/kubelet-config.json
# Inject imageGCHighThresholdPercent value unless it has already been set.
if ! grep -q imageGCHighThresholdPercent $KUBELET_CONFIG;
then
echo "$(jq ".imageGCHighThresholdPercent=70" $KUBELET_CONFIG)" > $KUBELET_CONFIG
fi
# Inject imageGCLowThresholdPercent value unless it has already been set.
if ! grep -q imageGCLowThresholdPercent $KUBELET_CONFIG;
then
echo "$(jq ".imageGCLowThresholdPercent=60" $KUBELET_CONFIG)" > $KUBELET_CONFIG
fi
/etc/eks/bootstrap.sh your-cluster-name
注意: 将 your-cluster-name 替换为 Amazon EKS 集群名称。如果不使用默认 kubelet 配置文件,请更新文件名。
- 使用启动模板创建 Worker 节点组。
将 kubelet 垃圾回收参数添加到现有 Worker 节点
**重要事项:**以下步骤要求您使用 SSH 连接到现有 Worker 节点并拥有 sudo 访问权限。必须在 Amazon EKS 集群中的所有现有 Worker 节点上完成这些步骤。
-
使用 SSH 连接到现有 Worker 节点。
-
在 Worker 节点中打开 /etc/kubernetes/kubelet/kubelet-config.json 文件。如果使用 EKSCTL 启动 Worker 节点,那么打开 /etc/eksctl/kubelet.yaml:
sudo vi /etc/kubernetes/kubelet/kubelet-config.json
#WORKER NODES LAUNCHED USING EKSCTL
sudo vi /etc/eksctl/kubelet.yaml
-
根据 Worker 节点的启动方式,将 kubelet 垃圾回收参数添加到 kubelet-config.json 或 kubelet.yaml 文件中。然后,保存该文件:
{ "kind": "KubeletConfiguration",
"apiVersion": "kubelet.config.k8s.io/v1beta1",
.
.
.
"imageGCHighThresholdPercent": 70, ==> Add the argument under the same alignment as the "kind"
"imageGCLowThresholdPercent": 60,
"maxPods": ...
}
#WORKER NODES LAUNCHED USING EKSCTL
kind: KubeletConfiguration
kubeReserved:
cpu: 70m
ephemeral-storage: 1Gi
memory: 1843Mi
serverTLSBootstrap: true
imageGCHighThresholdPercent: 70 ==> Add the arguments under the alignment "Kind" in the yaml file
imageGCLowThresholdPercent: 60
-
要在 Worker 节点中重新启动 kubelet 服务,请运行以下命令:
sudo service kubelet restart
验证新的 kubelet 垃圾回收参数是否位于节点 configz 端点中
-
要获取 Worker 节点的名称,请运行以下命令:
kubectl get nodes
-
要打开与 API 服务器的连接,请运行以下命令:
kubectl proxy
-
要检查节点 configz,请打开一个新终端。然后,运行以下命令:
curl -sSL "http://localhost:8001/api/v1/nodes/node_name/proxy/configz" | python3 -m json.tool
**注意:**将 node_name 替换为之前检索到的节点列表中的节点名称。如果 cURL 和 Python 不可用,则在 Web 浏览器中打开 URL。
此命令会返回来自 kubeletconfig 的输出。此输出含有 bootstrap.sh 文件中的设置。请参阅以下示例:
{"kubeletconfig": {
.
.
"imageGCHighThresholdPercent": 70, <=== The new value is set to 70 as given in UserData
"imageGCLowThresholdPercent": 60, <=== The new value is set to 50 as given in UserData
.
.
}
}