2. 版本申明

版本

修改内容

修改时间

v1.0

初始化

5/12/2022

v1.1

新增二次开发说明

5/22/2023

v1.2

更新组件文档说明

6/25/2023

v1.3

更新组件说明

7/03/2023

v1.4

更新一些词语

12/12/2023

v1.5

更新一些格式以及内容

4/8/2024

v1.6

更新异构平台部分

5/20/2024

v1.7

更新格式部分

6/24/2024

v1.8

更新前置依赖

7/9/2024

3. 简介

TopsCloud 是基于GCU的云原生解决方案包,其包括enflame-container-toolkit,k8s-device-plugin,gcu-exporter,gcu-operator等重要组件用于支持GCU K8S集群。

4. 专有名词解释

名词

描述

TopsCloud

燧原基于GCU的K8S集群化解决方案

enflame-container-toolkit

燧原基于GCU的容器化插件

k8s-device-plugin

燧原基于GCU的k8s插件,向k8s集群注册GCU资源

gcu-exporter

燧原GCU的数据采集组件,提供gcu设备运行相关指标的时序数据

gcu-feature-discovery

用于给GCU设备打上标签

node-feature-discovery

用于给服务器设备打上标签

gcu-operator

自定义资源GcuResource用于自动化管理gcu软件

go-eflib

golang 二次开发库

5. 前置依赖

  • 已安装docker, containerd(k8s version >=1.24)

  • Kubernetes版本高于1.9

  • GCU Driver

6. 文档使用说明

6.1. k8s-device-plugin使用说明

见《K8S Plugin用户使用手册》。

6.2. enflame-container-toolkit使用说明

见《Container Toolkit用户使用手册》。

6.3. gcu-operater使用说明

见《GCU Operator用户使用手册》。

6.4. gcu-exporter使用说明

见《GCU Exporter用户使用手册》。

6.5. gcu-feature-discovery使用说明

见《GCU Feature Discovery用户使用手册》。

6.6. node-feature-discovery使用说明

见《Node Feature Discovery用户使用手册》。

6.7. 其他组件

其他独立组件见相应的组件文档,确认依赖组件已就绪后,依照用户手册进行安装使用。

7. 二次开发用户使用说明

7.1. 一般用户(内网用户)

见相应的独立组件用户使用手册。

7.2. 需要二次开发的外网用户

除了参考相应的独立组件用户使用手册之外,安装包的Yaml配置文件里涉及容器镜像填写的地方需要用户自我定义以及根据实际使用情况来修改, 可以通过命令:find . -name "*.yaml" | xargs grep "artifact.enflame.cn/enflame_docker_images/enflame" 找到相关文件,例如:

# cd topscloud_<VERSION>
# find . -name "*.yaml" | xargs grep "artifact.enflame.cn/enflame_docker_images/enflame"
./k8s-device-plugin_2.0.0.beta1/yaml/enflame-device-plugin.yaml:     \
- image: artifact.enflame.cn/enflame_docker_images/enflame/k8s-device-plugin:v2.0.0 \
./k8s-device-plugin_2.0.0.beta1/yaml/enflame-device-plugin-pcie-switch-affinity.yaml:   \
- image: artifact.enflame.cn/enflame_docker_images/enflame/k8s-device-plugin:v2.0.0 \
./k8s-device-plugin_2.0.0.beta1/yaml/enflame-device-plugin-compat-with-cpumanager.yaml:  \
- image: artifact.enflame.cn/enflame_docker_images/enflame/k8s-device-plugin:v2.0.0     \
./gcu-feature-discovery_1.2.10/yaml/gcu-feature-discovery-daemonset.yaml:        \
- image: artifact.enflame.cn/enflame_docker_images/enflame/gcu-feature-discovery:latest  \
./gcu-feature-discovery_1.2.10/all-in-one/yaml/all-in-one.yaml:        \
image: artifact.enflame.cn/enflame_docker_images/enflame/enflame-device-plugin:latest \
............................................
./gcu-operator_2.2.22/enflame-resources/k8s-device-plugin/pcie-switch/daemonset.yaml:      \
- image: artifact.enflame.cn/enflame_docker_images/enflame/k8s-device-plugin:latest    \
./gcu-exporter_1.4.20/yaml/gcu-exporter-non-privileged.yaml:          \
image: artifact.enflame.cn/enflame_docker_images/enflame/gcu-exporter:latest      \
./gcu-exporter_1.4.20/yaml/gcu-exporter.yaml:          \
image: artifact.enflame.cn/enflame_docker_images/enflame/gcu-exporter:latest       \
./gcu-exporter_1.4.20/yaml/gcu-exporter-for-arm.yaml:          \
image: artifact.enflame.cn/enflame_docker_images/enflame/gcu-exporter:latest
..............................................

