Os componentes da Container Storage Interface (CSI), csi-plugin e csi-provisioner, automatizam operações como provisionamento dinâmico, montagem, desmontagem e redimensionamento de volumes de armazenamento. Isso permite usar recursos de armazenamento do Alibaba Cloud, como discos em nuvem e NAS, com a mesma integração dos recursos nativos do Kubernetes.
Visão geral dos componentes
Componentes
Os componentes CSI são instalados por padrão em clusters ACK. O csi-plugin e o csi-provisioner atuam em conjunto para gerenciar o ciclo de vida dos volumes de armazenamento.
|
Componente |
Descrição |
Tipo de implantação |
|
Executa em cada nó para realizar operações no nível do nó, como montar e desmontar volumes de armazenamento e formatar sistemas de arquivos. |
DaemonSet |
|
|
Atua como controlador central para lidar com provisionamento dinâmico, exclusão, redimensionamento e criação de snapshots de volumes de armazenamento. Oferece suporte ao gerenciamento de volumes de disco em nuvem, NAS e OSS. |
Deployment |
Modos gerenciado e não gerenciado para csi-provisioner
Para melhorar a estabilidade e reduzir a sobrecarga operacional, o csi-provisioner oferece modos gerenciado e não gerenciado. Novos clusters usam o modo gerenciado por padrão.
Modo gerenciado (padrão): O ACK gerencia os pods do componente, que não ficam visíveis no namespace kube-system. O ACK mantém os componentes e ajusta seus recursos.
Modo não gerenciado: Os pods do componente são implantados como um Deployment no namespace kube-system. Você deve gerenciar as configurações de recursos (modificando o yaml do Deployment) e solucionar problemas.
Atualizar componentes CSI
Visualize as versões dos componentes e realize atualizações na página Add-ons no console.
Verificações pré-atualização
Verifique a compatibilidade de versões: Consulte os logs de alterações (csi-provisioner, csi-plugin) para confirmar se a versão alvo do CSI é compatível com a versão atual do cluster.
Verifique o status da migração do FlexVolume: Se o cluster usou anteriormente o componente
csi-compatible-controllerpara migrar do FlexVolume para CSI, tarefas de migração inacabadas bloquearão a atualização automática dos componentes CSI. Conclua a migração primeiro ou consulte Atualizar componentes para realizar uma atualização manual durante a migração.Siga a ordem de atualização: Os componentes de armazenamento possuem dependências. Para garantir compatibilidade e estabilidade, atualize-os na seguinte ordem: storage-operator→csi-provisioner→csi-plugin.
Processo de atualização
Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do cluster. No painel de navegação à esquerda, clique em Components and Add-ons.
-
Clique na aba Volumes. Localize o
csi-provisionere ocsi-plugine atualize-os em ordem.Se a atualização falhar, consulte Falhas na atualização de componentes .
Após a atualização, verifique o cartão do componente para confirmar se a versão está conforme o esperado.
Considerações para produção
-
Conflitos entre reforço de segurança e acesso a metadados:
O componente
csi-pluginprecisa acessar os metadados da instância para obter informações do nó, como região e zona de disponibilidade. Se você desativar o acesso aos metadados, o componente falhará ao iniciar ou apresentará comportamento anormal. Consulte Acessar metadados de instância ECS no modo de segurança reforçada para verificar a versão necessária do componente.Ao configurar um grupo de segurança ou políticas de segurança do nó, garanta que o pod do componente
csi-pluginpossa acessar o serviço de metadados da instância. -
Mantenha a StorageClass padrão:
O ACK fornece objetos StorageClass padrão, como
alicloud-disk-essd. Se você modificar propriedades comoprovisionerouparameters, as atualizações do componente poderão falhar.
Perguntas frequentes
Problemas com componentes
Falha na inicialização: erro **403 - Forbidden**
Falha na inicialização: exec /usr/bin/plugin.csi.alibabacloud.com: exec format error
Sintoma
O contêiner csi-plugin no Pod csi-plugin falha ao iniciar e o log exibe o erro: exec /usr/bin/plugin.csi.alibabacloud.com: exec format error.
Causa
Esse erro geralmente indica incompatibilidade de arquitetura de CPU. No entanto, o csi-plugin suporta as arquiteturas amd64 e arm64 por padrão. Portanto, se esse erro ocorrer em um nó suportado, a causa mais provável é um arquivo de imagem CSI corrompido.
Isso pode acontecer se o processo de pull da imagem for interrompido, por exemplo, por um desligamento forçado, deixando um arquivo de imagem incompleto no nó. Embora os metadados da imagem existam, o executável binário fica inválido ou danificado, impedindo o início do contêiner csi-plugin.
Solução
Escale horizontalmente adicionando um novo nó e, em seguida, drene o nó problemático.
-
Se for necessário manter o nó atual, execute as seguintes etapas:
Drene o nó para evacuar suas cargas de trabalho e, em seguida, remova o nó do cluster.
Faça login no nó e exclua todos os contêineres, se houver.
Exclua todos os arquivos do diretório
/var/lib/containerd.Adicione o nó novamente ao cluster.
Problemas de OOM em componentes de armazenamento
O contêiner sidecar no pod do componente csi-provisioner armazena em cache informações de recursos, como pods, PVs e PVCs. Em clusters de grande escala, isso pode consumir muita memória e causar erro de Out-of-Memory (OOM) no contêiner.
csi-provisionergerenciado: Envie um ticket para obter assistência.-
csi-provisionernão gerenciado: Se ocorrer erro OOM, ajuste os limites de recursos com base no tamanho do cluster.Na página Clusters, clique no nome do cluster. No painel de navegação à esquerda, clique em Components and Add-ons.
Localize o componente
csi-provisioner, clique no ícone
e, em seguida, clique em View in YAML.-
Edite o yaml do componente para ajustar os limites de recursos de acordo com o tamanho do cluster.
containers: - name: external-disk-provisioner image: registry-vpc.cn-huhexxxx.yuncs.com/acs/csi-provisioner:v3.0.0-080f01e64-aliyun resources: requests: cpu: 10m memory: 16Mi limits: cpu: 500m memory: 1024Mi
Alto tráfego de rede no csi-plugin
Sintoma
No painel de monitoramento de pods do cluster, os pods do componente csi-plugin apresentam alto tráfego de rede.
Causa
Este é um comportamento esperado. O componente csi-plugin gerencia a montagem de volumes de armazenamento NAS nos nós. Quando um pod de aplicação lê ou grava dados por um ponto de montagem NAS, o tráfego de rede resultante passa pelo namespace de rede do pod csi-plugin. Por isso, o sistema de monitoramento atribui esse tráfego ao pod csi-plugin.
Solução
Nenhuma ação é necessária; ignore este alerta com segurança. O tráfego é atribuído ao pod csi-plugin apenas para fins de contabilização. Ele não consome recursos do pod, nem resulta em tráfego duplicado ou faturamento duplo. Trata-se de um artefato de monitoramento sem impacto no desempenho.
Os logs do componente csi-provisioner relatam o erro failed to renew lease xxx timed out waiting for the condition
Sintoma
Execute o comando kubectl logs csi-provisioner-xxxx -n kube-system para visualizar os logs do CSI. O erro failed to renew lease xxx timed out waiting for the condition é relatado.
Causa
O componente csi-provisioner usa modelo de múltiplas réplicas para alta disponibilidade. Para garantir que apenas uma instância atenda às solicitações por vez, as réplicas usam o mecanismo Lease do Kubernetes para eleição de líder. Esse mecanismo depende de comunicação estável com o servidor de API.
Esse erro indica que o csi-provisioner não consegue acessar o servidor de API, causando falha na eleição de líder. Como resultado, nenhuma réplica assume a liderança para fornecer o serviço.
Solução
Verifique a conectividade de rede do cluster e o status do servidor de API. Se o problema persistir, envie um ticket para obter assistência.
Falhas na atualização de componentes
Falha na verificação pré-atualização do csi-plugin
Esse problema ocorre tipicamente durante a migração do plug-in de armazenamento FlexVolume para CSI. Execute o seguinte comando para confirmar se ambos os plug-ins coexistem.
kubectl -nkube-system get ds csi-plugin flexvolume
Se a saída for semelhante à seguinte:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
csi-plugin 4 4 4 4 4 kubernetes.io/os=linux 7d
flexvolume 4 4 4 4 4 kubernetes.io/os=linux 7d
Isso indica que ambos os plug-ins de armazenamento coexistem.
Não é possível atualizar o FlexVolume e o CSI simultaneamente. Para atualizar o componente CSI, migre todos os PVs e PVCs do FlexVolume para CSI e desinstale o componente FlexVolume. Para mais informações, consulte Migrar FlexVolume sem cluster de armazenamento para CSI.
Se esta não for a causa e o cluster hospedar dados críticos, entre em contato conosco para solicitar uma atualização manual assistida.
Falha na atualização do csi-plugin após verificação prévia
O componente csi-plugin é implantado como DaemonSet, exigindo que todos os nós estejam saudáveis. A atualização falha se o cluster tiver algum nó em estado NotReady ou não Running.
Repare o nó defeituoso antes de tentar a atualização novamente. Se não conseguir identificar a causa, entre em contato conosco para solicitar uma atualização manual assistida.
csi-provisioner ausente no console
Versões anteriores do csi-provisioner (1,14 e anteriores) são implantadas como StatefulSet. Se ainda existirem instâncias StatefulSet do csi-provisioner no cluster atual, exclua-as manualmente (kubectl delete sts csi-provisioner) antes de reinstalar.
Se encontrar problemas durante essa operação, entre em contato conosco para solicitar uma atualização manual assistida.
Falha na verificação pré-atualização do csi-provisioner
Esse problema ocorre tipicamente durante a migração do plug-in de armazenamento FlexVolume para CSI. Execute o seguinte comando para confirmar se ambos os plug-ins coexistem.
kubectl -nkube-system get ds csi-plugin flexvolume
Se a saída for semelhante à seguinte:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
csi-plugin 4 4 4 4 4 kubernetes.io/os=linux 7d
flexvolume 4 4 4 4 4 kubernetes.io/os=linux 7d
Isso indica que ambos os plug-ins de armazenamento coexistem.
Não é possível atualizar o FlexVolume e o CSI simultaneamente. Para atualizar o componente CSI, migre todos os PVs e PVCs do FlexVolume para CSI e desinstale o componente FlexVolume. Para mais informações, consulte Migrar FlexVolume sem cluster de armazenamento para CSI.
Se esta não for a causa e o cluster hospedar dados críticos, entre em contato conosco para solicitar uma atualização manual assistida.
Falha na atualização do csi-provisioner após verificação prévia
Entre em contato conosco para solicitar uma atualização manual assistida.
Falha na atualização do csi-provisioner: Contagem de nós ou permissões
Sintoma
Cenário 1: A verificação pré-atualização do componente
csi-provisionerfalha, indicando que o cluster não possui nós suficientes.-
Cenário 2: A verificação prévia e a atualização do componente csi-provisioner são bem-sucedidas. No entanto, o Pod do componente entra no estado
CrashLoopBackOffe os logs mostram um erro403 Forbidden.time="2023-08-05T13:54:00+08:00" level=info msg="Use node id : <?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n <head>\n <title>403 - Forbidden</title>\n </head>\n <body>\n <h1>403 - Forbidden</h1>\n </body>\n</html>\n"
Causa e solução
-
Cenário 1
Causa: O componente
csi-provisionerusa modelo de implantação ativo-standby. Suas duas réplicas devem ser agendadas em nós diferentes para satisfazer requisitos de anti-afinidade. Clusters de nó único não atendem a essa condição, fazendo a segunda réplica permanecer no estadoPendinge impedindo a conclusão da atualização.Solução: Adicione pelo menos mais um nó ao cluster para garantir o agendamento correto das múltiplas réplicas.
-
Cenário 2
Causa: O componente
csi-provisionerprecisa acessar os metadados da instância do nó para obter informações como ID da instância e região, necessárias para chamar APIs do Alibaba Cloud. Se o reforço de segurança estiver ativado no nó ou se políticas de rede restritivas estiverem configuradas, o acesso ao serviço de metadados poderá ser bloqueado.Solução: Ajuste ou desative as políticas de reforço de segurança no nó para garantir que o pod acesse o serviço de metadados. Verifique também regras do grupo de segurança, configurações de firewall do SO e scripts de segurança relevantes.
Falha na atualização do csi-provisioner: Modificação da StorageClass
Sintoma
A instalação ou atualização do csi-provisioner falha na verificação prévia, indicando que as propriedades da StorageClass não atendem às expectativas.
Causa
A StorageClass padrão fornecida pelo ACK possui configuração fixa. Campos principais como provisioner e parameters não podem ser alterados. Excluir e recriar manualmente uma StorageClass com o mesmo nome causa falha na validação e interrompe a atualização do componente.
O instalador do CSI valida rigorosamente a integridade desses recursos para garantir comportamento consistente do componente.
Solução
-
Exclua os objetos StorageClass padrão do cluster, incluindo
alicloud-disk-essd,alicloud-disk-available,alicloud-disk-efficiency,alicloud-disk-ssdealicloud-disk-topology.Esta operação não afeta o uso normal de PVs e PVCs existentes.
Após excluir os objetos StorageClass, reinstale o
csi-provisioner. O instalador recriará automaticamente os objetos StorageClass. Nenhuma ação adicional é necessária.
Se precisar de uma StorageClass personalizada, crie sempre uma nova com nome diferente. Não modifique nem recrie os objetos StorageClass padrão.
Entre em contato conosco
Para solicitar suporte de atualização manual, use o DingTalk para pesquisar o número do grupo 35532895 e participe do grupo para obter assistência.
Referências
Para mais informações sobre CSI, consulte alibaba-cloud-csi-driver.
Para logs de alterações dos componentes CSI, consulte csi-provisioner e csi-plugin.
Para outros componentes de armazenamento, consulte Gerencie o componente storage-operator, Gerencie o componente cnfs-nas-daemon e Gerencie o componente cnfs-controller.