升级或卸载 Azure Managed Lustre CSI 驱动程序

本文介绍如何将现有 Azure Lustre CSI 驱动程序安装升级到 v0.6.0 或卸载驱动程序。 有关新安装,请参阅安装 Azure Managed Lustre CSI 驱动程序。

升级 CSI 驱动程序

若要将早期版本(v0.2.0 或更高版本)升级到 v0.6.0,请在维护时段卸载现有驱动程序并安装 v0.6.0。 此过程还支持从脚本切换到 Helm。 如果群集运行的版本早于 v0.2.0,请在升级之前联系Azure支持部门。

Important

在升级之前,请停止使用 Lustre 的每个工作负荷,并确认节点上没有 Lustre 装载。 当 Lustre 装载处于活动状态时,不能替换 Lustre 客户端内核模块。 只有到那时才卸载现有驱动程序。 卸载驱动程序不会删除现有挂载点。 在安装并验证替换驱动程序之前,使工作负荷保持停止。

仅当工作负荷的控制器保留 PersistentVolumeClaims 时,停止工作负荷才会保留存储。 在缩减 StatefulSet 之前,请完成 保护 StatefulSet 持久卷声明。 一个 StatefulSet 在缩减期间可以通过 whenScaled: Delete 删除其模板创建的持久卷声明;使用 reclaimPolicy: Delete 动态预配的 PV 时,该删除还可能会删除远程 Azure Managed Lustre 文件系统及其数据。 请勿在驱动程序升级过程中删除 PVS、PVC 或文件系统。

准备升级

在本文中的每个 kube-system 命令中使用现有的驱动程序命名空间。 对于 Helm 命令,还可以用现有发布名称替换 azurelustre。

  1. 检查每个节点的有效 OS SKU:

    kubectl get nodes -L kubernetes.azure.com/os-sku-effective
    

    要在其中运行 Azure Managed Lustre 工作负荷的节点池中的所有节点都必须报告 Ubuntu2204、Ubuntu2404 或 。 确认群集还满足 Kubernetes 和体系结构要求。 如果所需的节点缺少或不受支持的值,请不要继续。 AKS 管理此标签。 请勿手动更改。

  2. 确认安装先决条件,包括cluster-admin权限、网络访问和节点调度。

  3. 对于使用自定义值的 Helm 安装,请在卸载之前导出它们,并保留用于重新安装的文件:

    helm get values azurelustre --namespace kube-system --output yaml > azurelustre-values.yaml
    

    在重用这些值之前,请检查导出的值是否与 v0.6.0 图表兼容。 除非Azure支持指示你,否则不要替代已发布的驱动程序映像或 Lustre 客户端版本。

  4. 列出使用 Azure Lustre CSI 驱动程序的 PersistentVolumes:

    printf 'PV\tCLAIM\tSTATUS\tDELETING\n'
    kubectl get pv -o jsonpath='{range .items[?(@.spec.csi.driver=="azurelustre.csi.azure.com")]}{.metadata.name}{"\t"}{.spec.claimRef.namespace}{"/"}{.spec.claimRef.name}{"\t"}{.status.phase}{"\t"}{.metadata.deletionTimestamp}{"\n"}{end}'
    

    使用声明引用来统计每个已绑定的 Azure Lustre 声明,即使其 StorageClass 已不存在。

  5. 列出使用 Azure Lustre CSI 驱动程序的存储类:

    kubectl get storageclass -o jsonpath='{range .items[?(@.provisioner=="azurelustre.csi.azure.com")]}{.metadata.name}{"\n"}{end}'
    
  6. 列出所有 PersistentVolumeClaims 并使用前面的存储类列表来标识未绑定Azure Lustre 声明:

    kubectl get pvc --all-namespaces -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,STORAGECLASS:.spec.storageClassName,STATUS:.status.phase,VOLUME:.spec.volumeName,DELETING:.metadata.deletionTimestamp'
    

    将所有 Azure Lustre 声明统计在内,包括状态为 Pending 的声明。 如果 Azure Lustre PV 或 PVC 已设置删除时间戳,或者 Azure Lustre 卷正在创建或删除过程中,请不要继续。

  7. 列出 Pod 及其引用的 PersistentVolumeClaims:

    kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{range .spec.volumes[?(@.persistentVolumeClaim)]}{.persistentVolumeClaim.claimName}{" "}{end}{"\n"}{end}'
    

保护 StatefulSet 卷声明