注:除了以上文件,也需要二次开发用户根据自己的实际使用情况梳理且修改相应的镜像,避免遗漏。

8. GCU标签自动生成使用说明

8.1. 基础组件

  • enflame-container-toolkit

  • k8s-device-plugin

  • node-feature-discovery

  • gcu-feature-discovery

8.2. 基于NFD与GFD的使用方案

方案 1 - 同GPU方案

该方案部署方式同GPU,基本使用过程示例如下,该方案方便与用户已有的GPU方案保持一致,便于后续升级维护。

1,用户先安装 enflame-container-toolkit以及k8s-device-plugin

2,安装node-feature-discovery,步骤如下:

cd node-feature-discovery_<VERSION>

# 构建node-feature-discovery镜像
./build-image.sh

# apply namespace 为 enflame.com 的nfd yaml,这里也可以修改deploy.sh 执行
kubectl apply -f yaml/nfd.yaml
或
# tke cloud用户 apply namespace 为 tke.cloud.tencent.com 的nfd yaml,这里也可以修改deploy.sh 执行
kubectl apply -f yaml/tke-cloud-nfd.yaml

3,安装gcu-feature-discovery

cd gcu-feature-discovery_<VERSION>

# 构建gcu-feature-discovery镜像
./build-image.sh

# apply gfd daemonset, 这里也可以修改deploy.sh 执行
kubectl apply -f yaml/gcu-feature-discovery-daemonset.yaml

方案 2 - 镜像与DaemonSet合一方案

k8s-device-plugin + node-feature-discovery + gcu-feature-discovery 镜像与daemonset合一方案,基本使用过程示例如下:

1,用户先安装 enflame-container-toolkit

2,安装k8s-device-plugin + node-feature-discovery + gcu-feature-discovery

# 构建k8s-device-plugin + node-feature-discovery + gcu-feature-discovery镜像
执行./build-image.sh

# apply k8s-device-plugin + node-feature-discovery +
# gcu-feature-discovery三个文件合一的 yaml文件,这里也可以修改deploy.sh 执行
kubectl apply -f yaml/k8s-device-plugin-with-nfd-gfd.yaml

方案 3 - 自定义或自我开发

用户也可以基于api或提供的二进制文件,自我二次开发:

1)topscloud除了提供最基本的container-toolkit + k8s-device-plugin 之外 也提供 node-feature-discovery + gcu-feature-discovery二进制以及基本的编程示例以及使用手册, 由用户根据自己的实际使用场景进行DIY编程,达成内部最佳适用;

2)topscloud也提供go-zxlib api 库,用户可以基于这些API结合自有的k8s plugin manager 进行二次开发从而满足本身原有的使用案例的支持;

方案1结果如下(方案2类似)

GCU标签信息查看:

# kubectl get pod -A
NAMESPACE     NAME                                       \
                              READY   STATUS    RESTARTS      AGE
..............................
kube-system   etcd-sse-lg-112-32                         \
                              1/1     Running   2 (58d ago)   64d
kube-system   gcu-feature-discovery-cnm4h                \
                              1/1     Running   0             19s
