长期支持版本

    附录

    DaemonSet 配置模板

    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: rubik
    rules:
      - apiGroups: [""]
        resources: ["pods"]
        verbs: ["list", "watch"]
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: rubik
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: rubik
    subjects:
      - kind: ServiceAccount
        name: rubik
        namespace: kube-system
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: rubik
      namespace: kube-system
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: rubik-config
      namespace: kube-system
    data:
      config.json: |
        {
            "autoCheck": false,
            "logDriver": "stdio",
            "logDir": "/var/log/rubik",
            "logSize": 1024,
            "logLevel": "info",
            "cgroupRoot": "/sys/fs/cgroup",
            "cacheConfig": {
                "enable": false,
                "defaultLimitMode": "static",
                "adjustInterval": 1000,
                "perfDuration": 1000,
                "l3Percent": {
                    "low": 20,
                    "mid": 30,
                    "high": 50
                },
                "memBandPercent": {
                    "low": 10,
                    "mid": 30,
                    "high": 50
                }
            }
        }
    ---
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: rubik-agent
      namespace: kube-system
      labels:
        k8s-app: rubik-agent
    spec:
      selector:
        matchLabels:
          name: rubik-agent
      template:
        metadata:
          namespace: kube-system
          labels:
            name: rubik-agent
        spec:
          serviceAccountName: rubik
          hostPID: true
          containers:
          - name: rubik-agent
            image: rubik_image_name_and_tag
            imagePullPolicy: IfNotPresent
            env:
              - name: RUBIK_NODE_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: spec.nodeName
            securityContext:
              capabilities:
                add:
                - SYS_ADMIN
            resources:
              limits:
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 200Mi
            volumeMounts:
            - name: rubiklog
              mountPath: /var/log/rubik
              readOnly: false
            - name: runrubik
              mountPath: /run/rubik
              readOnly: false
            - name: sysfs
              mountPath: /sys/fs
              readOnly: false
            - name: config-volume
              mountPath: /var/lib/rubik
          terminationGracePeriodSeconds: 30
          volumes:
          - name: rubiklog
            hostPath:
              path: /var/log/rubik
          - name: runrubik
            hostPath:
              path: /run/rubik
          - name: sysfs
            hostPath:
              path: /sys/fs
          - name: config-volume
            configMap:
              name: rubik-config
              items:
              - key: config.json
                path: config.json
    

    Dockerfile 模板

    FROM scratch
    COPY ./build/rubik /rubik
    ENTRYPOINT ["/rubik"]
    

    镜像构建脚本

    #!/bin/bash
    ###################################################################################################
    # Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved.
    # rubik licensed under the Mulan PSL v2.
    # You can use this software according to the terms and conditions of the Mulan PSL v2.
    # You may obtain a copy of Mulan PSL v2 at:
    #     http://license.coscl.org.cn/MulanPSL2
    # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
    # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
    # PURPOSE.
    # See the Mulan PSL v2 for more details.
    # Author: Xiang Li
    # Create: 2022-11-29
    # Description: Build container image for rubik. Enjoy and cherrs!
    # Steps:
    #    1. build image and tag it with rubik version and release number
    #    2. modify `rubik-daemonset.yaml` file
    ###################################################################################################
    set -e
    
    CURRENT_DIR=$(cd "$(dirname "$0")" && pwd)
    BINARY_NAME="rubik"
    
    RUBIK_FILE="${CURRENT_DIR}/build/rubik"
    DOCKERFILE="${CURRENT_DIR}/Dockerfile"
    YAML_FILE="${CURRENT_DIR}/rubik-daemonset.yaml"
    
    # Get version and release number of rubik binary
    VERSION=$(${RUBIK_FILE} -v | grep ^Version | awk '{print $NF}')
    RELEASE=$(${RUBIK_FILE} -v | grep ^Release | awk '{print $NF}')
    IMG_TAG="${VERSION}-${RELEASE}"
    
    # Get rubik image name and tag
    IMG_NAME_AND_TAG="${BINARY_NAME}:${IMG_TAG}"
    
    # Build container image for rubik
    docker build -f "${DOCKERFILE}" -t "${IMG_NAME_AND_TAG}" "${CURRENT_DIR}"
    
    echo -e "\n"
    # Check image existence
    docker images | grep -E "REPOSITORY|${BINARY_NAME}"
    
    # Modify rubik-daemonset.yaml file, set rubik image name
    sed -i "s/rubik_image_name_and_tag/${IMG_NAME_AND_TAG}/g" "${YAML_FILE}"
    

    通信矩阵

    • rubik 服务进程作为客户端通过 List/Watch 机制与 kubernetes API Server 进行通信,从而获取 Pod 等信息
    侦听 IP侦听端口协议端口说明侦听端口是否可更改认证方式
    rubik 服务不侦听 IP无侦听端口

    文件与权限

    • rubik 所有的操作均需要使用 root 权限。

    • 涉及文件及权限如下表所示:

    文件路径文件/文件夹权限说明
    /var/lib/rubik750rpm 安装完成后生成目录,存放 rubik 相关文件
    /var/lib/rubik/build700存放 rubik 二进制文件的目录
    /var/lib/rubik/build/rubik550rubik 二进制文件
    /var/lib/rubik/rubik-daemonset.yaml550rubik daemon set 配置模板,供 k8s 部署使用
    /var/lib/rubik/Dockerfile640Dockerfile 模板
    /var/lib/rubik/build_rubik_image.sh550rubik 容器镜像构建脚本
    /var/log/rubik700rubik 日志存放目录(需开启 logDriver=file 后使能)
    /var/log/rubik/rubik.log*600rubik 日志文件

    约束限制

    规格

    • 磁盘:1GB+

    • 内存:100MB+

    运行时

    • 每个 k8s 节点只能部署一个 rubik,多个 rubik 会冲突

    • rubik 不接收任何命令行参数,若添加参数启动会报错退出

    • 容器挂载目录时,rubik 本地套接字/run/rubik 的目录权限需由业务侧保证最小权限(如 700)

    • 如果 rubik 进程进入 T、D 状态,则服务端不可用,此时服务不会响应,需恢复异常状态之后才可继续使用

    Pod 优先级设置

    • 禁止低优先级往高优先级切换。如业务 A 先被设置为低优先级(-1),接着设置为高优先级(0),rubik 报错

    • 用户添加注解、修改注解、修改 Pod yaml 中的注解并重新 apply 等操作不会触发 Pod 重建。rubik 会通过 List/Watch 机制感知 Pod 注解变化情况

    • 禁止将任务从在线组迁移到离线组后再迁移回在线组,此操作会导致该任务 QoS 异常

    • 禁止将重要的系统服务和内核线程加入到离线组中,否则可能导致调度不及时,进而导致系统异常

    • CPU 和 memory 的在线、离线配置需要统一,否则可能导致两个子系统的 QoS 冲突

    • 使用混部后,原始的 CPU share 功能存在限制。具体表现为:

      • 若当前 CPU 中同时存放在线任务和离线任务,则离线任务的 CPU share 无法生效
      • 若当前 CPU 中只有在线任务或只有离线任务,CPU share 能生效
      • 建议离线业务 Pod 优先级配置为 best effort
    • 用户态的优先级反转、smt、cache、numa 负载均衡、离线任务的负载均衡,当前不支持

    其他

    禁止用户直接手动修改 Pod 对应 cgroup 或 resctrl 参数,否则可能出现数据不一致情况。

    • CPU cgroup 目录, 如:/sys/fs/cgroup/cpu/kubepods/burstable//

      • cpu.qos_level
      • cpu.cfs_burst_us
    • memory cgroup 目录,如:/sys/fs/cgroup/memory/kubepods/burstable//

      • memory.qos_level
      • memory.soft_limit_in_bytes
      • memory.force_empty
      • memory.limit_in_bytes
      • memory.high
    • blkio cgroup 目录,如:/sys/fs/cgroup/blkio/kubepods/burstable//

      • blkio.throttle.read_bps_device
      • blkio.throttle.read_iops_device
      • blkio.throttle.write_bps_device
      • blkio.throttle.write_iops_device
    • RDT 控制组目录,如:/sys/fs/resctrl

    文档捉虫

    “有虫”文档片段

    问题描述

    提交类型 issue

    有点复杂...

    找人问问吧。

    PR

    小问题,全程线上修改...

    一键搞定!

    问题类型
    规范和低错类

    ● 错别字或拼写错误;标点符号使用错误;

    ● 链接错误、空单元格、格式错误;

    ● 英文中包含中文字符;

    ● 界面和描述不一致,但不影响操作;

    ● 表述不通顺,但不影响理解;

    ● 版本号不匹配:如软件包名称、界面版本号;

    易用性

    ● 关键步骤错误或缺失,无法指导用户完成任务;

    ● 缺少必要的前提条件、注意事项等;

    ● 图形、表格、文字等晦涩难懂;

    ● 逻辑不清晰,该分类、分项、分步骤的没有给出;

    正确性

    ● 技术原理、功能、规格等描述和软件不一致,存在错误;

    ● 原理图、架构图等存在错误;

    ● 命令、命令参数等错误;

    ● 代码片段错误;

    ● 命令无法完成对应功能;

    ● 界面错误,无法指导操作;

    风险提示

    ● 对重要数据或系统存在风险的操作,缺少安全提示;

    内容合规

    ● 违反法律法规,涉及政治、领土主权等敏感词;

    ● 内容侵权;

    您对文档的总体满意度

    非常不满意
    非常满意
    提交
    根据您的反馈,会自动生成issue模板。您只需点击按钮,创建issue即可。
    文档捉虫
    编组 3备份