在缩减或删除任何应用程序工作负荷之前完成这些检查。 请参阅 StatefulSet PersistentVolumeClaim 保留,了解保留和垃圾回收行为。

  1. 标识用于管理清单中的任何 Azure Lustre 声明(包括由 volumeClaimTemplates 创建的声明)的 StatefulSet。 检查其所需的副本计数和声明保留策略:

    kubectl get statefulsets --all-namespaces -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,REPLICAS:.spec.replicas,WHEN-SCALED:.spec.persistentVolumeClaimRetentionPolicy.whenScaled,WHEN-DELETED:.spec.persistentVolumeClaimRetentionPolicy.whenDeleted'
    

    未设置的保留字段默认为 Retain。 whenScaled: Delete 删除副本时删除模板创建的声明;whenDeleted: Delete 在 StatefulSet 被删除时删除模板创建的声明。

  2. 记录每个受影响的 StatefulSet 的原始副本计数和保留策略。 更新或暂停 Operator、自动缩放器和 GitOps 自动化,以便它们无法在维护期间缩减或删除这些工作负载,或还原保留策略。 使 Kubernetes StatefulSet 控制器和 CSI 驱动程序保持运行。

  3. 对于具有 Delete 保留设置的每个受影响的 StatefulSet,请在维护窗口期间将 whenScaled 和 whenDeleted 均设置为 Retain。 如果某个操作员或 GitOps 过程管理该资源,请在其源配置中进行更改。 对于直接托管的 StatefulSet,请使用:

    kubectl patch statefulset <statefulset-name> -n <namespace> \
      --type=merge \
      -p '{"spec":{"persistentVolumeClaimRetentionPolicy":{"whenScaled":"Retain","whenDeleted":"Retain"}}}'
    

    在继续操作之前,请读取 StatefulSet 以确认有效策略:

    kubectl get statefulset <statefulset-name> -n <namespace> -o yaml
    
  4. 等待 StatefulSet 控制器使每个受影响的模板创建的 PVC 上的策略达到一致。 检查每个声明项:

    kubectl get pvc <claim-name> -n <namespace> -o yaml
    

    在每个 PVC 都没有删除时间戳,且其 metadata.ownerReferences 中不再包含 StatefulSet 或其任何 Pod 之前,请勿继续。 仅成功的策略补丁并不能证明这些引用已核对一致。 请勿手动删除所有者引用或终结器以绕过此检查。

  5. 在停止工作负荷之前重复 PV 和 PVC 清单检查。 如果声明缺失、PV 或 PVC 具有删除时间戳、保留策略发生回退,或无法验证声明是否会被保留,请不要继续。 首先与工作负载或群集管理员一起解决该情况。

停止工作负载并检查挂载点

  1. 在停止工作负荷之前,请使用 kubectl get pods --all-namespaces -o wide 记录其节点。

  2. 验证声明保留状态后,停止使用 Azure Managed Lustre 声明资源的每个应用程序工作负载。 将其部署或受保护的 StatefulSet 缩放到零副本,暂停其计划作业,并暂停重新创建其 Pod 的任何部署或 GitOps 进程。 请勿将删除 StatefulSets 作为快速关停的捷径。 删除独立应用程序 Pod,包括预配示例 Pod。 使 CSI 驱动程序保持运行状态,直到确认没有 Lustre 装载仍然存在。

  3. 从 准备升级中重新运行 Pod 和声明清单查询。 如果列出了引用 Azure Managed Lustre 声明的 Pod(包括处于 Terminating 状态的 Pod),请勿继续。

  4. 列出 CSI 节点 Pod:

    kubectl get pods -n kube-system -l app=csi-azurelustre-node -o wide
    

    将 NODE 列与已停止的工作负荷使用的节点进行比较。 除非每个此类节点都有一个 CSI 节点 Pod,且该 Pod 处于 Running 状态,您可以检查其是否有剩余挂载,否则请不要继续。

  5. 检查每个 CSI 节点 Pod 是否仍有残留的 Lustre 挂载:

    (
      set -e
      pods=$(kubectl get pods -n kube-system -l app=csi-azurelustre-node -o name)
      if [ -z "$pods" ]; then
        echo "No Azure Lustre CSI node pods found." >&2
        exit 1
      fi
      for pod in $pods; do
        echo "$pod"
        kubectl exec -n kube-system "$pod" -c azurelustre -- \
          sh -c 'grep " - lustre " /proc/self/mountinfo; status=$?; [ "$status" -eq 1 ]'
      done
      echo "No Lustre mounts remain on the inspected nodes."
    )
    

    该命令显示每个 CSI 节点 Pod,然后在成功时打印 No Lustre mounts remain on the inspected nodes.。 如果发现 Lustre 挂载或无法检查 Pod,它将报错退出。 如果命令失败,请不要继续。

