ARMS容器监控可监控Kubernetes集群所在的节点,并通过Pod资源配置、资源使用分布情况和历史异常事件来预估和展示当前集群中可能有风险的Pod。

背景信息

作为生产环境的容器编排系统,Kubernetes最重要的功能之一是根据您的配置,自主进行容器的调度和编排。因此通常情况下,当启动一个容器组时,Kubernetes会自动将容器均匀地分布到各个节点中,充分利用每个节点的资源。

然而事实上,由于您的配置原因,可能会导致Kubernetes集群所在的节点存在风险。例如Pod驱逐行为:kubelet能够主动监测和防止计算资源的全面短缺,在节点配置资源不足时,kubelet会主动结束一个或多个Pod以回收短缺的资源。

您可以配置容器的Request及Limit的资源,然后Kubernetes在部署Pod时,就会调度到一个具有充足空闲资源的节点部署Pod:

  • Request是Kubernetes保证容器使用的资源量,Kubernetes将根据Request的值决定部署Pod的节点。
  • Limit是Kubernetes允许容器使用的最大资源量。

例如以下示例,声明Nginx这个Pod需要1核CPU和1024 MB的内存,运行中实际使用不能超过2核CPU和4096 MB的内存。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    resources: # 资源声明
    requests:
        memory: "1024Mi"
        cpu: "1000m"
      limits:
        memory: "4096Mi"
        cpu: "2000m"

如果没有为容器设置Request阈值,则默认Request的阈值为Limit的阈值;如果没有设置Limit,则默认为0,即无上限。通常情况下,会出现以下两种情况的配置:

  • Request < Limit

    如果设置Request的阈值小于Limit的阈值,则允许对资源进行过度订阅。此类情况也包括未设置Limit的情况。例如Pod未设置内存Limit,则认为该Pod可以无限制地使用内存资源。当该Pod过度使用资源,导致其他Pod资源不足时,所在节点就会触发Pod驱逐行为,以保证该节点的资源充足。

  • Request > Limit

    如果设置Request的阈值大于Limit的阈值,则相当于申请了较多资源,但仅限制使用其中的部分资源,此种情况会影响节点资源的使用。

使用容器监控来监控K8s集群所在节点

合理的Request和Limit资源配置对于部署在K8s集群上的应用的稳定性至关重要,容器监控提供的节点监控主要监控Request和Limit资源配置,以及受配置影响的节点健康状态。您可以按照以下步骤使用容器监控来监控K8s集群所在节点:

  1. 登录ARMS控制台
  2. 在左侧导航栏单击容器监控
  3. 容器监控页面的K8s集群列表中单击目标集群名称。
  4. 概览页页面的节点列表区域查看节点的健康状态,将鼠标移动至异常节点,并在浮层中单击host对应的链接。

    其中,不同的颜色表示不同的状态:

    • 绿色表示节点处于Normal状态。
    • 橙色表示节点处于Warning状态。
    • 红色表示节点处于Error状态。
    sc_docker_server_monitor
  5. 节点页面查看资源使用分布情况。

    资源使用分布情况包括以下内容:

    • 基于K8s元数据展示Pod的Request和Limit资源配置的分布情况。
    • 基于K8s提供的数据展示的Pod实际使用资源的分布情况。
    pg_docker_node

    例如,在Top5 CPU占用核数pods折线图中发现某个Pod的实际CPU占用核数较高,为30.167 Core。

    pg_docker_node_top5_CPU

    然后在CPU Request配置分布环形图中查看此Pod的Request配置为4.1 Core。

    pg_docker_node_CPU_request

    最后在CPU Limit配置分布环形图中查看,发现此Pod没有Limit配置,判断此Pod可能存在Pod驱逐风险,您需要采取相应措施避免产生此风险,详情请参见后续操作

后续操作

为避免出现Pod驱逐风险从而保障应用稳定性,请遵循以下建议:

  • 合理设置Kubernetes资源调度的关键参数Request和Limit。
  • Pod驱逐会按照BestEffort > Burstable > Guaranteed的顺序进行驱逐,因此请将重要业务Pod的驱逐等级设置为Guaranteed。
  • 将BestEffort驱逐等级的Pod用于处理离线批处理类业务。