O plug-in FlexVolume foi descontinuado e não tem mais suporte em novos clusters do Container Service for Kubernetes (ACK). Migre seus volumes persistentes (PVs) e solicitações de volume persistente (PVCs) do File Storage NAS (NAS), provisionados estaticamente, do FlexVolume para a Container Storage Interface (CSI) para manter o suporte ao plug-in e acessar novos recursos de armazenamento.
Se o cluster também tiver volumes de disco gerenciados pelo FlexVolume, use o csi-compatible-controller.
Impactos
A migração recria os PVCs, o que causa a reinicialização dos pods.
A reinicialização dos pods interrompe as cargas de trabalho em execução. Execute a migração fora dos horários de pico.
Comparação entre FlexVolume e CSI
|
Atributo |
CSI |
FlexVolume |
|
Componentes |
CSI-Provisioner (Deployment): criação automática de volumes e snapshots, armazenamento CNFS e restauração de dados após exclusão acidental. CSI-Plugin (DaemonSet): montagem e desmontagem automática de volumes. Suporta volumes de disco, NAS e OSS por padrão. |
Disk-Controller (Deployment): criação automática de volumes. FlexVolume (DaemonSet): montagem e desmontagem de volumes. Suporta volumes de disco, NAS e OSS por padrão. |
|
Parâmetro do kubelet |
Defina |
Defina |
|
Referências |
Pré-requisitos
Instale o plug-in CSI no cluster antes de começar.
-
Crie os arquivos
csi-plugin.yamlecsi-provisioner.yaml. -
Implante o csi-plugin e o csi-provisioner no cluster:
kubectl apply -f csi-plugin.yaml -f csi-provisioner.yaml -
Verifique se o CSI está em execução. Saída esperada: Se todos os pods exibirem
Running, o CSI estará instalado.kubectl get pods -nkube-system | grep csicsi-plugin-577mm 4/4 Running 0 3d20h csi-plugin-k9mzt 4/4 Running 0 41d csi-provisioner-6b58f46989-8wwl5 9/9 Running 0 41d csi-provisioner-6b58f46989-qzh8l 9/9 Running 0 6d20h
Procedimento
O exemplo a seguir demonstra a migração de uma carga de trabalho StatefulSet. A figura abaixo ilustra o fluxo de trabalho:

