tencent cloud

文档反馈

使用说明

最后更新时间:2024-06-14 16:32:13
    本文为您介绍如何基于原生节点开启并启用内存压缩能力。

    环境准备

    内存压缩功能要求原生节点镜像的内核更新至最新版本(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
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持