kube-system   kube-apiserver-sse-lg-112-32               \
                              1/1     Running   2 (58d ago)   64d
kube-system   kube-controller-manager-sse-lg-112-32      \
                              1/1     Running   2 (58d ago)   64d
kube-system   kube-proxy-j2gbj                           \
                              1/1     Running   2 (58d ago)   64d
kube-system   kube-scheduler-sse-lg-112-32               \
                              1/1     Running   2 (58d ago)   63d
kube-system   nfd-fblrn                                  \
                              2/2     Running   0             7m13s
..........................

# kubectl get nodes -o yaml
.................
    creationTimestamp: "2024-03-13T10:16:16Z"
    labels:
      beta.kubernetes.io/arch: amd64
      beta.kubernetes.io/os: linux
      enflame.com/gcu.count: "8"
      enflame.com/gcu.driverVer: 1.0.1.2
      enflame.com/gcu.family: AAAA
      enflame.com/gcu.machine: NF5468M5
      enflame.com/gcu.memory: "32768"
      enflame.com/gcu.model: TXTX
      enflame.com/gcu.product: AAAA
      enflame.com/gfd.latestLabeledTimestamp: 2024-05-20-06-40-27
      enflame.com/gfd.timestamp: 2024-05-20-06-40-27
........................

标签使用编程示例

nodeSelector编程示例

spec:
  nodeSelector:
    enflame.com/gpu.product:  AAAA  # 假设我们想要的 GCU 产品型号

nodeAffinity编程示例

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "enflame.com/gpu.product"
            operator: "In"
            values:
            - "AAAA"  # 假设我们想要的 GCU 产品型号

9. GCU标签手工生成使用说明

9.1. 如何给节点打上标签

命令行添加Labels示例

kubectl label nodes k8s-node1 enflame.com/gcu.product=AAAA               # 为node加上标签
kubectl label --overwrite nodes k8s-node1 enflame.com/gcu.product=BBBB   # 改写node标签
kubectl label nodes --all enflame.com/gcu.product=AAAA                   # 为所有node加上标签
kubectl label nodes k8s-node1 enflame.com/gcu.product-                   # 为node去除标签

yaml文件添加Labels示例

kind: Node
apiVersion: v1
metadata:
  name: k8s-node1
  labels:
    enflame.com/gcu.product: AAAA

执行kubectl apply -f node.yaml即可进行标签的添加和覆盖

9.2. 为pod配置节点亲和性示例

将pod调度到具有特定标签的节点,有nodeSelector和nodeAffinity两种方式可以做到,这里使用节点亲和性(node affinity)作为示例。 这一过程需要在pod对象下的规约(spec)下添加亲和性描述,下面是一个描述pod对象的yaml文件,可以看到我们我们在pod的spec下增加了亲和性描述。

apiVersion: v1
kind: Pod
metadata:
name: pod-gcu-example
namespace: enflame
spec:
#  restartPolicy: OnFailure
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
  - matchExpressions:
  # 下面四行为匹配表达式的详细内容,支持
  # In,Not In,Exist,Not Exist,Gt,Lt六种操作符
  - key: enflame.com/gcu.product  # GFD生成的标签
operator: In
values:
  - AAAA
hostNetwork: true
containers:
  - name: pod-gcu-example
    image: ubuntu:18.04
    imagePullPolicy: IfNotPresent
    command: [ "sleep" ]
    args: [ "100000" ]
...............................

9.3. 应用示例

利用一个两节点单master集群进行实验:

假设AAAA的卡所在node 1,按照以上步骤打上标签enflame.com/gcu.product=AAAA

假设BBBB的卡所在node 2,按照以上步骤打上标签enflame.com/gcu.product=BBBB

当values为BBBB时,通过kubectl get po -A -o wide可以看到,pod准确落在node2。

当values为AAAA时,通过kubectl get po -A -o wide可以看到,pod准确落在node1。

10. 常见问题

1)如何获取更多的文档?

可以联系客户支持相关部门获取。