Erros ao montar um compartilhamento de arquivos do Azure
Este artigo fornece possíveis causas e soluções para erros que causam falha na montagem de um compartilhamento de arquivos do Azure.
Sintomas
Implante um recurso do Kubernetes, como uma Deployment e um StatefulSet, em um ambiente do AKS (Serviço de Kubernetes do Azure). A implantação criará um pod que monta um PVC (PersistentVolumeClaim) referenciando um compartilhamento de arquivo do Azure.
No entanto, o pod permanece no status ContainerCreating. Ao executar o kubectl describe pods
comando, você pode ver um dos seguintes erros na saída do comando, o que faz com que a operação de montagem falhe:
Consulte a saída a seguir para ver um exemplo:
MountVolume.MountDevice failed for volume "\<pv-fileshare-name>"
rpc error: code = Internal desc =
volume(\<storage-account's-resource-group>#\<storage-account-name>#\<pv/fileshare-name>#) > mount "//\<storage-account-name>.file.core.windows.net/\<pv-fileshare-name>" on "/var/lib/kubelet/plugins/kubernetes.io/csi/pv/\<pv-fileshare-name>/globalmount" failed with
mount failed: exit status 32
Mounting command: mount
Mounting arguments: -t cifs -o dir_mode=0777,file_mode=0777,uid=0,gid=0,mfsymlinks,cache=strict,actimeo=30,\<masked> //\<storage-account-name>.file.core.windows.net/\<pv-name> /var/lib/kubelet/plugins/kubernetes.io/csi/pv/\<pv-name>/globalmount
Output: mount error(\<error-id>): \<error-description>
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)
Observação
- Se a conta de armazenamento estiver acessível publicamente, o nome do host exibido na saída será storage-account-name.file.core.windows.net>.<
- Se a conta de armazenamento estiver configurada de forma privada com um link privado, ponto de extremidade ou zona DNS, o nome do host será storage-account-name.privatelink.file.core.windows.net>.<
Antes da solução de problemas
De acordo com a mensagem na saída, conforme mostrado no exemplo a seguir, identifique a conta de armazenamento e o compartilhamento de arquivo. Os valores serão usados nas etapas posteriores da solução de problemas.
mount "//<nome-da-conta-de-armazenamento.file.core.windows.net/>< nome-do-compartilhamento-de-arquivos-pv>"
Confira as seções a seguir para ver as possíveis causas e soluções.
Erro de montagem (2): Arquivo ou diretório não existe
Esse erro indica que não há conectividade entre o cluster do AKS e a conta de armazenamento.
Solução de problemas inicial
O Arquivo do Azure depende do protocolo SMB (porta 445). Verifique se a porta 445 e/ou o endereço IP da conta de armazenamento não estão bloqueados.
Para verificar o endereço IP da conta de armazenamento, execute um comando DNS (Sistema de Nomes de Domínio), como nslookup
, dig
ou host
. Por exemplo:
nslookup <storage-account-name>.file.core.windows.net
Para verificar se há conectividade entre o cluster do AKS e a conta de armazenamento, entre no nó ou pod e execute o comando nc
ou telnet
:
nc -v -w 2 <storage-account-name>.file.core.windows.net 445
telnet <storage-account-name>.file.core.windows.net 445
Possíveis causas para erro de montagem(2)
- Causa 1: o compartilhamento de arquivos não existe
- Causa 2: o NSG bloqueia o tráfego entre o AKS e a conta de armazenamento
- Causa 3: a Solução de Virtualização bloqueia o tráfego entre o AKS e a conta de armazenamento
- Causa 4: o pool de nós habilitado para FIPS é usado
Observação
- As causas 1, 2 e 4 se aplicam a cenários de conta de armazenamento pública e privada.
- A causa 3 aplica-se apenas ao cenário público.
Causa 1: o compartilhamento de arquivos não existe
Para verificar se o compartilhamento de arquivos existe, siga estas etapas:
Pesquise contas de armazenamento no portal do Azure e acesse sua conta de armazenamento.
Selecione Compartilhamentos de arquivos em Armazenamento de dados na conta de armazenamento e verifique se o PersistentVolumeClaim associado no arquivo yaml do pod, implantação ou statefulset existe em Compartilhamentos de arquivos.
Solução: verifique se o compartilhamento de arquivo existe
Para resolver esse problema, verifique se o compartilhamento de arquivo associado ao PV/PVC existe.
Causa 2: o Grupo de Segurança de Rede bloqueia o tráfego entre o AKS e a conta de armazenamento
Verifique a saída do nc
comando or telnet
mencionado na seção Solução de problemas inicial. Se um tempo limite for exibido, verifique o NSG (Grupo de Segurança de Rede) e se o endereço IP da conta de armazenamento não está bloqueado.
Para verificar se o NSG bloqueia o endereço IP da conta de armazenamento, siga estas etapas:
No portal do Azure, acesse Observador de Rede e selecione Diagnóstico de NSG.
Preencha os campos usando os valores a seguir:
- Protocolo: Qualquer
- Direção: Saída
- Tipo de fonte: endereço IPv4/CIDR
- Endereço IPv4/CIDR: o endereço IP de uma instância associada ao nó do AKS
- Endereço IP de destino: o endereço IP da conta de armazenamento
- Porto de destino: 445
Selecione o botão Verificar e verifique o status do tráfego .
O status do tráfego pode ser Permitido ou Negado. O status Negado significa que o NSG está bloqueando o tráfego entre o cluster do AKS e a conta de armazenamento. Se o status for Negado, o nome do NSG será mostrado.
Solução: permitir a conectividade entre o AKS e a conta de armazenamento
Para resolver esse problema, faça alterações adequadamente no nível do NSG para permitir a conectividade entre o cluster do AKS e a conta de armazenamento na porta 445.
Causa 3: a Solução de Virtualização bloqueia o tráfego entre o AKS e a conta de armazenamento
Se você estiver usando uma Solução de Virtualização (geralmente um firewall) para controlar o tráfego de saída do cluster do AKS (por exemplo, a Solução de Virtualização tem uma tabela de rotas aplicada na sub-rede do cluster do AKS e a tabela de rotas tem rotas que enviam tráfego para a Solução de Virtualização), a Solução de Virtualização pode bloquear o tráfego entre o cluster do AKS e a conta de armazenamento.
Para isolar o problema, adicione uma rota na tabela de rotas para o endereço IP da conta de armazenamento para enviar o tráfego para a Internet.
Para confirmar qual tabela de rotas controla o tráfego do cluster do AKS, siga estas etapas:
- Vá para o cluster do AKS no portal do Azure e selecione Grupo de recursos de infraestrutura de propriedades>.
- Acesse o VMSS (conjunto de dimensionamento de máquinas virtuais) ou uma VM em um conjunto de disponibilidade se você estiver usando esse tipo de conjunto de VMs.
- Selecione Sub-redes de rede/sub-rede>virtual e identifique a sub-rede do cluster do AKS. No lado direito, você verá a tabela de rotas.
Para adicionar a rota na tabela de rotas, siga as etapas em Criar uma rota e preencha os seguintes campos:
- Prefixo de endereço: <storage-account's-public-IP>/32
- Tipo de próximo salto:Internet
Essa rota enviará todo o tráfego entre o cluster do AKS e a conta de armazenamento por meio da Internet pública.
Depois de adicionar a rota, teste a conectividade usando o comando nc
ou telnet
e execute a operação de montagem novamente.
Solução: verifique se a Solução de Virtualização permite o tráfego entre o AKS e a conta de armazenamento
Se a operação de montagem for bem-sucedida, recomendamos que você consulte sua equipe de rede para garantir que a Solução de virtualização possa permitir o tráfego entre o cluster do AKS e a conta de armazenamento na porta 445.
Causa 4: o pool de nós habilitado para FIPS é usado
Se você usar um pool de nós habilitado para FIPS, a operação de montagem falhará porque o FIPS desabilita alguns módulos de autenticação, o que impede a montagem de um compartilhamento CIFS. Esse comportamento é esperado e não é específico do AKS.
Para resolver o problema, use uma das seguintes soluções:
Solução 1: agendar pods em nós em um pool de nós não FIPS
O FIPS é desabilitado por padrão em pools de nós do AKS e só pode ser habilitado durante a criação do pool de nós usando o parâmetro --enable-fips-image
.
Para resolver o erro, você pode agendar os pods em nós em um pool de nós não FIPS.
Solução 2: criar um pod que possa ser agendado em um nó habilitado para FIPS
Para criar um pod que possa ser agendado em um nó habilitado para FIPS, siga estas etapas:
Use o driver CSI de Arquivo do Azure para criar um StorageClass personalizado que usa o protocolo NFS.
Veja o seguinte arquivo YAML como exemplo:
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: azurefile-sc-fips provisioner: file.csi.azure.com reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true parameters: skuName: Premium_LRS protocol: nfs
O SKU é definido como Premium_LRS no arquivo YAML porque o SKU Premium é necessário para o NFS. Para saber mais, consulte Provisionamento dinâmico.
Devido ao SKU Premium, o tamanho mínimo do compartilhamento de arquivos é de 100 GB. Para obter mais informações, consulte Criar uma classe de armazenamento.
Crie uma PVC que faça referência ao StorageClass personalizado azurefile-sc-fips.
Veja o seguinte arquivo YAML como exemplo:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: azurefile-pvc-fips spec: accessModes: - ReadWriteMany storageClassName: azurefile-sc-fips resources: requests: storage: 100Gi
Crie um pod que monta o PVC azurefile-pvc-fips.
Veja o seguinte arquivo YAML como exemplo:
kind: Pod apiVersion: v1 metadata: name: azurefile-pod-fips spec: containers: - name: azurefile-pod-fips image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - mountPath: "/mnt/azure" name: volume volumes: - name: volume persistentVolumeClaim: claimName: azurefile-pvc-fips
Erro de montagem (13): Permissão negada
As possíveis causas para esse erro incluem:
- Causa 1: o segredo do Kubernetes não faz referência ao nome ou à chave da conta de armazenamento correta
- Causa 2: a VNET e a sub-rede do AKS não são permitidas para a conta de armazenamento
- Causa 3: a conectividade é feita por meio de um link privado, mas os nós e o ponto de extremidade privado estão em VNETs diferentes
- Causa 4: a conta de armazenamento é definida para exigir uma criptografia que o cliente não dá suporte
- Causa 5: o requisito mínimo de criptografia para uma conta de armazenamento não é atendido
- Causa 6: o perfil de segurança é usado sem a autenticação NTLM v2 habilitada
Observação
- A causa 1 se aplica a cenários públicos e privados.
- A causa 2 aplica-se apenas ao cenário público.
- A causa 3 aplica-se apenas a cenários privados.
- A causa 4 se aplica a cenários públicos e privados.
- A causa 5 se aplica a cenários públicos e privados.
- A causa 6 se aplica a cenários públicos e privados.
Causa 1: o segredo do Kubernetes não faz referência ao nome ou à chave da conta de armazenamento correta
Se o compartilhamento de arquivos for criado dinamicamente, um recurso secreto do Kubernetes será criado automaticamente com o nome "azure-storage-account-storage-account-name-secret<>".
Se o compartilhamento de arquivo for criado manualmente, o recurso secreto do Kubernetes deverá ser criado manualmente.
Independentemente do método de criação, se o nome da conta de armazenamento ou a chave referenciada no segredo do Kubernetes for incompatível com o valor real, a operação de montagem falhará com o erro "Permissão negada".
Possíveis causas para a incompatibilidade
Se o segredo do Kubernetes for criado manualmente, um erro de digitação poderá ocorrer durante a criação.
Se uma operação "Girar chave" for executada no nível da conta de armazenamento, as alterações não serão refletidas no nível do segredo do Kubernetes. Isso irá causar uma incompatibilidade entre o valor da chave no nível da conta de armazenamento e o valor no nível do segredo do Kubernetes.
Se ocorrer uma operação "Girar chave", uma operação com o nome "Regenerar chaves da conta de armazenamento" será exibida no log de atividades da conta de armazenamento. Lembre-se do período de retenção de 90 dias para o log de atividades.
Verificar incompatibilidade
Para verificar a incompatibilidade, siga estas etapas:
Procure e acesse a conta de armazenamento no portal do Azure. Selecione Chaves>de acesso Mostrar chaves na conta de armazenamento. Você verá o nome da conta de armazenamento e as chaves associadas.
Vá para o cluster do AKS, selecione Segredos de Configuração>e, em seguida, pesquise e acesse o segredo associado.
Selecione Mostrar (o ícone de olho) e compare os valores do nome da conta de armazenamento e da chave associada com os valores na Etapa 1.
Antes de selecionar Mostrar, os valores do nome da conta de armazenamento e da chave associada são codificados em cadeias de caracteres base64. Depois de selecionar Mostrar, os valores são decodificados.
Se você não tiver acesso ao cluster do AKS no portal do Azure, execute a Etapa 2 no nível kubectl:
Obtenha o arquivo YAML do segredo do Kubernetes e execute o seguinte comando para obter os valores do nome da conta de armazenamento e a chave da saída:
kubectl get secret <secret-name> -n <secret-namespace> -o <yaml-file-name>
Use o comando
echo
para decodificar os valores do nome da conta de armazenamento e da chave e compará-los com os valores no nível da conta de armazenamento.Aqui está um exemplo para decodificar o nome da conta de armazenamento:
echo -n '<storage account name>' | base64 --decode ;echo
Solução: ajuste o segredo do Kubernetes e recrie os pods
Se o valor do nome ou da chave da conta de armazenamento no segredo do Kubernetes não corresponder ao valor em Chaves de acesso na conta de armazenamento, ajuste o segredo do Kubernetes no nível do segredo do Kubernetes executando o seguinte comando:
kubectl edit secret <secret-name> -n <secret-namespace>
O valor do nome da conta de armazenamento ou da chave adicionada na configuração de segredo do Kubernetes deve ser um valor codificado em base64. Para obter o valor codificado, use o comando echo
.
Aqui está um exemplo para codificar o nome da conta de armazenamento:
echo -n '<storage account name>'| base64 | tr -d '\n' ; echo
Para obter mais informações, consulte Gerenciando segredos usando kubectl.
Depois que o segredo azure-storage-account-<storage-account-name>-secret
do Kubernetes tiver os valores certos, recrie os pods. Caso contrário, esses pods continuarão usando os valores antigos que não são mais válidos.
Causa 2: a VNET e a sub-rede do AKS não são permitidas para a conta de armazenamento
Se a rede da conta de armazenamento estiver limitada a redes selecionadas, mas a VNET e a sub-rede do cluster do AKS não forem adicionadas às redes selecionadas, a operação de montagem falhará com o erro "Permissão negada".
Solução: permitir a VNET e a sub-rede do AKS para a conta de armazenamento
Identifique o nó que hospeda o pod defeituoso executando o seguinte comando:
kubectl get pod <pod-name> -n <namespace> -o wide
Verifique o nó na saída do comando:
Vá para o cluster do AKS no portal do Azure, selecione o grupo de recursos Propriedades>de Infraestrutura, acesse o VMSS associado ao nó e marque Rede virtual/sub-rede para identificar a VNET e a sub-rede.
Acesse a conta de armazenamento no portal do Azure. Selecione Rede. Se Permitir acesso de estiver definido como Redes selecionadas, verifique se a VNET e a sub-rede do cluster do AKS foram adicionadas.
Se a VNET e a sub-rede do cluster do AKS não forem adicionadas, selecione Adicionar rede virtual existente. Na página Adicionar redes, digite a VNET e a sub-rede do cluster do AKS e selecione Adicionar>Salvar.
Pode levar alguns minutos para que as alterações entrem em vigor. Depois que a VNET e a sub-rede forem adicionadas, verifique se o status do pod muda de ContainerCreating para Running.
Causa 3: a conectividade é por meio de um link privado, mas os nós e o ponto de extremidade privado estão em VNETs diferentes
Quando o cluster do AKS e a conta de armazenamento são conectados por meio de um link privado, uma conexão de ponto de extremidade privado aprovada é usada.
Nesse cenário, se o ponto de extremidade privado e o nó do AKS estiverem na mesma VNET, você poderá montar um compartilhamento de arquivos do Azure.
Se o ponto de extremidade privado e o cluster do AKS estiverem em VNETs diferentes, a operação de montagem falhará com o erro "Permissão negada".
Solução: criar um link de rede virtual para a VNET do cluster do AKS na zona DNS privada
Entre no nó e verifique se o FQDN (nome de domínio totalmente qualificado) foi resolvido por meio de um endereço IP público ou privado. Para fazer isso, execute o seguinte comando:
nslookup <storage-account-name>.privatelink.file.core.windows.net
Se o FQDN for resolvido por meio de um endereço IP público (consulte a captura de tela a seguir), crie um link de rede virtual para a VNET do cluster do AKS no nível da zona DNS privada ("privatelink.file.core.windows.net"). Observe que um link de rede virtual é criado automaticamente para a VNET do ponto de extremidade privado da conta de armazenamento.
Para criar um link de rede virtual, siga estas etapas:
Acesse a zona DNS privada e selecione Links de>rede virtual Adicionar.
Preencha os campos e selecione a VNET do cluster do AKS para redes virtuais. Para saber como identificar a VNET do cluster do AKS, consulte a seção Solução: permitir a VNET e a sub-rede do AKS para a conta de armazenamento.
Clique em OK.
Depois que o link de rede virtual for adicionado, o FQDN deverá ser resolvido por meio de um endereço IP privado e a operação de montagem deverá ser bem-sucedida. Consulte a captura de tela a seguir para obter um exemplo:
Causa 4: a conta de armazenamento é definida para exigir uma criptografia que o cliente não dá suporte
As Configurações de Segurança dos Arquivos do Azure contêm várias opções para controlar as configurações de segurança e criptografia nas contas de armazenamento. A restrição de métodos e algoritmos permitidos pode impedir que os clientes se conectem.
As versões do AKS anteriores à 1.25 são baseadas no Ubuntu 18.04 LTS, que usa o kernel Linux 5.4 e dá suporte apenas aos algoritmos de criptografia AES-128-CCM e AES-128-GCM. O perfil Segurança máxima ou um perfil Personalizado que desabilita o AES-128-GCM causará falhas no mapeamento de compartilhamento.
As versões 1.25 e posteriores do AKS são baseadas no Ubuntu 22.04, que usa o kernel Linux 5.15 e tem suporte para AES-256-GCM.
Solução: permitir que o algoritmo de criptografia AES-128-GCM seja usado
Habilite o algoritmo AES-128-GCM usando o perfil Compatibilidade máxima ou um perfil Personalizado que habilite o AES-128-GCM. Para obter mais informações, consulte Configurações de Segurança dos Arquivos do Azure.
Causa 5: o requisito mínimo de criptografia para uma conta de armazenamento não é atendido
Solução: habilitar o algoritmo de criptografia AES-128-GCM para todas as contas de armazenamento
Para montar ou acessar com êxito um compartilhamento de arquivos, o algoritmo de criptografia AES-128-GCM deve ser habilitado para todas as contas de armazenamento.
Se você quiser usar apenas a criptografia AES-256-GCM, faça o seguinte:
Linux
Use o script a seguir para verificar se o cliente dá suporte ao AES-256-GCM e aplicá-lo somente se ele suportar:
cifsConfPath="/etc/modprobe.d/cifs.conf"
echo "$(date) before change ${cifsConfPath}:"
cat ${cifsConfPath}
# Check if 'require_gcm_256' is already present in the configuration file
if ! grep -q "require_gcm_256" "${cifsConfPath}"; then
# Load the CIFS module
modprobe cifs
# Set the parameter at runtime
echo 1 > /sys/module/cifs/parameters/require_gcm_256
# Persist the configuration
echo "options cifs require_gcm_256=1" >> "${cifsConfPath}"
echo "$(date) after changing ${cifsConfPath}:"
cat "${cifsConfPath}"
else
echo "require_gcm_256 is already set in ${cifsConfPath}"
fi
Você também pode usar um Kubernetes DaemonSet para impor AES-256 em cada nó. Consulte o seguinte exemplo:
Windows
Use o comando Set-SmbClientConfiguration do PowerShell para especificar as criptografias usadas pelo cliente SMB e o tipo de criptografia preferencial sem confirmação do usuário:
Set-SmbClientConfiguration -EncryptionCiphers "AES_256_GCM" -Confirm:$false
Observação
O EncryptionCiphers
parâmetro está disponível a partir da Atualização Cumulativa 2022-06 para Windows Server versão 21H2 para sistemas baseados em x64 (KB5014665) e a Atualização Cumulativa para Windows 11, versão 22H2 (KB5014668).
Causa 6: o perfil de segurança é usado sem a autenticação NTLM v2 habilitada
Quando você usa o perfil de segurança Máximo ou um perfil de segurança Personalizado sem o mecanismo de autenticação NTLM v2 habilitado, a operação de montagem falhará com o erro "Erro de montagem (13): Permissão negada".
Solução: habilite a autenticação NTLM v2 ou use o perfil "Compatibilidade máxima"
Para montá-lo corretamente no AKS, você precisa habilitar o mecanismo de autenticação NTLM v2 para o perfil de segurança personalizado ou usar o perfil de segurança de compatibilidade máxima.
Mais informações
Se você tiver outros erros de montagem, consulte Solucionar problemas de Arquivos do Azure no Linux.
Entre em contato conosco para obter ajuda
Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.