Kubernetes集群资源监控一机制和资源指标
本文主要介绍Kubernetes集群资源监控机制和资源指标
前言
临近双11,对于码农,尤其是后端,尤其是某宝某东的后端,那是多么激动人心(心惊胆战)的一夜,为什么?怕宕机呀~。那么就让我们来构建护城河–监控与自动扩容,来抵挡千军万马–高并发场景。首先让我们学习一些基础:k8s集群资源监控机制和资源指标。
分析
从需求出发,我们自然需要收集一些数据(资源指标),再根据指标做一系列的操作(control),比如说预警警告、统计、自动扩容等。
首先,我们希望可以监控整个Kubernetes集群的健康状况,包括:
- 整个集群的资源利⽤率
- 集群中的所有⼯作节点是否运⾏正常、系统资源容量⼤⼩
- 每个⼯作节点上运⾏的容器化应⽤的数量
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)
- 创建一个namespace(stress)。
- 增加一个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"
- 压力机进行压力测试,压测一段时间,看到压测机报错数量剧增。
- 由于容器可以被重启,所以 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
- 修改 limits: memory: “1000Mi” ,恢复压测机器正常。
原理
cAdvisor内置在kubelet中,kubelet运行在集群中的每个节点上。它通过Linux cgroups(Control Group,控制组)来收集内存和CPU指标 。
相关组件(调用链):
- kubectl/dashboard/rancher
- apiserver
- metrics-server/heapter: 管理资源的分配、限制
- kubelet(cAdvisor):指标搜集
- cgroup:监控数据的最终来源
参考
- 为容器和 Pod 分配内存资源 https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-memory-resource/#specify-a-memory-request-and-a-memory-limit
- 为容器和 Pods 分配 CPU 资源 https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-cpu-resource/#create-a-namespace
- 将 Pod 分配给节点 https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-pods-nodes/
- Kubernetes 是如何进行资源监控调用链介绍https://mp.weixin.qq.com/s/91tW4DJYfMgfOCtdz6G6aw