本文主要介绍Kubernetes集群资源监控机制和资源指标

前言

临近双11,对于码农,尤其是后端,尤其是某宝某东的后端,那是多么激动人心(心惊胆战)的一夜,为什么?怕宕机呀~。那么就让我们来构建护城河–监控与自动扩容,来抵挡千军万马–高并发场景。首先让我们学习一些基础:k8s集群资源监控机制和资源指标。

分析

从需求出发,我们自然需要收集一些数据(资源指标),再根据指标做一系列的操作(control),比如说预警警告、统计、自动扩容等。

首先,我们希望可以监控整个Kubernetes集群的健康状况,包括:

  1. 整个集群的资源利⽤率
  2. 集群中的所有⼯作节点是否运⾏正常、系统资源容量⼤⼩
  3. 每个⼯作节点上运⾏的容器化应⽤的数量

k8s资源控制

我们看看k8s如何资源控制

限制节点

以购物平台为例,微服务广受推崇,比如双11当天,用户进首页是流畅的,但是进活动主页就卡顿,到了零点时,加入购物车的按钮都转圈了。设想你的设计可能是三个微服务(主页服务 、双十一活动服务、订单服务),可想而知,活动服务是压力最大的,我们希望,就算宕机,不要影响其他的服务。所以可以把活动服务限制运行在某节点。

创建一个会被调度到特定节点上的 Pod,你也可以通过设置 nodeName 将某个 Pod 调度到特定的节点

 nodeName: foo-node # 调度 Pod 到特定的节点

限制内存

还是上面的例子,我们把活动服务调度到了 foo-node。那么剩下的服务没有去限制,但想想订单服务的压力也不小,这里我们希望限制它的资源上限。

要为容器指定内存请求,请在容器资源清单中包含 resources:requests 字段。 同理,要指定内存限制,请包含 resources:limits。

resources:
      requests:
        memory: "1000Gi"
      limits:
        memory: "1000Gi"

限制CPU

要为容器指定 CPU 请求,请在容器资源清单中包含 resources: requests 字段。 要指定 CPU 限制,请包含 resources:limits

    resources:
      limits:
        cpu: "100"
      requests:
        cpu: "100"

Example

环境准备:

  • k8s集群(master * 1,node * 2 )
  • kubectl 命令行工具( 笔者使用rancher)
  1. 创建一个namespace(stress)。
  2. 增加一个deployment, 修改内存上限为10M 1.
apiVersion: v1
kind: Pod
metadata:
  name: stress-demo
  namespace: stess
spec:
  containers:
  - name: stess-demo
    image: easy.vip/stess-demo
    resources: 
      limits:
        memory: "10Mi" 
  1. 压力机进行压力测试,压测一段时间,看到压测机报错数量剧增。
  2. 由于容器可以被重启,所以 kubelet 会重启它。 多次运行下面的命令,可以看到容器在反复的被杀死和重启:
@master:~# kubectl get  pod stess-demo-5f76cd5bc6-6km4s ---namespace=stess
NAME                             READY   STATUS             RESTARTS       AGE
 stess-demo-5f76cd5bc6-6km4s    0/1     CrashLoopBackOff   6 (3m7s ago)   9m25s
  1. 修改 limits: memory: “1000Mi” ,恢复压测机器正常。

原理

cAdvisor内置在kubelet中,kubelet运行在集群中的每个节点上。它通过Linux cgroups(Control Group,控制组)来收集内存和CPU指标 。

相关组件(调用链):

  • kubectl/dashboard/rancher
  • apiserver
  • metrics-server/heapter: 管理资源的分配、限制
  • kubelet(cAdvisor):指标搜集
  • cgroup:监控数据的最终来源

参考