在 Kubernetes 上运行#
在 2.0 版本中添加。
安装 Docker#
首先,您需要设置存储库。
使用以下命令更新 apt 软件包索引
sudo apt-get update
安装软件包以允许 apt 通过 HTTPS 使用存储库
1sudo apt-get install -y \
2 apt-transport-https \
3 ca-certificates \
4 curl \
5 gnupg-agent \
6 software-properties-common
接下来,您需要使用以下命令添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
通过搜索指纹的后 8 个字符,验证您现在是否拥有指纹为 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 的密钥
1sudo apt-key fingerprint 0EBFCD88
2
3pub rsa4096 2017-02-22 [SCEA]
4 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
5uid [ unknown] Docker Release (CE deb) <docker@docker.com>
6sub rsa4096 2017-02-22 [S]
使用以下命令设置稳定存储库
1sudo add-apt-repository \
2"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
3$(lsb_release -cs) \
4stable"
安装 Docker Engine - Community 更新 apt 软件包索引
sudo apt-get update
安装 Docker Engine
请参阅 Install Docker Engine on Ubuntu | Docker Documentation 以获取 Ubuntu 的当前安装步骤。
通过运行 hello-world 镜像,验证 Docker Engine - Community 是否已正确安装
sudo docker run hello-world
有关如何安装 Docker 的更多信息,请参阅 安装 Docker 部分。
安装 Kubernetes#
在开始安装之前,请确保 Docker 已启动并启用
sudo systemctl start docker && sudo systemctl enable docker
执行以下命令以添加 apt 密钥
1sudo apt-get update && sudo apt-get install -y apt-transport-https curl
2curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
3sudo mkdir -p /etc/apt/sources.list.d/
创建 kubernetes.list
1cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
2deb https://apt.kubernetes.io/ kubernetes-xenial main
3EOF
现在执行以下命令以安装 kubelet、kubeadm 和 kubectl
1sudo apt-get update
2sudo apt-get install -y -q kubelet=1.21.1-00 kubectl=1.21.1-00 kubeadm=1.21.1-00
3sudo apt-mark hold kubelet kubeadm kubectl
重新加载系统守护程序
sudo systemctl daemon-reload
禁用 swap#
1sudo swapoff -a
2sudo nano /etc/fstab
注意
在所有以 /swap 开头的行前添加 #。# 是注释,结果应如下所示
1UUID=e879fda9-4306-4b5b-8512-bba726093f1d / ext4 defaults 0 0
2UUID=DCD4-535C /boot/efi vfat defaults 0 0
3#/swap.img none swap sw 0 0
初始化 Kubernetes 集群以作为控制平面节点运行#
执行以下命令
sudo kubeadm init --pod-network-cidr=192.168.0.0/16
输出
1Your Kubernetes control-plane has initialized successfully!
2
3To start using your cluster, you need to run the following as a regular user:
4
5 mkdir -p $HOME/.kube
6 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
7 sudo chown $(id -u):$(id -g) $HOME/.kube/config
8
9Alternatively, if you are the root user, you can run:
10
11 export KUBECONFIG=/etc/kubernetes/admin.conf
12
13You should now deploy a pod network to the cluster.
14Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
15http://kubernetes.ac.cn/docs/concepts/cluster-administration/addons/
16
17Then you can join any number of worker nodes by running the following on each as root:
18
19kubeadm join <your-host-IP>:6443 --token 489oi5.sm34l9uh7dk4z6cm \
20 --discovery-token-ca-cert-hash sha256:17165b6c4a4b95d73a3a2a83749a957a10161ae34d2dfd02cd730597579b4b34
按照输出中的说明,执行如下所示的命令
1mkdir -p $HOME/.kube
2sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
3sudo chown $(id -u):$(id -g) $HOME/.kube/config
使用以下命令,您将 pod 网络附加组件安装到控制平面节点。我们在此处使用 calico 作为 pod 网络附加组件
kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
您可以执行以下命令以确保所有 pod 都已启动并正在运行
kubectl get pods --all-namespaces
输出
1NAMESPACE NAME READY STATUS RESTARTS AGE
2kube-system calico-kube-controllers-65b8787765-bjc8h 1/1 Running 0 2m8s
3kube-system calico-node-c2tmk 1/1 Running 0 2m8s
4kube-system coredns-5c98db65d4-d4kgh 1/1 Running 0 9m8s
5kube-system coredns-5c98db65d4-h6x8m 1/1 Running 0 9m8s
6kube-system etcd-#yourhost 1/1 Running 0 8m25s
7kube-system kube-apiserver-#yourhost 1/1 Running 0 8m7s
8kube-system kube-controller-manager-#yourhost 1/1 Running 0 8m3s
9kube-system kube-proxy-6sh42 1/1 Running 0 9m7s
10kube-system kube-scheduler-#yourhost 1/1 Running 0 8m26s
get nodes 命令显示控制平面节点已启动并就绪
kubectl get nodes
输出
1NAME STATUS ROLES AGE VERSION
2#yourhost Ready control-plane,master 10m v1.21.1
由于我们使用的是单节点 Kubernetes 集群,因此默认情况下集群不会在控制平面节点上调度 pod。要在控制平面节点上调度 pod,我们必须通过执行以下命令来删除污点
kubectl taint nodes --all node-role.kubernetes.io/master-
有关更多信息,请参阅 http://kubernetes.ac.cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/。
安装 Helm#
执行以下命令下载并安装 Helm 3.5.4
1wget https://get.helm.sh/helm-v3.5.4-linux-amd64.tar.gz
2tar -zxvf helm-v3.5.4-linux-amd64.tar.gz
3sudo mv linux-amd64/helm /usr/local/bin/helm
4rm -rf helm-v3.5.4-linux-amd64.tar.gz linux-amd64/
有关更多信息,请参阅 helm/helm 和 http://helm.kubernetes.ac.cn/docs/using_helm/#installing-helm。
NVIDIA 网络 Operator#
在 2.0 版本中添加。
前提条件#
注意
如果 Mellanox 网卡未连接到您的节点,请跳过此步骤并继续至 NVIDIA GPU Operator。
以下说明假定 Mellanox 网卡已连接到您的机器。
执行以下命令以验证 Mellanox 网卡是否在您的机器上启用
lspci | grep -i "Mellanox"
输出
10c:00.0 Ethernet controller: Mellanox Technologies MT2892 Family [ConnectX-6 Dx]
20c:00.1 Ethernet controller: Mellanox Technologies MT2892 Family [ConnectX-6 Dx]
执行以下命令以了解哪个 Mellanox 设备处于活动状态
注意
在后续步骤中使用显示为 Link Detected: yes
的设备。以下命令仅在您在安装操作系统之前添加网卡时才有效。
for device in `sudo lshw -class network -short | grep -i ConnectX | awk '{print $2}' | egrep -v 'Device|path' | sed '/^$/d'`;do echo -n $device; sudo ethtool $device | grep -i "Link detected"; done
输出
1ens160f0 Link detected: yes
2ens160f1 Link detected: no
创建自定义网络 Operator values.yaml
。
nano network-operator-values.yaml
从上述命令更新活动的 Mellanox 设备。
1deployCR: true
2ofedDriver:
3 deploy: true
4 nvPeerDriver:
5 deploy: true
6 rdmaSharedDevicePlugin:
7 deploy: true
8 resources:
9 - name: rdma_shared_device_a
10 vendors: [15b3]
11 devices: [ens160f0]
12operator:
13 repository: nvcr.io/nvaie
14 image: network-operator-4-0
15imagePullSecrets: [ngc-secrect]
有关自定义网络 Operator values.yaml
的更多信息,请参阅 网络 Operator。
添加 NVIDIA 存储库
注意
安装 GPU Operator 需要 安装 Helm。
helm repo add mellanox https://helm.ngc.nvidia.com/nvaie
更新 Helm 存储库
helm repo update
安装 NVIDIA 网络 Operator#
执行以下命令
1kubectl label nodes --all node-role.kubernetes.io/master- --overwrite
2helm install -f ./network-operator-values.yaml -n network-operator --create-namespace --wait network-operator nvaie/network-operator-3-0
验证网络 Operator 的状态#
请注意,网络 Operator 的安装可能需要几分钟。安装所需时间取决于您的互联网速度。
kubectl get pods --all-namespaces | egrep 'network-operator|nvidia-network-operator-resources'
1NAMESPACE NAME READY STATUS RESTARTS AGE
2network-operator network-operator-547cb8d999-mn2h9 1/1 Running 0 17m
3network-operator network-operator-node-feature-discovery-master-596fb8b7cb-qrmvv 1/1 Running 0 17m
4network-operator network-operator-node-feature-discovery-worker-qt5xt 1/1 Running 0 17m
5nvidia-network-operator-resources cni-plugins-ds-dl5vl 1/1 Running 0 17m
6nvidia-network-operator-resources kube-multus-ds-w82rv 1/1 Running 0 17m
7nvidia-network-operator-resources mofed-ubuntu20.04-ds-xfpzl 1/1 Running 0 17m
8nvidia-network-operator-resources rdma-shared-dp-ds-2hgb6 1/1 Running 0 17m
9nvidia-network-operator-resources sriov-device-plugin-ch7bz 1/1 Running 0 10m
10nvidia-network-operator-resources whereabouts-56ngr 1/1 Running 0 10m
有关更多信息,请参阅 网络 Operator 页面。
NVIDIA GPU Operator#
在 2.0 版本中添加。
NVIDIA AI Enterprise 客户可以访问 NVIDIA NGC Catalog 中预配置的 GPU Operator。GPU Operator 经过预配置,旨在简化 NVIDIA AI Enterprise 部署的配置体验。
预配置的 GPU Operator 与公共 NGC Catalog 中的 GPU Operator 不同。区别在于
它被配置为使用预构建的 vGPU 驱动程序镜像(仅 NVIDIA AI Enterprise 客户可用)。
它被配置为使用 NVIDIA 许可系统 (NLS)。
安装 GPU Operator#
注意
带有 NVIDIA AI Enterprise 的 GPU Operator 需要在安装之前完成一些任务。在运行以下命令之前,请参阅文档 NVIDIA AI Enterprise 以获取说明。
为 CLS 许可 GPU Operator#
添加 NVIDIA AI Enterprise Helm 存储库,其中 api-key
是您生成的用于访问 NVIDIA Enterprise Collection 的 NGC API 密钥。
helm repo add nvaie https://helm.ngc.nvidia.com/nvaie --username='$oauthtoken' --password=api-key && helm repo update
将 NLS 许可令牌复制到名为
client_configuration_token.tok
的文件中。使用以下命令创建空的 gridd.conf 文件。
touch gridd.conf
使用以下命令为 NLS 许可创建 Configmap。
kubectl create configmap licensing-config -n gpu-operator --from-file=./gridd.conf --from-file=./client_configuration_token.tok
创建 K8s Secret 以访问 NGC 注册表。
kubectl create secret docker-registry ngc-secret --docker-server="nvcr.io/nvaie" --docker-username='$oauthtoken' --docker-password=’<YOUR API KEY>’ --docker-email=’
使用以下命令安装 GPU Operator。
helm install --wait --generate-name nvaie/gpu-operator -n gpu-operator
为 DLS 许可 GPU Operator#
添加 NVIDIA AI Enterprise Helm 存储库,其中 api-key
是您生成的用于访问 NVIDIA Enterprise Collection 的 NGC API 密钥。
helm repo add nvidia https://nvidia.github.io/gpu-operator \ && helm repo update
在 GPU Operator v1.9 之前,operator 安装在 default
命名空间中,而所有 operands 都安装在 gpu-operator-resources
命名空间中。
从 GPU Operator v1.9 开始,operator 和 operands 都安装在同一命名空间中。命名空间是可配置的,并在安装期间确定。例如,要在 gpu-operator
命名空间中安装 GPU Operator。
1helm install --wait --generate-name \ 2 -n gpu-operator --create-namespace 3 nvidia/gpu-operator
如果在安装期间未指定命名空间,则所有 GPU Operator 组件都将安装在 default
命名空间中。
带有 RDMA 的 GPU Operator(可选)#
前提条件#
请安装 NVIDIA 网络 Operator 以确保已安装 MOFED 驱动程序。
在 NVIDIA 网络 Operator 安装完成后,执行以下命令安装 GPU Operator 以加载 nv_peer_mem 模块。
helm install --wait gpu-operator nvaie/gpu-operator -n gpu-operator --set driver.rdma.enabled=true
使用 GPUDirect RDMA 验证网络 Operator#
执行以下命令以列出 Mellanox 网卡及其状态
kubectl exec -it $(kubectl get pods -n nvidia-network-operator-resources | grep mofed | awk '{print $1}') -n nvidia-network-operator-resources -- ibdev2netdev
输出
1mlx5_0 port 1 ==> ens192f0 (Up)
2mlx5_1 port 1 ==> ens192f1 (Down)
编辑 networkdefinition.yaml
。
1nano networkdefinition.yaml
为 IPAM 创建网络定义,并将 ens192f0
替换为 master
的活动 Mellanox 设备。
1apiVersion: k8s.cni.cncf.io/v1
2kind: NetworkAttachmentDefinition
3metadata:
4annotations:
5 k8s.v1.cni.cncf.io/resourceName: rdma/rdma_shared_device_a
6name: rdma-net-ipam
7namespace: default
8spec:
9config: |-
10 {
11 "cniVersion": "0.3.1",
12 "name": "rdma-net-ipam",
13 "plugins": [
14 {
15 "ipam": {
16 "datastore": "kubernetes",
17 "kubernetes": {
18 "kubeconfig": "/etc/cni/net.d/whereabouts.d/whereabouts.kubeconfig"
19 },
20 "log_file": "/tmp/whereabouts.log",
21 "log_level": "debug",
22 "range": "192.168.111.0/24",
23 "type": "whereabouts"
24 },
25 "type": "macvlan",
26 "master": "ens192f0",
27 "vlan": 111
28 },
29 {
30 "mtu": 1500,
31 "type": "tuning"
32 }
33 ]
34 }
35EOF
注意
如果您在高性能端没有基于 VLAN 的网络,请将“vlan”设置为 0
验证 GPU Operator 的状态#
请注意,GPU Operator 的安装可能需要几分钟。安装所需时间取决于您的互联网速度。
kubectl get pods --all-namespaces | grep -v kube-system
结果
1NAMESPACE NAME READY STATUS RESTARTS AGE
2default gpu-operator-1622656274-node-feature-discovery-master-5cddq96gq 1/1 Running 0 2m39s
3default gpu-operator-1622656274-node-feature-discovery-worker-wr88v 1/1 Running 0 2m39s
4default gpu-operator-7db468cfdf-mdrdp 1/1 Running 0 2m39s
5gpu-operator-resources gpu-feature-discovery-g425f 1/1 Running 0 2m20s
6gpu-operator-resources nvidia-container-toolkit-daemonset-mcmxj 1/1 Running 0 2m20s
7gpu-operator-resources nvidia-cuda-validator-s6x2p 0/1 Completed 0 48s
8gpu-operator-resources nvidia-dcgm-exporter-wtxnx 1/1 Running 0 2m20s
9gpu-operator-resources nvidia-dcgm-jbz94 1/1 Running 0 2m20s
10gpu-operator-resources nvidia-device-plugin-daemonset-hzzdt 1/1 Running 0 2m20s
11gpu-operator-resources nvidia-device-plugin-validator-9nkxq 0/1 Completed 0 17s
12gpu-operator-resources nvidia-driver-daemonset-kt8g5 1/1 Running 0 2m20s
13gpu-operator-resources nvidia-operator-validator-cw4j5 1/1 Running 0 2m20s
有关更多信息,请参阅 NGC 上的 GPU Operator 页面。