长期支持版本

    社区创新版本

      附录

      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备份