安装 v0.6.0

首先完成准备工作并进行卸除挂载检查。 在验证完成之前,请使 Azure Managed Lustre 工作负载保持停止状态。

  1. 使用针对 Helm 发布的 Helm 卸载过程,或针对脚本管理安装的 脚本卸载过程,删除现有驱动程序。 将 PVS、PVC 和文件系统保留到位。

  2. 在安装替换项之前,确认这两个列表均为空:

    kubectl get pods -n kube-system -l app=csi-azurelustre-node
    kubectl get pods -n kube-system -l app=csi-azurelustre-controller
    
  3. 按照 安装驱动程序 中的说明安装 v0.6.0。 对于 Helm 重新安装,请使用相同的发布名称和命名空间,如果您已导出自定义值,请添加 --values azurelustre-values.yaml。

  4. 在重启工作负载之前,先完成验证升级。 如果安装过程提示超时,请使用这些检查来确定其状态,然后再重试。

验证升级

  1. 完成 安装检查。

  2. 检查每个 CSI 节点 Pod 上加载的 Lustre 内核模块版本:

    (
      set -e
      pods=$(kubectl get pods -n kube-system -l app=csi-azurelustre-node -o name)
      if [ -z "$pods" ]; then
        echo "No Azure Lustre CSI node pods found." >&2
        exit 1
      fi
      for pod in $pods; do
        echo "$pod"
        kubectl exec -n kube-system "$pod" -c lustre-loader -- \
          cat /sys/module/lustre/version
      done
    )
    

    将加载的版本与 兼容性表中节点 OS 的预期 Lustre 客户端版本进行比较。

重启工作负荷

在验证完成之前,请使 Azure Managed Lustre 工作负载保持停止状态。 然后重启它们并确认代表性工作负荷的正常文件操作成功。 可以使用以下方式检查其挂载:

kubectl exec -n <namespace> <pod-name> -- df -h <mount-path>

将 StatefulSet 还原到其预期副本数,并验证它们是否重复使用原始持久卷声明(PVC)和文件系统。 只有在工作负载按这些副本计数运行并且其挂载已经过验证后,才能还原任何记录的保留策略并恢复自动化。 当 StatefulSet 仍处于缩容状态进行维护时,请勿还原 Delete 策略。

从不成功的升级中恢复

Important

在从失败的升级中恢复期间,使 Azure Managed Lustre 工作负载保持停止状态。 不要安装任意较旧的驱动程序版本,因为它可能不支持群集中的节点操作系统、内核或 Lustre 客户端版本。

使用 v0.6.0 故障排除指南 和 v0.6.0 错误参考 排除该故障,然后再次执行 验证升级。 如果无法完成安装或确认现有 Lustre 装载已消失,请在删除更多资源之前联系Azure支持部门。

卸载驱动

在缩减 StatefulSet 之前,请完成 保护 StatefulSet 的持久卷声明。 停止所有使用 Lustre 的工作负载,并在卸载驱动程序之前确认不存在任何 Lustre 挂载。 在 准备升级 中使用工作负载和挂载检查。 卸载驱动程序不会删除现有挂载点。

卸载 Helm 托管的驱动程序

使用安装中的发布名称和命名空间:

helm uninstall azurelustre --namespace kube-system --wait --timeout 30m

Helm 会删除发布版本中的资源。 它不会删除 PV、PVC 或Azure Managed Lustre文件系统。

卸载脚本管理的驱动程序

使用 v0.6.0 清理脚本删除脚本管理的 v0.2.0 或更高版本安装,包括旧版驱动程序资源。 从本地 v0.6.0 签出运行它:

git clone --branch v0.6.0 --depth 1 https://github.com/kubernetes-sigs/azurelustre-csi-driver.git
cd azurelustre-csi-driver
./deploy/uninstall-driver.sh

该脚本删除 CSI 控制器、节点守护程序集、 CSIDriver 对象和 RBAC 资源。 它不会删除 PersistentVolumes、PersistentVolumeClaims 或Azure Managed Lustre文件系统。