部署 Kubernetes#

在所有必需的公有云实例部署和配置为通用用途后,环境已准备好进行 K8s 部署。在混合环境中,用于部署本地 K8s 的相同工具也用于在公有云中部署 K8s。

  1. 以 root 用户身份在 Head 节点上运行 cm-kubernetes-setup CLI 向导。

    cm-kubernetes-setup
    
  2. 选择 部署 以开始部署,然后选择 确定

    _images/deploy-kubernetes-01.png
  3. 选择 Kubernetes v1.21,然后选择 确定

    _images/deploy-kubernetes-02.png

    选择 K8s 版本 1.21 是为了与本地 DGX BasePOD 部署中部署的版本相匹配。

  4. 选择 Containerd(默认应已选中),然后选择 确定

    _images/deploy-kubernetes-03.png
  5. (可选)提供注册表镜像,然后选择 确定

    此示例部署不需要镜像。

    _images/deploy-kubernetes-04.png
  6. 配置 K8s 集群的基本值,然后选择 确定

    _images/deploy-kubernetes-05.png

    选择易于理解 K8s 部署正在使用公有云资源的名称。此外,确保服务和 Pod 网络子网不与集群中现有的子网重叠。

  7. 选择“是”以将 K8s API 服务器暴露给外部网络,然后选择 确定

    _images/deploy-kubernetes-06.png

    这允许用户从 Head 节点使用 K8s 集群。

  8. 为基于公有云的 K8s 环境选择 vpc-us-west-2-private,然后选择 确定

    _images/deploy-kubernetes-07.png

    这使内部 K8s 流量完全保留在公有云中。

  9. 选择三个 k8s-cloud-master 节点,然后选择 确定

    _images/deploy-kubernetes-08.png
  10. 为 Worker 节点类别选择 k8s-cloud-gpu-worker,然后选择 确定

    _images/deploy-kubernetes-09.png
  11. 选择 确定,无需配置任何单独的 K8s 节点。

    _images/deploy-kubernetes-10.png
  12. Etcd 节点选择三个 knode 系统,然后选择 确定

    _images/deploy-kubernetes-11.png
  13. 配置 K8s 主要组件,然后选择 确定

    _images/deploy-kubernetes-12.png

    除非环境需要不同的值,否则在此处使用默认端口和路径。此部署中使用了默认值。

  14. 选择 Calico 网络插件,然后选择 确定

    _images/deploy-kubernetes-13.png
  15. 选择“是”以安装 Kyverno 策略引擎,然后选择 确定

    _images/deploy-kubernetes-14.png
  16. 选择“否”以拒绝为 Kyverno 配置 HA,然后选择 确定

    此部署不满足 Kyverno HA 的最低节点要求。

    _images/deploy-kubernetes-15.png
  17. 选择是否安装 Kyverno 策略,然后选择 确定

    除非配置需要,否则选择

    _images/deploy-kubernetes-16.png
  18. 选择要安装的 Operator 包,然后选择 确定

    _images/deploy-kubernetes-17.png

    如屏幕截图所示,选择 NVIDIA GPU OperatorPrometheus AdapterPrometheus Adapter Stackcm-jupyter-kernel-operator

  19. 选择相同的四个 Operator 以使用默认值进行汇总,然后选择 确定

    _images/deploy-kubernetes-18.png
  20. 选择要部署的插件,然后选择 确定

    _images/deploy-kubernetes-19.png

    如屏幕截图所示,选择 Ingress Controller (Nginx)Kubernetes DashboardKubernetes Metrics ServerKubernetes State Metrics

  21. 选择集群的 Ingress 端口,然后选择 确定

    除非需要特定的 Ingress 端口,否则使用默认值。

    _images/deploy-kubernetes-20.png
  22. 当被询问是否安装 Bright NVIDIA 包时,选择 ,然后选择 确定

    _images/deploy-kubernetes-21.png

    由于 K8s 控制平面节点没有 GPU,因此 GPU Operator 管理 NVIDIA OS 组件。

  23. 选择“是”以部署 Permission Manager,然后选择 确定

    _images/deploy-kubernetes-22.png
  24. 选择 确定,无需配置任何可选值。

    _images/deploy-kubernetes-23.png
  25. 为本地路径存储类同时选择 enableddefault,然后选择 确定

    _images/deploy-kubernetes-24.png
  26. 选择 确定,无需更改任何默认值。

    _images/deploy-kubernetes-25.png
  27. 选择 保存配置 & 部署,然后选择 确定

    _images/deploy-kubernetes-26.png
  28. 将文件路径更改为 /root/cm-kubernetes-setup-cloud.conf,然后选择 确定

    _images/deploy-kubernetes-01.png

    更改文件路径是为了避免与初始本地部署中现有的 K8s 配置文件发生名称冲突。等待安装完成。

  29. 验证 K8s 集群是否正确安装。

    如果已加载本地部署的 K8s 模块,则可能需要卸载该模块,或者使用 switch 命令作为快捷方式来卸载本地模块并加载公有云模块。

    1module load kubernetes/aws-cloud/
    2kubectl cluster-info
    3Kubernetes control plane is running at https://127.0.0.1:10443
    4CoreDNS is running at https://127.0.0.1:10443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    5
    6To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
    
    1kubectl get nodes
    2NAME                    STATUS   ROLES                  AGE     VERSION
    3us-west-2-gpu-node001   Ready    worker                 6m48s   v1.21.4
    4us-west-2-knode001      Ready    control-plane,master   6m48s   v1.21.4
    5us-west-2-knode002      Ready    control-plane,master   6m48s   v1.21.4
    6us-west-2-knode003      Ready    control-plane,master   6m48s   v1.21.4
    
  30. 验证 GPU 作业是否可以在 K8s 集群上运行。

    1. 将以下文本保存到名为 gpu.yaml 的文件中。

       1apiVersion: v1
       2kind: Pod
       3metadata:
       4  name: gpu-pod-pytorch
       5spec:
       6  restartPolicy: Never
       7  containers:
       8    - name: pytorch-container
       9      image: nvcr.io/nvidia/pytorch:22.08-py3
      10      command:
      11        - nvidia-smi
      12      resources:
      13        limits:
      14          nvidia.com/gpu: 1
      
    2. 使用 kubectl apply 执行代码。

      kubectl apply -f gpu.yaml
      
    3. 使用 kubectl logs 检查结果。

      输出应如下所示。

       1kubectl logs gpu-pod-pytorch
       2Tue Feb 14 22:25:53 2023
       3+-----------------------------------------------------------------------------+
       4| NVIDIA-SMI 525.85.12    Driver Version: 525.85.12    CUDA Version: 12.0     |
       5|-------------------------------+----------------------+----------------------+
       6| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
       7| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
       8|                               |                      |               MIG M. |
       9|===============================+======================+======================|
      10|   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
      11| N/A   28C    P8    14W /  70W |      2MiB / 15360MiB |      0%      Default |
      12|                               |                      |                  N/A |
      13+-------------------------------+----------------------+----------------------+
      14
      15+-----------------------------------------------------------------------------+
      16| Processes:                                                                  |
      17|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
      18|        ID   ID                                                   Usage      |
      19|=============================================================================|
      20|  No running processes found                                                 |
      21+-----------------------------------------------------------------------------+