本文为您介绍如何基于原生节点开启并启用内存压缩能力。
环境准备
内存压缩功能要求原生节点镜像的内核更新至最新版本(5.4.241-19-0017),可通过以下方式实现:
新增原生节点
1. 登录 容器服务控制台,在左侧导航栏中选择集群。
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 在节点管理 > Worker 节点中,选择节点池页签,单击新建。
4. 选择原生节点,参考 新建原生节点,完成节点池配置,该节点池下新增的原生节点将默认安装最新内核版本(5.4.241-19-0017)的镜像。
存量原生节点
若您创建了较早版本的原生节点,内核版本展示为 5.4.119-19-0013 的镜像还不支持内存压缩特性,可通过 RPM 包更新获取该特性,您可以通过 在线客服 或 提交工单 与我们联系,我们将协助您进行升级。
内核版本验证
可通过执行命令
kubectl get nodes -o wide
查看节点的 KERNEL-VERSION 已经为最新内核版本 5.4.241-19-0017.1_plus。
安装 QosAgent 组件
1. 登录 容器服务控制台,在左侧导航栏中选择集群。
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 选择左侧菜单栏中的组件管理,在组件管理页面单击新建。
4. 在新建组件管理页面中勾选 QoS Agent,同时在参数配置中勾选内存压缩,如下图所示:
5. 单击确定。
6. 在新建组件管理页面单击完成即可安装组件。
说明:
QosAgent 组件版本在1.1.5及以上才支持内存压缩能力,若您的集群已经安装过该组件,需要执行如下步骤:
1. 在集群的组件管理页面中,找到部署成功的 QoS Agent,单击右侧的升级。
2. 升级后单击更新配置,勾选内存压缩。
3. 单击完成。
选择节点开启压缩开关
为方便灰度验证,QosAgent 不会默认给所有原生节点都打开内存压缩所依赖的内核配置,您还需要通过 NodeQOS 来指定哪些节点可以开启压缩能力。
部署 NodeQOS 对象
说明:
安装完成 QosAgent 组件后,系统会默认在集群中部署一个名称为 'compress-node' 的 NodeQOS 资源,您可直接编辑修改。
1. 部署 NodeQOS 对象。通过
spec.selector.matchLables
指定在哪些节点上开启压缩开关,示例如下:apiVersion: ensurance.crane.io/v1alpha1kind: NodeQOSmetadata:name: compress-nodespec:selector:matchLabels:compression: enablememoryCompression:enable: true
2. 给节点打 lable 将 node 和 NodeQOS 关联。操作步骤如下:
2.1 登录 容器服务控制台,在左侧导航栏中选择集群。
2.2 在集群列表中,单击目标集群 ID,进入集群详情页。
2.3 在节点管理 > Worker 节点中,选择节点池页签,单击节点池卡片的编辑。
2.4 在调整节点池配置页面中,修改 lable 并勾选对存量节点应用本次更新,示例中 lable 为
compression: enable
。2.5 单击确定。
生效验证
当节点开启内存压缩后,您可以使用以下命令获取节点的 YAML 配置,通过 node 的 annotation 确认内存压缩是否正确开启。示例如下:
kubectl get node <nodename> -o yaml | grep "gocrane.io/memory-compression"
登录节点后依次检查 zram、swap、内核参数,确认内存压缩被正确开启,示例如下:
# 确认zram设备初始化# zramctlNAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT/dev/zram0 lzo-rle 3.6G 4K 74B 12K 2 [SWAP]# 确认设置到swap# free -htotal used free shared buff/cache availableMem: 3.6Gi 441Mi 134Mi 5.0Mi 3.0Gi 2.9GiSwap: 3.6Gi 0.0Ki 3.6Gi# sysctl vm.force_swappinessvm.force_swappiness = 1
选择业务启用内存压缩
部署 PodQOS 对象
1. 部署 PodQOS 对象。通过
spec.lableSelector.matchLables
指定在哪些 Pod 上启用内存压缩,示例如下:apiVersion: ensurance.crane.io/v1alpha1kind: PodQOSmetadata:name: memorycompressionspec:labelSelector:matchLabels:compression: enableresourceQOS:memoryQOS:memoryCompression:compressionLevel: 1enable: true
说明:
compressionLevel 代表压缩等级,取值范围1-4,对应算法 lz4、lzo-rle、lz4hc、zstd,对应压缩率由高到低,性能损失由小增大。
2. 创建工作负载和 PodQOS 中 labelSelector 相匹配,示例如下:
apiVersion: apps/v1kind: Deploymentmetadata:name: memory-stressnamespace: defaultspec:replicas: 2selector:matchLabels:app: memory-stresstemplate:metadata:labels:app: memory-stresscompression: enablespec:containers:- command:- bash- -c- "apt update && apt install -yq stress && stress --vm-keep --vm 2 --vm-hang 0"image: ccr.ccs.tencentyun.com/ccs-dev/ubuntu-base:20.04name: memory-stressresources:limits:cpu: 500mmemory: 1Girequests:cpu: 100mmemory: 100MrestartPolicy: Always
注意:
Pod 中所有容器必须设置 memory limit。
生效验证
可通过 Pod annotation(gocrane.io/memory-compression)、进程内存使用情况、zram 或 swap 使用情况、cgroup 内存使用情况来确认 Pod 正确开启了内存压缩。
# qos agent 会给开启内存压缩的pod设置annotationkubectl get pods -l app=memory-stress -o jsonpath="{.items[0].metadata.annotations.gocrane\\.io\\/memory-compression}"# zramctlNAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT/dev/zram0 lzo-rle 3.6G 163M 913.9K 1.5M 2 [SWAP]# free -htotal used free shared buff/cache availableMem: 3.6Gi 1.4Gi 562Mi 5.0Mi 1.7Gi 1.9GiSwap: 3.6Gi 163Mi 3.4Gi# 查看 cgroup (一般为/sys/fs/cgroup/memory/路径下)中的 memory.zram.{raw_in_bytes,usage_in_bytes} 可以看到pod有多少内存进行了压缩、压缩后内存大小,计算差值即为节约内存cat memory.zram.{raw_in_bytes,usage_in_bytes}170659840934001# 计算差值即为节约内存大小,例子中节约了170Mi内存cat memory.zram.{raw_in_bytes,usage_in_bytes} | awk 'NR==1{raw=$1} NR==2{compressed=$2} END{ print raw - compress }'170659840