使用说明

最近更新时间:2024-02-18 15:29:43

我的收藏
本文为您介绍如何基于原生节点开启并启用内存压缩能力。

环境准备

内存压缩功能要求原生节点镜像的内核更新至最新版本(5.4.241-19-0017),可通过以下方式实现:

新增原生节点

1. 登录 容器服务控制台,在左侧导航栏中选择集群
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 节点管理 > Worker 节点中,选择节点池页签,单击新建。
4. 选择原生节点,单击创建。
5. 在新建节点池页面的高级设置中找到 Annotations 字段,并设置 “node.tke.cloud.tencent.com/beta-image = wujing”,如下图所示:



6. 单击创建节点池
说明:
该节点池下新增的原生节点将默认安装最新内核版本(5.4.241-19-0017)的镜像。

存量原生节点

存量原生节点级内核版本可以通过 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 对象

1. 部署 NodeQOS 对象。通过 spec.selector.matchLables 指定在哪些节点上开启压缩开关,示例如下:
apiVersion: ensurance.crane.io/v1alpha1
kind: NodeQOS
metadata:
name: compression
spec:
selector:
matchLabels:
compression: enable
memoryCompression:
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设备初始化
# zramctl
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lzo-rle 3.6G 4K 74B 12K 2 [SWAP]

# 确认设置到swap
# free -h
total used free shared buff/cache available
Mem: 3.6Gi 441Mi 134Mi 5.0Mi 3.0Gi 2.9Gi
Swap: 3.6Gi 0.0Ki 3.6Gi

# sysctl vm.force_swappiness
vm.force_swappiness = 1

选择业务启用内存压缩

部署 PodQOS 对象

1. 部署 PodQOS 对象。通过 spec.lableSelector.matchLables 指定在哪些 Pod 上启用内存压缩,示例如下:
apiVersion: ensurance.crane.io/v1alpha1
kind: PodQOS
metadata:
name: memorycompression
spec:
labelSelector:
matchLabels:
compression: enable
resourceQOS:
memoryQOS:
memoryCompression:
compressionLevel: 1
enable: true
说明:
compressionLevel 代表压缩等级,取值范围1-4,对应算法 lz4、lzo-rle、lz4hc、zstd,对应压缩率由高到低,性能损失由小增大。
2. 创建工作负载和 PodQOS 中 labelSelector 相匹配,示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: memory-stress
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: memory-stress
template:
metadata:
labels:
app: memory-stress
compression: enable
spec:
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.04
name: memory-stress
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 100m
memory: 100M
restartPolicy: Always
注意:
Pod 中所有容器必须设置 memory limit。

生效验证

可通过 Pod annotation(gocrane.io/memory-compression)、进程内存使用情况、zram 或 swap 使用情况、cgroup 内存使用情况来确认 Pod 正确开启了内存压缩。
# qos agent 会给开启内存压缩的pod设置annotation
kubectl get pods -l app=memory-stress -o jsonpath="{.items[0].metadata.annotations.gocrane\\.io\\/memory-compression}"

# zramctl
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lzo-rle 3.6G 163M 913.9K 1.5M 2 [SWAP]

# free -h
total used free shared buff/cache available
Mem: 3.6Gi 1.4Gi 562Mi 5.0Mi 1.7Gi 1.9Gi
Swap: 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}
170659840
934001

# 计算差值即为节约内存大小,例子中节约了170Mi内存
cat memory.zram.{raw_in_bytes,usage_in_bytes} | awk 'NR==1{raw=$1} NR==2{compressed=$2} END{ print raw - compress }'
170659840