如何配置 Amazon EKS Worker 节点,使之按指定的磁盘使用百分比来清理映像缓存?

2 分钟阅读
0

我想使用 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 中指定参数。

  1. 以下命令会更新 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 配置文件,请更新文件名。
  2. 使用启动模板创建 Worker 节点组。

将 kubelet 垃圾回收参数添加到现有 Worker 节点

**重要事项:**以下步骤要求您使用 SSH 连接到现有 Worker 节点并拥有 sudo 访问权限。必须在 Amazon EKS 集群中的所有现有 Worker 节点上完成这些步骤。

  1. 使用 SSH 连接到现有 Worker 节点

  2. 在 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
  3. 根据 Worker 节点的启动方式,将 kubelet 垃圾回收参数添加到 kubelet-config.jsonkubelet.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
  4. 要在 Worker 节点中重新启动 kubelet 服务,请运行以下命令:

    sudo service kubelet restart

验证新的 kubelet 垃圾回收参数是否位于节点 configz 端点中

  1. 要获取 Worker 节点的名称,请运行以下命令:

    kubectl get nodes
  2. 要打开与 API 服务器的连接,请运行以下命令:

    kubectl proxy
  3. 要检查节点 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
      .
      .
    }
    }
AWS 官方
AWS 官方已更新 1 个月前