升级 NVIDIA GPU Operator#

先决条件#

  • 如果您的集群使用 Pod Security Admission (PSA) 来限制 Pod 的行为,请标记 Operator 的命名空间,将强制执行策略设置为特权

    $ kubectl label --overwrite ns gpu-operator pod-security.kubernetes.io/enforce=privileged
    

使用 Helm#

GPU Operator 支持对现有资源进行动态更新。此功能使 GPU Operator 能够确保始终应用和更新集群策略规范中的设置。

由于 Helm 不支持自动升级现有 CRD,您可以手动升级 GPU Operator Chart,或通过启用 Helm Hook 来升级。

选项 1:手动升级 CRD#

flowchart LR A["从最新 Chart 更新 CRD"] --> B["使用 Helm 升级"]

通过此过程,所有现有的 GPU Operator 资源都将内联更新,并且集群策略资源将使用 values.yaml 中的更新进行修补。

  1. 在环境变量中指定 Operator 发布标签

    $ export RELEASE_TAG=v23.9.0
    
  2. 应用集群策略和 NVIDIA 驱动程序的自定义资源定义

    $ kubectl apply -f \
        https://gitlab.com/nvidia/kubernetes/gpu-operator/-/raw/$RELEASE_TAG/deployments/gpu-operator/crds/nvidia.com_clusterpolicies_crd.yaml
    
    $ kubectl apply -f \
        https://gitlab.com/nvidia/kubernetes/gpu-operator/-/raw/$RELEASE_TAG/deployments/gpu-operator/crds/nvidia.com_nvidiadrivers.yaml
    

    示例输出

    customresourcedefinition.apiextensions.k8s.io/clusterpolicies.nvidia.com configured
    customresourcedefinition.apiextensions.k8s.io/nvidiadrivers.nvidia.com created
    
  3. 应用节点功能发现的自定义资源定义

    $ kubectl apply -f \
        https://gitlab.com/nvidia/kubernetes/gpu-operator/-/raw/$RELEASE_TAG/deployments/gpu-operator/charts/node-feature-discovery/crds/nfd-api-crds.yaml
    

    示例输出

    customresourcedefinition.apiextensions.k8s.io/nodefeaturerules.nfd.k8s-sigs.io configured
    
  4. 更新有关 Operator Chart 的信息

    $ helm repo update nvidia
    

    示例输出

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "nvidia" chart repository
    Update Complete. ⎈Happy Helming!⎈
    
  5. 从 Chart 中获取值

    $ helm show values nvidia/gpu-operator --version=$RELEASE_TAG > values-$RELEASE_TAG.yaml
    
  6. 根据需要更新 values 文件。

  7. 升级 Operator

    $ helm upgrade gpu-operator nvidia/gpu-operator -n gpu-operator -f values-$RELEASE_TAG.yaml
    

    示例输出

    Release "gpu-operator" has been upgraded. Happy Helming!
    NAME: gpu-operator
    LAST DEPLOYED: Thu Apr 20 15:05:52 2023
    NAMESPACE: gpu-operator
    STATUS: deployed
    REVISION: 2
    TEST SUITE: None
    

选项 2:使用 Helm Hook 自动升级 CRD#

从 GPU Operator v22.09 开始,pre-upgrade Helm Hook 可以自动升级到最新的 CRD。

从 GPU Operator v24.9.0 开始,升级 CRD Helm Hook 默认启用,并在您使用 Helm 升级时运行升级 CRD 作业。

  1. 在环境变量中指定 Operator 发布标签

    $ export RELEASE_TAG=v23.9.0
    
  2. 更新有关 Operator Chart 的信息

    $ helm repo update nvidia
    

    示例输出

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "nvidia" chart repository
    Update Complete. ⎈Happy Helming!⎈
    
  3. 从 Chart 中获取值

    $ helm show values nvidia/gpu-operator --version=$RELEASE_TAG > values-$RELEASE_TAG.yaml
    
  4. 根据需要更新 values 文件。

  5. 升级 Operator

    $ helm upgrade gpu-operator nvidia/gpu-operator -n gpu-operator \
        --disable-openapi-validation -f values-$RELEASE_TAG.yaml
    

    注意

    • 在这种情况下,需要选项 --disable-openapi-validation,以便 Helm 不会尝试根据旧 CRD 验证来自新 Chart 的 CR 实例是否有效。由于 Chart 中的 CR 实例对于升级后的 CRD 有效,因此这将是兼容的。

    • 与 GPU Operator 一起使用的 Helm Hook 使用 Operator 镜像本身。如果 Operator 镜像本身无法成功拉取(由于网络错误或 NVAIE 情况下的无效 NGC 注册表密钥),Hook 将会失败。在这种情况下,需要使用 --no-hooks 选项删除 Chart,以避免删除操作因 Hook 失败而挂起。

集群策略更新#

GPU Operator 还支持使用 kubectlClusterPolicy CustomResource 进行动态更新

$ kubectl edit clusterpolicy

完成编辑后,Kubernetes 将自动将更新应用于集群。

驱动程序升级的其他控制#

虽然大多数 GPU Operator 管理的 DaemonSet 可以无缝升级,但 NVIDIA 驱动程序 DaemonSet 有特殊的注意事项。有关更多信息,请参阅 GPU 驱动程序升级

在 OpenShift 中使用 OLM#

有关在 OpenShift 中运行时升级 GPU Operator 的信息,请参阅有关升级已安装 Operator 的官方文档:http://docs.openshift.org.cn/container-platform/4.8/operators/admin/olm-upgrading-operators.html