Etapa 1: Verificar o status do volume
-
Consulte o status do pod. Saída esperada:
kubectl get podNAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 11m -
Identifique o nome do PVC usado pelo pod. Saída esperada:
kubectl describe pod nas-static-1 |grep ClaimNameClaimName: nas-pvc -
Verifique o status do PVC. Saída esperada:
kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nas-pv 512Gi RWX 7m23s
Etapa 2: Criar PV e PVC gerenciados por CSI
Crie um novo PV e PVC gerenciados por CSI que apontem para o mesmo sistema de arquivos NAS. Escolha uma das opções a seguir.
Opção A: Conversão automatizada (CLI FlexVolume2CSI)
Use a CLI FlexVolume2CSI para converter as definições de PV e PVC gerenciadas pelo FlexVolume em equivalentes gerenciados por CSI. A ferramenta gera um arquivo chamado
nas-pv-pvc-csi.yaml.-
Aplique o arquivo gerado:
kubectl apply -f nas-pv-pvc-csi.yaml -
Verifique o status do PVC. Saída esperada:
kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nas-pv 512Gi RWX nas 30m nas-pvc-csi Bound nas-pv-csi 512Gi RWX nas 2s
Opção B: Conversão manual
-
Faça backup das definições existentes de PV e PVC do FlexVolume. Salve o PVC. Saída esperada: Salve o PV. Saída esperada:
kubectl get pvc nas-pvc -oyaml > nas-pvc-flexvolume.yaml cat nas-pvc-flexvolume.yamlapiVersion: v1 kind: PersistentVolumeClaim metadata: name: nas-pvc namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 512Gi selector: matchLabels: alicloud-pvname: nas-pv storageClassName: naskubectl get pv nas-pv -oyaml > nas-pv-flexvolume.yaml cat nas-pv-flexvolume.yamlapiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: nas-pv name: nas-pv spec: accessModes: - ReadWriteMany capacity: storage: 512Gi flexVolume: driver: alicloud/nas options: path: /aliyun server: ***.***.nas.aliyuncs.com vers: "3" persistentVolumeReclaimPolicy: Retain storageClassName: nas -
Crie um PV e PVC gerenciados por CSI. Crie um arquivo chamado
nas-pv-pvc-csi.yamlcom o seguinte conteúdo. Aplique o arquivo. Verifique o status do PVC. Saída esperada:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nas-pvc-csi namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 512Gi selector: matchLabels: alicloud-pvname: nas-pv-csi storageClassName: nas --- apiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: nas-pv-csi name: nas-pv-csi spec: accessModes: - ReadWriteMany capacity: storage: 512Gi csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: nas-pv-csi volumeAttributes: server: "***.***.nas.aliyuncs.com" path: "/aliyun" mountOptions: - nolock,tcp,noresvport - vers=3 persistentVolumeReclaimPolicy: Retain storageClassName: naskubectl apply -f nas-pv-pvc-csi.yamlkubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nas-pv 512Gi RWX 7m23s
Etapa 3: Atualizar a aplicação
-
Edite a configuração do StatefulSet:
kubectl edit sts nas-static -
Atualize a solicitação de volume para referenciar o PVC gerenciado por CSI:
volumes: - name: pvc-nas persistentVolumeClaim: claimName: nas-pvc-csi -
Confirme a reinicialização do pod. Saída esperada:
kubectl get podNAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 70s -
Verifique se o volume NAS está montado via CSI. Se a migração for bem-sucedida, a saída exibirá
kubernetes.io~csino caminho de montagem:kubectl exec nas-static-1 -- mount |grep nas# View the mount information ***.***.nas.aliyuncs.com:/aliyun on /var/lib/kubelet/pods/ac02ea3f-125f-4b38-9bcf-9b117f62***/volumes/kubernetes.io~csi/nas-pv-csi/mount type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.XX.XX,mountvers=3,mountport=2049,mountproto=tcp,local_lock=all,addr=192.168.XX.XX)
Etapa 4: Desinstalar o FlexVolume
-
Acesse o console do OpenAPI Explorer e chame a operação UnInstallClusterAddons para desinstalar o plug-in FlexVolume. Para mais informações, consulte Desinstalar componentes de um cluster.
ClusterId: ID do cluster. Encontre-o na aba Basic Information da página de detalhes do cluster.
name: Defina como
flexvolume.
-
Exclua os componentes alicloud-disk-controller e alicloud-nas-controller:
kubectl delete deploy -n kube-system alicloud-disk-controller alicloud-nas-controller -
Verifique se o FlexVolume foi totalmente desinstalado. Se nenhuma saída for retornada, o FlexVolume terá sido completamente removido.
kubectl get pods -n kube-system | grep 'flexvolume\|alicloud-disk-controller\|alicloud-nas-controller' -
Exclua as StorageClasses do FlexVolume (provisioner:
alicloud/disk). Saída esperada:kubectl delete storageclass alicloud-disk-available alicloud-disk-efficiency alicloud-disk-essd alicloud-disk-ssdstorageclass.storage.k8s.io "alicloud-disk-available" deleted storageclass.storage.k8s.io "alicloud-disk-efficiency" deleted storageclass.storage.k8s.io "alicloud-disk-essd" deleted storageclass.storage.k8s.io "alicloud-disk-ssd" deleted
Etapa 5: Instalar o CSI via API
-
Acesse o console do OpenAPI Explorer e chame a operação InstallClusterAddons para instalar o CSI. Para mais informações, consulte Instalar um componente em um cluster ACK.
ClusterId: ID do cluster.
name: Defina como
csi-provisioner.version: A versão mais recente é especificada automaticamente. Para detalhes sobre versões, consulte csi-provisioner.
-
Verifique se o CSI está em execução. Saída esperada: Se todos os pods exibirem
Running, o CSI estará instalado.kubectl get pods -nkube-system | grep csicsi-plugin-577mm 4/4 Running 0 3d20h csi-plugin-k9mzt 4/4 Running 0 41d csi-provisioner-6b58f46989-8wwl5 9/9 Running 0 41d csi-provisioner-6b58f46989-qzh8l 9/9 Running 0 6d20h
Etapa 6: Atualizar configurações de nós
Implante um DaemonSet para definir o parâmetro do kubelet --enable-controller-attach-detach como true em todos os nós existentes. Exclua o DaemonSet após a conclusão da atualização.
Este DaemonSet reinicia o kubelet em cada nó. Avalie o impacto nas aplicações em execução antes de prosseguir.
Crie um arquivo com o seguinte conteúdo e aplique-o com kubectl apply -f <filename>.yaml:
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: kubelet-set
spec:
selector:
matchLabels:
app: kubelet-set
template:
metadata:
labels:
app: kubelet-set
spec:
tolerations:
- operator: "Exists"
hostNetwork: true
hostPID: true
containers:
- name: kubelet-set
securityContext:
privileged: true
capabilities:
add: ["SYS_ADMIN"]
allowPrivilegeEscalation: true
image: registry.cn-hangzhou.aliyuncs.com/acs/csi-plugin:v1.26.5-56d1e30-aliyun
imagePullPolicy: "Always"
env:
- name: enableADController
value: "true"
command: ["sh", "-c"]
args:
- echo "Starting kubelet flag set to $enableADController";
ifFlagTrueNum=`cat /host/etc/systemd/system/kubelet.service.d/10-kubeadm.conf | grep enable-controller-attach-detach=$enableADController | grep -v grep | wc -l`;
echo "ifFlagTrueNum is $ifFlagTrueNum";
if [ "$ifFlagTrueNum" = "0" ]; then
curValue="true";
if [ "$enableADController" = "true" ]; then
curValue="false";
fi;
sed -i "s/enable-controller-attach-detach=$curValue/enable-controller-attach-detach=$enableADController/" /host/etc/systemd/system/kubelet.service.d/10-kubeadm.conf;
restartKubelet="true";
echo "current value is $curValue, change to expect "$enableADController;
fi;
if [ "$restartKubelet" = "true" ]; then
/nsenter --mount=/proc/1/ns/mnt systemctl daemon-reload;
/nsenter --mount=/proc/1/ns/mnt service kubelet restart;
echo "restart kubelet";
fi;
while true;
do
sleep 5;
done;
volumeMounts:
- name: etc
mountPath: /host/etc
volumes:
- name: etc
hostPath:
path: /etc