写点什么

浅析 Kubernetes 资源管理

  • 2019-11-14
  • 本文字数:3019 字

    阅读完需:约 10 分钟

浅析Kubernetes资源管理

Kubernetes 的系统资源分为可压缩资源(CPU)和不可压缩资源(memory、storage)。默认情况下,kubelet 没有做资源预留限制,这样节点上的所有资源都能被 Pod 使用。若节点上的 pod 负载较大,会引发一系列问题。本文介绍了针对该问题 Kubernetes 提供的 kubelet 的 Node Allocatable 特性。

背景简介

Kubernetes 的系统资源分为可压缩资源(CPU)和不可压缩资源(memory、storage)。可压缩资源(比如 CPU)在系统满负荷时会划分时间片分时运行进程,通常情况下系统整体会变慢;不可压缩资源(如 Memory)在系统满负荷时,严重时会导致某些进程被系统 OOM killer 机制杀掉。


默认情况下,kubelet 没有做资源预留限制,这样节点上的所有资源都能被 Pod 使用。若节点上的 pod 负载较大,这些 pod 可能会与节点上的系统守护进程和 k8s 组件争夺资源,严重时甚至会引发系统 OOM 而杀掉一些进程。若被杀掉的进程是系统进程或 K8S 组件,可能导致更严重的问题,甚至会导致集群的雪崩。


针对这种问题,kubernetes 提供了 kubelet 的 Node Allocatable 特性,为系统进程和 k8s 组件预留资源。

资源预留

1 Node Allocatable

kubelet 的启动配置中有一个 Node Allocatable 特性,来为系统守护进程和 k8s 组件预留计算资源,使得即使节点满负载运行时,也不至于出现 pod 去和系统守护进程以及 k8s 组件争抢资源,导致节点挂掉的情况。目前支持对 CPU, memory, ephemeral-storage 三种资源进行预留。kubernetes 官方建议根据各个节点的负载情况来具体配置相关参数。


节点计算资源的分配如下图所示:



其中各个部分的含义如下:


  • Node Capacity:Node 的硬件资源总量;

  • kube-reserved:为 k8s 系统进程预留的资源(包括 kubelet、container runtime 等,不包括以 pod 形式的资源);

  • system-reserved:为 linux 系统守护进程预留的资源;

  • eviction-threshold:通过–eviction-hard 参数为节点预留内存;

  • allocatable:可供节点上 Pod 使用的容量,kube-scheduler 调度 Pod 时的参考此值。


# 节点可供Pod使用资源总量的计算公式:allocatable = NodeCapacity - [kube-reserved] - [system-reserved] - [eviction-threshold]
复制代码


从公式可以看出,默认情况下(不设置 kube-reserved、system-reserved、eviction-threshold)节点上提供给 Pod 使用的资源总量等于节点的总容量。

2 参数含义及配置

Kubelet Node Allocatable 的代码比较简单,主要在 pkg/kubelet/cm/node_container_manager.go,感兴趣的同学可以看一下。以下是相关配置参数:


  • –enforce-node-allocatable,默认为 pods(默认情况下,kubelet 会为所有 pod 的总 cgroup 做资源限制,限制为公式计算出的 allocatable 的大小)。要为 kube 组件和 System 进程预留资源,则需要设置为 pods,kube-reserved,system-reserve,同时还要分别加上–kube-reserved-cgroup 和–system-reserved-cgroup 以指定分别限制在哪个 cgroup 里;

  • –cgroups-per-qos,Enabling QoS and Pod level cgroups,默认开启。开启后,kubelet 会将管理所有 workload Pods 的 cgroups;

  • –cgroup-driver,默认为 cgroupfs,另一可选项为 systemd。取决于容器运行时使用的 cgroup driver,kubelet 与其保持一致;

  • –kube-reserved,用于配置为 kube 组件(kubelet,kube-proxy,dockerd 等)预留的资源量,比如—kube-reserved=cpu=2000m,memory=8Gi,ephemeral-storage=16Gi;

  • –kube-reserved-cgroup,如果设置了–kube-reserved,需设置对应的 cgroup,且该 cgroup 目录要事先创建好,否则 kubelet 将不会自动创建导致 kubelet 启动失败。比如设置为 kube-reserved-cgroup=/kubelet.service;

  • –system-reserved,用于配置为 System 进程预留的资源量,比如—system-reserved=cpu=2000m,memory=4Gi,ephemeral-storage=8Gi;

  • –system-reserved-cgroup,如果设置了–system-reserved,需设置对应的 cgroup,且该 cgroup 目录要事先创建好,否则 kubelet 将不会自动创建导致 kubelet 启动失败。比如设置为 system-reserved-cgroup=/system.slice。

  • –eviction-hard,用来配置 kubelet 的 hard eviction 条件,只支持 memory 和 ephemeral-storage 两种不可压缩资源。当出现 MemoryPressure 时,Scheduler 不会调度新的 Best-Effort QoS Pods 到此节点。当出现 DiskPressure 时,Scheduler 不会调度任何新 Pods 到此节点。

配置与验证

针对 pod、system、kube 均做 cgroup 级别限制,需要进行以下配置:


# 在kubelet的启动参数中添加:--enforce-node-allocatable=pods,kube-reserved,system-reserved \--cgroup-driver=cgroupfs \--kube-reserved=cpu=1,memory=1Gi,ephemeral-storage=10Gi \--kube-reserved-cgroup=/system.slice/kubelet.service \--system-reserved cpu=1,memory=2Gi,ephemeral-storage=10Gi \--system-reserved-cgroup=/system.slice \# 设置cgroup结构可参考官方建议。
复制代码


为 system.slice、kubelet.service 创建 cpuset 子系统:未创建前 system.slice 这个 cgroup 是没有 cpuset 子系统的,而 kubelet(1.9)启动时会去查看这些 cgroup 子系统是否存在,如果不存在会报相应的 cgroup 错误。


// Exists checks if all subsystem cgroups already existfunc (m *cgroupManagerImpl) Exists(name CgroupName) bool {  // Get map of all cgroup paths on the system for the particular cgroup  cgroupPaths := m.buildCgroupPaths(name)
// the presence of alternative control groups not known to runc confuses // the kubelet existence checks. // ideally, we would have a mechanism in runc to support Exists() logic // scoped to the set control groups it understands. this is being discussed // in https://github.com/opencontainers/runc/issues/1440 // once resolved, we can remove this code. whitelistControllers := sets.NewString("cpu", "cpuacct", "cpuset", "memory", "systemd")
// If even one cgroup path doesn't exist, then the cgroup doesn't exist. for controller, path := range cgroupPaths { // ignore mounts we don't care about if !whitelistControllers.Has(controller) { continue } if !libcontainercgroups.PathExists(path) { return false } }
return true}
复制代码


# 所以需要手工创建相应cpuset子系统:sudo mkdir -p /sys/fs/cgroup/cpuset/system.slicesudo mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service
复制代码


重启 kubelet 后,可以验证(以内存为例):


通过公式计算、节点实际 capacity 及 allocatable 的值(kubectl describe node xxx)、 kubepods 控制组中对内存的限制值(/sys/fs/cgroup/memory/kubepods/memory.limit_in_bytes)均与预期相符。


并且 system.slice(/sys/fs/cgroup/memory/system.slice/memory.limit_in_bytes)、kubelet.service(/sys/fs/cgroup/memory/system.slice/kubelet.service/memory.limit_in_bytes)控制组对内存的限制值也与预期相符。

最佳实践

  1. 生产环境中,建议同时限制 pod、k8s 系统组件、linux system 进程资源,以免任一类资源负载过高影响其他组件,甚至造成雪崩;

  2. 针对 daemonset 创建出来的系统级别 pod,建议为其配置 Guaranteed 的服务质量等级。


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/CmHok-9gKVrHfiXpYUQ4nw


2019-11-14 16:421538

评论

发布
暂无评论
发现更多内容

Rancher2.6 Monitoring Grafana 对接 LDAP

Rancher

Kubernetes k8s rancher

Android-聊聊自动化测试真经

芝麻粒儿

android 7月月更

2022可信云大会 | 中国信通院云上软件工程评估结果即将发布

中国IDC圈

软件工程 可信云 评估结果

墨天轮沙龙 | 北京大学李文杰:面向知识图谱应用的图数据库系统gStore

墨天轮

数据库 图数据库 知识图谱 开源数据库 国产数据库

AWS Trusted Advisor

冯亮

云计算 DevOps AWS

SpringSecurity 添加验证码的两种方式

周杰伦本人

7月月更

2022年盘点,主流前端跨端技术方案(包含小程序)

Speedoooo

flutter taro Weex React Native finclip

架构“浴火重生”宝典名不虚传!GitHub开源半日标星竟已超300k!

冉然学Java

Java 架构 笔记分享 #Github #开源

亚马逊云科技如何通过智能营销帮助苏泊尔实现年产破亿?

Lily

IDC 发布《云原生 AI - 加速 AI 工程化落地》报告,百度智能云领跑云原生 AI 能力

Baidu AICLOUD

异构计算 AI加速 云原生AI

【运维小知识】单点登录是什么意思?有什么作用?

行云管家

运维 单点登录 IT运维

ES6 --- 展开运算符(一)

bo

前端 面试题 ES6 深拷贝 7月月更

Python 入门指南之虚拟环境和包

海拥(haiyong.site)

7月月更

深度解析:LP流动性挖矿系统开发逻辑拆解

开发微hkkf5566

来了,MyBatisPlus的join联表查询

冉然学Java

Java mybatis 编程、 Fork/Join框架

React Native 跨端框架与小程序混编实战

Speedoooo

flutter 小程序 React Native APP开发

秒懂 Git 与 Gitee

攻城狮杰森

git gitee 7月月更 入门教程

北京银行推出“智策”零售数字化运营体系 加速推进数字化转型发展

易观分析

数字化转型

大数据培训如何优化HiveSQL

@零度

大数据开发 hiveSQL

推荐一个鸿蒙即时通讯软件《果聊》,有点屌呢!!

坚果

OpenHarmony 7月月更 harmony

双引擎 GPU 容器虚拟化,用户态和内核态的技术解析和实践分享

Baidu AICLOUD

异构计算 AI加速 GPU容器虚拟化

用友网络:把握穿越周期的关键,高研发投入下的发展韧性

Lily

用户体验 | 银行如何优化APP用户体验

易观分析

用户体验

云图说丨OLAP开源引擎的一匹黑马,MRS集群组件之ClickHouse

华为云开发者联盟

数据库 后端

AI 翻译助力社交泛娱乐应用全球无障碍沟通

融云 RongCloud

入门即享受!coolbpf 硬核提升 BPF 开发效率 | 龙蜥技术

OpenAnolis小助手

开源 技术 龙蜥大讲堂 BPF coolbpf

数据库每日一题---第22天:最后一次登录

知心宝贝

数据库 算法 前端 后端 7月月更

AI简报-how to use Loss Surfaces 一种模型集成

AIWeker

AI简报 7月月更

浅析Kubernetes资源管理_文化 & 方法_360云计算_InfoQ精选文章