Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O Ficheiros do Azure permite que vários pods partilhem armazenamento persistente no AKS através dos protocolos SMB ou NFS, que sobrevive a reinícios dos pods, falhas dos nós e eventos de escalamento do cluster. Este artigo mostra-lhe como criar dinâmica e estaticamente uma partilha de ficheiros Azure para utilização por múltiplos pods num cluster Azure Kubernetes Service (AKS).
Observação
O driver CSI do Ficheiros do Azure só permite a montagem de partilhas de ficheiros SMB usando autenticação baseada em chaves (NTLM v2), e por isso não suporta o perfil de segurança máxima das definições de partilha de ficheiros do Azure. Montar partilhas de ficheiros NFS não requer autenticação baseada em chaves.
Observação
Recomendamos o FIO ao executar testes de benchmarking. Para obter mais informações, consulte ferramentas e testes de benchmarking.
Lista de verificação de início rápido
- Verificar pré-requisitos: Garantir que o CLI do Azure 2.0.59+, o driver CSI do Ficheiros do Azure esteja ativado e a conta de armazenamento disponível
-
Escolha ou crie uma classe de armazenamento: Use classes incorporadas (
azurefile-csi,azurefile-csi-premium) ou crie uma personalizada - Criar um PersistentVolumeClaim (PVC): Definir o tamanho do armazenamento e o modo de acesso (tipicamente ReadWriteMany)
- Crie um pod: Faça referência ao PVC na configuração de volume do seu pod
-
Verifique a montagem: Confirme que o volume está montado corretamente utilizando
kubectl describe pod
Pré-requisitos
- CLI do Azure versão 2.0.59 ou posterior instalada e configurada. Encontre a versão usando o
az --versioncomando. Para instalar ou atualizar, consulte Install CLI do Azure. - O driver CSI Ficheiros do Azure foi ativado no seu cluster AKS.
- Uma conta de armazenamento Azure.
- Ao escolher entre partilhas de ficheiros SSD (Premium) e HDD (Standard), é importante que compreenda o modelo de provisionamento e os requisitos do padrão de utilização esperado que planeia executar no Ficheiros do Azure. Ficheiros do Azure tem três modelos de faturação: provisioned v2 (recomendado), pay-as-you-go, e o legado provisioned v1. Para mais informações, veja Escolher um Ficheiros do Azure nível de desempenho com base nos padrões de utilização.
Crie um volume completo com provisionamento dinâmico
O exemplo seguinte cria uma classe de armazenamento Ficheiros do Azure de uso geral, um PVC que provisiona dinamicamente uma partilha de ficheiros e um pod que monta a partilha de ficheiros. O exemplo utiliza o Standard_LRS SKU e o protocolo SMB. Para cargas de trabalho em produção, escolha o nível de desempenho do Ficheiros do Azure e a opção de redundância que satisfaça os seus requisitos de desempenho e disponibilidade.
Crie um arquivo nomeado
azure-file-dynamic.yamle cole no seguinte manifesto:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: azurefile-csi-standard provisioner: file.csi.azure.com allowVolumeExpansion: true reclaimPolicy: Delete volumeBindingMode: Immediate parameters: skuName: Standard_LRS protocol: smb --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: azurefile-pvc spec: accessModes: - ReadWriteMany storageClassName: azurefile-csi-standard resources: requests: storage: 5Gi --- apiVersion: v1 kind: Pod metadata: name: azurefile-app spec: containers: - name: nginx image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - name: azurefile-volume mountPath: /mnt/azure volumes: - name: azurefile-volume persistentVolumeClaim: claimName: azurefile-pvcAplique o manifesto usando o
kubectl applycomando:kubectl apply -f azure-file-dynamic.yamlConfirme que o PVC está no
Boundestado e que a cápsula está noRunningestado:kubectl get storageclass azurefile-csi-standard kubectl get pvc azurefile-pvc kubectl get pod azurefile-appVerifique se o pod consegue escrever na e ler da partilha de ficheiros aprovisionada dinamicamente:
kubectl exec azurefile-app -- sh -c "echo 'Azure Files is mounted' > /mnt/azure/test.txt" kubectl exec azurefile-app -- cat /mnt/azure/test.txtSua saída deve ser semelhante à saída de exemplo a seguir:
Azure Files is mountedQuando deixar de precisar dos recursos de exemplo, elimine-os:
kubectl delete -f azure-file-dynamic.yamlComo a classe de armazenamento utiliza a
Deletepolítica de recuperação, eliminar o PVC também elimina a partilha de ficheiros Azure provisionada dinamicamente.
Use classes de armazenamento incorporadas para criar PVs dinâmicos com o Ficheiros do Azure
As classes de armazenamento definem como uma unidade de armazenamento é criada dinamicamente com um volume persistente. Uma conta de armazenamento é criada automaticamente no grupo de recursos node para ser usada com a classe de armazenamento que armazena a Ficheiros do Azure partilha de ficheiros. Quando usas drivers CSI no AKS, existem dois StorageClasses extra incorporados que usam os drivers de armazenamento CSI Ficheiros do Azure (as outras classes de armazenamento CSI são criadas com o cluster juntamente com as classes de armazenamento padrão na árvore):
-
azurefile-csi: Cria uma partilha de ficheiros Azure no armazenamento HDD. -
azurefile-csi-premium: Cria uma partilha de ficheiros Azure no armazenamento SSD.
A política de reclaim em ambas as classes de armazenamento garante que a partilha de ficheiros subjacente do Azure é apagada quando o respetivo PV é eliminado. As classes de armazenamento também configuram os compartilhamentos de arquivos para serem expansíveis, você só precisa editar a declaração de volume persistente (PVC) com o novo tamanho.
Pode selecionar um dos seguintes SKUs de redundância de armazenamento do Azure para o parâmetro skuname na definição da classe de armazenamento:
- PremiumV2_LRS (recomendado): SSD provisionado v2, armazenamento localmente redundante
- PremiumV2_ZRS (recomendado): SSD provisionado v2, armazenamento redundante por zona
- Premium_LRS: SSD provisionado v1 (legacy), armazenamento localmente redundante
- Premium_ZRS: SSD provisionado v1 (legacy), armazenamento redundante em zona
- StandardV2_LRS: HDD provisionado v2, armazenamento localmente redundante
- StandardV2_ZRS: HDD provisionado v2, armazenamento redundante por zonas
- StandardV2_GRS: HDD provisionado v2, armazenamento geo-redundante
- StandardV2_GZRS: HDD pré-configurado v2, armazenamento geo-redundante por zona
- Standard_LRS: HDD pagamento conforme o uso, armazenamento localmente redundante
- Standard_GRS: HDD pago por utilização, armazenamento geo-redundante
- Standard_ZRS: HDD com pagamento conforme o uso, armazenamento de redundância zonal
Importante
Para usar o modelo de faturação provisionada v2 para Ficheiros do Azure, deve usar o driver CSI Ficheiros do Azure versão 1.35.0 ou posterior.
Observação
Para novas implementações, recomendamos o SSD provisionado v2 (PremiumV2_LRS ou PremiumV2_ZRS) para a maioria das cargas de trabalho. As partilhas de ficheiros SSD oferecem maior desempenho e suporte de disco de baixa latência para cargas de trabalho intensivas em I/O. A capacidade mínima de partilha de ficheiros para contas Premium é de 100 GiB.
Criar classes de armazenamento personalizadas para PVs dinâmicos com o Ficheiros do Azure
As classes de armazenamento padrão são adequadas para a maioria dos cenários. Em alguns casos, pode querer personalizar a sua própria classe de armazenamento com os seus próprios parâmetros. Por exemplo, pode querer configurar o mountOptions da partilha de ficheiros.
Crie um ficheiro com nome
azure-file-sc.yamle cole no seguinte manifesto de exemplo:kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: my-azurefile provisioner: file.csi.azure.com reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true mountOptions: # Canonical permissions: 0755/uid=1000/gid=1000 for least privilege. # Use 0777/uid=0/gid=0 only if app requires root or broad write access. - dir_mode=0755 - file_mode=0755 - uid=1000 - gid=1000 - mfsymlinks - cache=strict - actimeo=30 - nosharesock parameters: skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS (SSD v1), StandardV2_LRS (HDD v2), Standard_LRS (HDD pay-as-you-go)Crie a classe de armazenamento usando o
kubectl applycomando:kubectl apply -f azure-file-sc.yamlSua saída deve ser semelhante à saída de exemplo a seguir:
storageclass.storage.k8s.io/my-azurefile created
Parâmetros de classe de armazenamento para PVs dinâmicos com Ficheiros do Azure
A tabela seguinte inclui parâmetros que pode usar para definir uma classe de armazenamento personalizada para as suas reivindicações de volume persistente (PVCs) com o Ficheiros do Azure:
| Nome | Meaning | Valores disponíveis | Obrigatório | Valor predefinido |
|---|---|---|---|---|
accountAccessTier |
Nível de acesso para conta de armazenamento | A conta Standard pode escolher Hot ou Cool, e a conta Premium só pode escolher Premium. |
Não | Empty. Use a configuração padrão para diferentes tipos de conta de armazenamento. |
accountQuota |
Limita a cota de uma conta. Pode especificar uma quota máxima em GB (102400 GB por padrão). Se a conta exceder a cota especificada, o driver ignorará a seleção da conta. | Não | 102400 |
|
allowBlobPublicAccess |
Permitir ou não permitir o acesso público a todos os blobs ou contêineres para a conta de armazenamento criada pelo driver. |
true ou false |
Não | false |
createFolderIfNotExist |
Especifique se deve criar a pasta se ela não existir na partilha de ficheiros do Azure. Suportado pelo driver CSI do Ficheiros do Azure v1.34.0. |
true ou false |
Não | false |
disableDeleteRetentionPolicy |
Especifique se deve desabilitar DeleteRetentionPolicy para a conta de armazenamento criada pelo driver. |
true ou false |
Não | false |
enableLargeFileShares |
Indique se a conta de armazenamento deve ter partilhas de ficheiros grandes ativadas. Use este parâmetro apenas numa conta Standard, porque as contas Premium já suportam grandes partilhas de ficheiros por defeito. |
true ou false |
Não | false |
folderName |
Especifique o nome da pasta na partilha de ficheiros do Azure. Suporta os marcadores de posição ${pvc.metadata.name}, ${pvc.metadata.namespace} e ${pv.metadata.name}. |
Nome de pasta existente na partilha de ficheiros do Azure. | Não | Se o nome da pasta não existir no compartilhamento de arquivos, a montagem falhará. |
getLatestAccount |
Determina se deve obter a chave de conta mais recente com base na data de criação. Este driver obtém a primeira chave por padrão. |
true ou false |
Não | false |
location |
Especifique a região Azure da conta de armazenamento Azure. | Por exemplo, eastus. |
Não | Se estiver vazio, o driver usará o mesmo nome de local do cluster AKS atual. |
matchTags |
Alinhar tags quando o driver tenta localizar uma conta de armazenamento adequada. |
true ou false |
Não | false |
networkEndpointType |
Especifique o tipo de ponto de extremidade de rede para a conta de armazenamento criada pelo driver. Caso privateEndpoint seja especificado, será criado um ponto de extremidade privado para a conta de armazenamento. Para outros casos, um ponto de extremidade de serviço é criado por padrão. |
"",privateEndpoint |
Não | "" |
protocol |
Especifique o protocolo de compartilhamento de arquivos. |
smb, nfs |
Não | smb |
provisionedBandwidth |
Débito aprovisionado (MiB/s) para o modelo v2 aprovisionado do Ficheiros do Azure. Aplicável apenas aos SKUs PremiumV2 e StandardV2. Suportado a partir do driver v1.33.4. |
Cadeia de caracteres inteira, por exemplo "200". |
Não | |
provisionedIOPS |
Provisioned IOPS para o modelo Ficheiros do Azure provisioned v2. Aplicável apenas aos SKUs PremiumV2 e StandardV2. Suportado a partir do driver v1.33.4. |
Cadeia de caracteres inteira, por exemplo "5000". |
Não | |
requireInfraEncryption |
Especifique se o serviço aplica ou não uma camada secundária de criptografia com chaves gerenciadas pela plataforma para dados em repouso para a conta de armazenamento criada pelo driver. |
true ou false |
Não | false |
resourceGroup |
Especifique o grupo de recursos para a conta de armazenamento do Ficheiros do Azure. | Nome do grupo de recursos existente | Não | Se estiver vazio, o driver usa o mesmo nome de grupo de recursos do cluster AKS atual. |
selectRandomMatchingAccount |
Determina se uma conta correspondente deve ser selecionada aleatoriamente. Por padrão, o driver sempre seleciona a primeira conta correspondente em ordem alfabética (Observação: esse driver usa o cache de pesquisa de conta, o que resulta em uma distribuição desigual da criação de arquivos entre várias contas). |
true ou false |
Não | false |
server |
Especifique o endereço do servidor da conta de armazenamento Azure. | Endereço do servidor existente, por exemplo accountname.privatelink.file.core.windows.net. |
Não | Se estiver vazio, o driver usa o endereço padrão accountname.file.core.windows.net ou outro endereço de conta de nuvem soberana. |
shareAccessTier |
Camada de acesso para compartilhamento de arquivos | A conta v2 de uso geral pode escolher entre TransactionOptimized (padrão), Hote Cool. Tipo de conta de armazenamento premium apenas para compartilhamentos de arquivos. |
Não | Empty. Use a configuração padrão para diferentes tipos de conta de armazenamento. |
shareName |
Especifique o nome da partilha de ficheiros do Azure. | Nome de partilha de ficheiros Azure existente ou novo. | Não | Se estiver vazio, o driver gera um nome de partilha de ficheiro Azure. |
shareNamePrefix |
Especifique o prefixo do nome da partilha de ficheiros do Azure criado pelo driver. | O nome do compartilhamento só pode conter letras minúsculas, números, hífenes e o comprimento deve ter menos de 21 caracteres. | Não | |
skuName |
Tipo de conta de armazenamento do Ficheiros do Azure (pseudónimo: storageAccountType) |
Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Standard_RAGZRS, Premium_LRS, Premium_ZRS, StandardV2_LRS, StandardV2_ZRS, StandardV2_GRS, StandardV2_GZRS, PremiumV2_LRS, PremiumV2_ZRS |
Não | Standard_LRS O tamanho mínimo de compartilhamento de arquivos para o tipo de conta Premium é de 100 GB. O tipo de conta ZRS é suportado em regiões limitadas. O compartilhamento de arquivos NFS suporta apenas o tipo de conta Premium. Os nomes de SKU V2 padrão são para o modelo provisionado v2 do Ficheiros do Azure. |
storageAccount |
Especifique um nome de conta de armazenamento Azure. | storageAccountName | Não | Quando um nome de conta de armazenamento específico não é fornecido, o driver procurará uma conta de armazenamento adequada que corresponda às configurações da conta dentro do mesmo grupo de recursos. Se não conseguir encontrar uma conta de armazenamento correspondente, criará uma nova. No entanto, se um nome de conta de armazenamento for especificado, a conta de armazenamento já deverá existir. |
storageEndpointSuffix |
Especificar o sufixo do endpoint de armazenamento Azure. |
core.windows.net, core.chinacloudapi.cn, etc. |
Não | Se estiver vazio, o driver usa o sufixo de ponto de extremidade de armazenamento padrão de acordo com o ambiente de nuvem. Por exemplo, core.windows.net. |
subscriptionID |
Especifique o ID de subscrição do Azure onde a partilha de ficheiros do Azure é criada. | ID de subscrição do Azure | Não | Se não estiver vazio, resourceGroup deve ser fornecido. |
tags |
As tags são criadas em uma nova conta de armazenamento. | Formato da tag: 'foo=aaa,bar=bbb' | Não | "" |
| --- | Os seguintes parâmetros são apenas para o protocolo SMB | --- | --- | --- |
clientID |
Especifique o ID do cliente Azure usado para criar a partilha de ficheiros Azure. Se estiver vazia, a identidade gerida do kubelet é usada ao montar sem chave de conta. | ID do cliente do Azure | Não | |
enableMultichannel |
Especifique se deve ativar o multicanal SMB para uma conta de armazenamento Premium. Usado com a opção de montagem max_channels=4 (ou 2, 3). |
true ou false |
Não | false |
storeAccountKey |
Especifique se deseja armazenar a chave da conta no segredo do Kubernetes. |
true ou false false significa que o driver utiliza a identidade do kubelet para obter a chave da conta. |
Não | true |
secretName |
Especifique o nome secreto para armazenar a chave da conta. | Não | ||
secretNamespace |
Especifique o namespace do segredo para armazenar a chave da conta. Observação: Se secretNamespace não for especificado, o segredo será criado no mesmo namespace do pod. |
default,kube-system, etc. |
Não | Namespace PVC, por exemplo csi.storage.k8s.io/pvc/namespace |
useDataPlaneAPI |
Especifica se deves usar data plane API para criar/eliminar/redimensionar partilhas de ficheiros, o que poderia resolver o problema de limitação da API SRP porque a API do plano de dados quase não tem limite, enquanto falharia quando houver definições de firewall ou Vnet na conta de armazenamento. O oauth valor (suportado pelo driver v1.33.0) utiliza um token OAuth para autenticação da API do plano de dados. |
true, false ou oauth |
Não | false |
| --- | Os seguintes parâmetros são apenas para o protocolo NFS | --- | --- | --- |
allowSharedKeyAccess |
Permitir ou impedir o acesso à chave partilhada para a conta de armazenamento criada pelo driver. |
true ou false |
Não | true |
encryptInTransit |
Suporta encriptação de dados em trânsito (EiT) para partilhas NFS. |
true ou false |
Não | false |
mountPermissions |
Permissões de pasta montada. A predefinição é 0777. Se definido como 0, o driver não executa chmod após montagem |
0777 |
Não | |
rootSquashType |
Especifique o comportamento de esmagamento de raiz no compartilhamento. A predefinição é NoRootSquash |
AllSquash, NoRootSquash, RootSquash |
Não | |
| --- | Os seguintes parâmetros são apenas para definição de rede virtual (por exemplo: NFS, ponto final privado) | --- | --- | --- |
fsGroupChangePolicy |
Indica como o driver altera a propriedade do volume. Pod securityContext.fsGroupChangePolicy é ignorado. |
OnRootMismatch (por defeito), Always, None |
Não | OnRootMismatch |
publicNetworkAccess |
A propriedade PublicNetworkAccess da conta de armazenamento criada pelo controlador. |
Enabled, Disabled, SecuredByPerimeter |
Não | |
subnetName |
Nome de sub-rede | Nome da sub-rede existente do nó do agente. | Não | Se estiver vazio, o driver usa o valor subnetName no ficheiro de configuração da nuvem Azure. |
vnetLinkName |
Nome da ligação de rede virtual associado à zona DNS privada. | Nome da ligação vnet existente. | Não | Se estiver vazio, o driver usa <vnetName>-vnetlink. |
vnetName |
Nome da rede virtual | Nome da rede virtual existente. | Não | Se estiver vazia, o driver atualizará todas as subredes sob a rede virtual do cluster. |
vnetResourceGroup |
Especifique o grupo de recursos da rede virtual onde a rede virtual está definida. | Nome do grupo de recursos existente. | Não | Se estiver vazio, o driver usa o valor vnetResourceGroup no ficheiro de configuração da nuvem Azure. |
Importante
O parâmetro de classe de armazenamento tags é aplicado à conta de armazenamento quando o Ficheiros do Azure driver CSI provisiona o volume. Depois de criado o volume persistente, a PersistentVolume especificação é imutável, pelo que a edição ou correção do PV para alterar tags ou outros atributos de volume não é possível. Atualizar a classe de armazenamento mais tarde afeta apenas volumes recém-provisionados.
Para atualizar etiquetas num volume existente, altere-as na conta de armazenamento subjacente no Azure. Se a tua classe de armazenamento usar uma conta de armazenamento existente, atualiza as etiquetas dessa conta. Esta operação não interrompe montagens, pods ou acesso a dados existentes, e as tags atualizadas do Azure não são sincronizadas com o YAML PV ou metadados do Kubernetes. Por exemplo:
az storage account update \
--name mystorageaccount \
--resource-group MC_myResourceGroup_myAKSCluster_eastus \
--set tags.abc=ABC123
Observação
Se a conta de armazenamento for criada pelo driver, então só precisas de especificar networkEndpointType: privateEndpoint o parâmetro na classe de armazenamento. O driver CSI cria o ponto de extremidade privado e a zona DNS privada (chamada privatelink.file.core.windows.net) juntamente com a conta. Se trouxeres a tua própria conta de armazenamento, precisarás de criar o ponto de extremidade privado para a conta de armazenamento. Se estiver a usar armazenamento Ficheiros do Azure num cluster isolado em rede, deve criar uma classe de armazenamento personalizada com "networkEndpointType: privateEndpoint". Pode usar o seguinte exemplo de manifesto como referência:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi-private-custom
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, Premium_ZRS, StandardV2_LRS, Standard_LRS
networkEndpointType: privateEndpoint
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
# Canonical permissions: 0755/uid=1000/gid=1000 for least privilege.
# Use 0777/uid=0/gid=0 only if app requires root or broad write access.
- dir_mode=0755
- file_mode=0755
- uid=1000
- gid=1000
- mfsymlinks
- cache=strict # https://linux.die.net/man/8/mount.cifs
- nosharesock # reduce probability of reconnect race
- actimeo=30 # reduce latency for metadata-heavy workload
- nobrl # disable sending byte range lock requests to the server and for applications which have challenges with posix locks
Crie um PVC com Ficheiros do Azure
Um PVC utiliza o objeto de classe de armazenamento para aprovisionar de forma dinâmica uma partilha de ficheiros do Azure. Pode usar o manifesto YAML de exemplo nesta secção para criar um PVC que tem o tamanho de 100 GB com o acesso ReadWriteMany. Para mais informações sobre modos de acesso, veja Modos de acesso PV do Kubernetes.
Crie um ficheiro nomeado
azure-file-pvc.yamle cole o YAML seguinte. Certifica-te de questorageClassNamecorresponde ao nome da tua classe de armazenamento existente.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-azurefile spec: accessModes: - ReadWriteMany storageClassName: my-azurefile resources: requests: storage: 100GiObservação
Se estiver usando a
Premium_LRSSKU para sua classe de armazenamento, o valor mínimo parastoragedeve ser100Gi.Cria o PVC usando o
kubectl applycomando.kubectl apply -f azure-file-pvc.yamlVeja o estado do PVC usando o
kubectl getcomando:kubectl get pvc my-azurefileA sua saída deve assemelhar-se ao exemplo seguinte, que mostra que o PVC está num
Boundestado, e que um PV foi criado dinamicamente para satisfazer a requisição.NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE my-azurefile Bound pvc-aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb 100Gi RWX my-azurefile 5m
Use um PVC com Ficheiros do Azure num pod
O manifesto YAML de exemplo nesta seção cria um pod que usa o PVC my-azurefile para montar a partilha de ficheiros do Ficheiros do Azure no diretório /mnt/azure. Para Windows Server contentores, especifique um mountPath usando a convenção do caminho Windows, como 'D:'.
Crie um ficheiro chamado
azure-pvc-files.yaml, e cole o seguinte YAML. Certifique-se de que oclaimNamecorresponde ao nome do seu PVC existente.kind: Pod apiVersion: v1 metadata: name: mypod spec: containers: - name: mypod 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 readOnly: false volumes: - name: volume persistentVolumeClaim: claimName: my-azurefileCrie o pod usando o
kubectl applycomando.kubectl apply -f azure-pvc-files.yamlVeja o estado do pod usando o
kubectl describecomando:kubectl describe pod mypodA sua saída deve assemelhar-se à seguinte saída de exemplo, que mostra que o pod está a funcionar e o volume está montado no caminho correto:
Containers: mypod: Container ID: docker://BB22CC33DD44EE55FF66AA77BB88CC99DD00EE11 Image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine Image ID: docker-pullable://nginx@sha256:AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00 State: Running Started: Fri, 01 Mar 2019 23:56:16 +0000 Ready: True Mounts: /mnt/azure from volume (rw) /var/run/secrets/kubernetes.io/serviceaccount from default-token-8rv4z (ro) [...] Volumes: volume: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: my-azurefile ReadOnly: false [...]
Opções de montagem para Ficheiros do Azure
A localização para configurar as opções de montagem (mountOptions) depende se está a provisionar volumes persistentes dinâmicos ou estáticos:
- Se estiveres a provisionar dinamicamente um volume com uma classe de armazenamento, especifica as opções de montagem no objeto de classe de armazenamento (tipo: StorageClass).
- Se estiveres a provisionar um volume estaticamente, especifica as opções de montagem no objeto PV (tipo: PersistentVolume).
- Se estiver montando o compartilhamento de arquivos como um volume integrado, especifique as opções de montagem no objeto Pod (espécie: Pod).
Para obter mais informações, consulte Opções de montagem.
O valor padrão para fileMode e dirMode é 0777 para Kubernetes versões 1.13.0 e superiores. O exemplo a seguir define 0777:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: my-azurefile
provisioner: file.csi.azure.com
allowVolumeExpansion: true
mountOptions:
# Canonical permissions: 0755/uid=1000/gid=1000 for least privilege.
# Use 0777/uid=0/gid=0 only if app requires root or broad write access.
- dir_mode=0755
- file_mode=0755
- uid=1000
- gid=1000
- mfsymlinks
- cache=strict
- actimeo=30
- nobrl # disable sending byte range lock requests to the server and for applications which have challenges with posix locks
parameters:
skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS (SSD v1), StandardV2_LRS (HDD v2), Standard_LRS (HDD pay-as-you-go)
Opções de montagem recomendadas para ações SMB
As opções de montagem recomendadas para compartilhamentos SMB são fornecidas no seguinte exemplo de classe de armazenamento:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi-premiumv2-custom
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, Premium_ZRS, StandardV2_LRS, Standard_LRS, Standard_ZRS
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
# Canonical permissions: 0755/uid=1000/gid=1000 for least privilege.
# Use 0777/uid=0/gid=0 only if app requires root or broad write access.
- dir_mode=0755
- file_mode=0755
- uid=1000
- gid=1000
- mfsymlinks # support symbolic links
- cache=strict # https://linux.die.net/man/8/mount.cifs
- nosharesock # reduces probability of reconnect race
- actimeo=30 # reduces latency for metadata-heavy workload
- nobrl # disable sending byte range lock requests to the server and for applications which have challenges with posix locks
Se estiveres a usar partilhas de ficheiros premium (SSD) com o protocolo SMB e a tua carga de trabalho for pesada em metadados, inscreve-te para usar a funcionalidade de cache de metadados para melhorar o desempenho.
Para mais informações, veja Melhorar o desempenho para partilhas de ficheiros SMB Azure.
Opções de montagem recomendadas para ações NFS
As opções de montagem recomendadas para compartilhamentos NFS são fornecidas no seguinte exemplo de classe de armazenamento:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi-premiumv2-custom
provisioner: file.csi.azure.com
parameters:
protocol: nfs
skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, Premium_ZRS, PremiumV2_ZRS
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
- nconnect=4 # improves performance by enabling multiple connections to share
- noresvport # improves availability
- actimeo=30 # reduces latency for metadata-heavy workloads
Aumente o tamanho da leitura antecipada para melhorar o rendimento de leitura.
Embora o Ficheiros do Azure suporte a configuração nconnect até à definição máxima de 16, recomendamos configurar as opções de montagem com a definição ótima de nconnect=4. Atualmente, não há ganhos além de quatro canais para a implementação do nconnect no Ficheiros do Azure.
Crie um snapshot de volume a partir de um PVC com o Ficheiros do Azure
O Ficheiros do Azure driver CSI suporta a criação de snapshots de volumes persistentes e das partilhas de ficheiros subjacentes.
Crie uma classe de snapshot de volume com o comando
kubectl apply:kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/snapshot/volumesnapshotclass-azurefile.yamlSua saída deve ser semelhante à saída de exemplo a seguir:
volumesnapshotclass.snapshot.storage.k8s.io/csi-azurefile-vsc createdCrie um snapshot de volume a partir do PVC dinâmico que criou anteriormente neste tutorial usando o
kubectl applycomando:kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/snapshot/volumesnapshot-azurefile.yamlSua saída deve ser semelhante à saída de exemplo a seguir:
volumesnapshot.snapshot.storage.k8s.io/azurefile-volume-snapshot createdVeja o estado do instantâneo de volume usando o
kubectl describecomando:kubectl describe volumesnapshot azurefile-volume-snapshotA sua saída deve assemelhar-se à seguinte saída de exemplo, que mostra que o snapshot de volume não está pronto a ser usado porque o driver ainda está a criar o snapshot da partilha de ficheiros do Azure subjacente:
Name: azurefile-volume-snapshot Namespace: default Labels: <none> Annotations: API Version: snapshot.storage.k8s.io/v1beta1 Kind: VolumeSnapshot Metadata: Creation Timestamp: 2020-08-27T22:37:41Z Finalizers: snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection snapshot.storage.kubernetes.io/volumesnapshot-bound-protection Generation: 1 Resource Version: 955091 Self Link: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/azurefile-volume-snapshot UID: 00aa00aa-bb11-cc22-dd33-44ee44ee44ee Spec: Source: Persistent Volume Claim Name: pvc-azurefile Volume Snapshot Class Name: csi-azurefile-vsc Status: Bound Volume Snapshot Content Name: snapcontent-00aa00aa-bb11-cc22-dd33-44ee44ee44ee Ready To Use: false Events: <none>
Redimensione um volume persistente com Ficheiros do Azure
Observação
A redução de volumes persistentes não é atualmente suportada. Tentar reparar um PVC existente com um tamanho menor do que o atual leva à seguinte mensagem de erro:
The persistentVolumeClaim "pvc-azurefile" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value.
Pode pedir um volume maior para um PVC editando o objeto PVC para especificar um tamanho maior. Esta alteração aciona a expansão do volume subjacente que suporta o PV. Um novo PV nunca é criado para satisfazer a reclamação. Em vez disso, é redimensionado um volume existente.
No AKS, a classe de armazenamento incorporada azurefile-csi suporta expansão. As classes de armazenamento personalizadas devem definir allowVolumeExpansion: true. O PVC solicitou um compartilhamento de arquivos de 100 GiB.
Verifique o tamanho atual do PVC e do sistema de ficheiros dentro do pod usando o
kubectl execcomando para executar odf -hcomando dentro do pod:kubectl exec -it nginx-azurefile -- df -h /mnt/azurefileA sua saída deve assemelhar-se à seguinte saída de exemplo, que mostra que o sistema de ficheiros tem 100 GB de tamanho:
Filesystem Size Used Avail Use% Mounted on //a123b4c567de89fghi01jk2.file.core.windows.net/pvc-00aa00aa-bb11-cc22-dd33-44ee44ee44ee 100G 128K 100G 1% /mnt/azurefileExpanda o PVC aumentando o campo
spec.resources.requests.storageusando o comandokubectl patch. Neste exemplo, aumentamos a partilha de ficheiros para 200 GiB:kubectl patch pvc pvc-azurefile --type merge --patch '{"spec": {"resources": {"requests": {"storage": "200Gi"}}}}'O resultado deve ser semelhante ao seguinte exemplo, que mostra que o PVC foi corrigido com sucesso.
persistentvolumeclaim/pvc-azurefile patchedVerifique se o PVC foi redimensionado com sucesso e o novo tamanho é refletido no pod usando os comandos
kubectl get pvcedf -hdentro do pod.kubectl get pvc pvc-azurefileA sua saída deve assemelhar-se ao seguinte exemplo, que mostra que o PVC ainda está num
Boundestado, e a capacidade foi atualizada para 200 GiB:NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-azurefile Bound pvc-00aa00aa-bb11-cc22-dd33-44ee44ee44ee 200Gi RWX azurefile-csi 64mVerifique o novo tamanho do sistema de ficheiros dentro do pod usando o
kubectl execcomando para executar odf -hcomando dentro do pod:kubectl exec -it nginx-azurefile -- df -h /mnt/azurefileA sua saída deve assemelhar-se à seguinte saída de exemplo, que mostra que o sistema de ficheiros tem agora 200 GB de tamanho:
Filesystem Size Used Avail Use% Mounted on //a123b4c567de89fghi01jk2.file.core.windows.net/pvc-bbbbbbbb-1111-2222-3333-cccccccccccc 200G 128K 200G 1% /mnt/azurefile
Use um volume persistente com armazenamento privado do Ficheiros do Azure (endpoint privado)
Se os seus recursos do Ficheiros do Azure estiverem protegidos com um endpoint privado, deve criar a sua própria classe de armazenamento. Certifica-te de que configuraste as configurações de DNS para resolver o endereço IP do endpoint privado para o FQDN da cadeia de conexão. Ao criar a classe de armazenamento usando o driver Ficheiros do Azure CSI, precisa de especificar o parâmetro networkEndpointType com o valor privateEndpoint, e fornecer os seguintes parâmetros:
-
resourceGroup: O grupo de recursos onde a conta de armazenamento é implantada. -
storageAccount: O nome da conta de armazenamento. -
server: O FQDN do ponto de extremidade privado da conta de armazenamento.
Crie um ficheiro com nome
private-azure-file-sc.yamle depois cole o manifesto seguinte. Certifique-se de substituir os marcadores de lugar para<resourceGroup>e<storageAccountName>.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: azurefile-csi-private-custom provisioner: file.csi.azure.com allowVolumeExpansion: true parameters: skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, StandardV2_LRS resourceGroup: <resourceGroup> storageAccount: <storageAccountName> server: <storageAccountName>.file.core.windows.net networkEndpointType: privateEndpoint reclaimPolicy: Delete volumeBindingMode: Immediate mountOptions: # Canonical permissions: 0755/uid=1000/gid=1000 for least privilege. # Use 0777/uid=0/gid=0 only if app requires root or broad write access. - dir_mode=0755 - file_mode=0755 - uid=1000 - gid=1000 - mfsymlinks - cache=strict # https://linux.die.net/man/8/mount.cifs - nosharesock # reduce probability of reconnect race - actimeo=30 # reduce latency for metadata-heavy workload - nobrlCrie a classe de armazenamento usando o
kubectl applycomando:kubectl apply -f private-azure-file-sc.yamlSua saída deve ser semelhante à saída de exemplo a seguir:
storageclass.storage.k8s.io/private-azurefile-csi createdCrie um ficheiro com nome
private-pvc.yamle cole no manifesto seguinte. Certifica-te de questorageClassNamecorresponde ao nome da tua classe de armazenamento existente.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: private-azurefile-pvc spec: accessModes: - ReadWriteMany storageClassName: private-azurefile-csi resources: requests: storage: 100GiCria o PVC usando o
kubectl applycomando.kubectl apply -f private-pvc.yaml
Use Ficheiros do Azure com contentores do Windows
O driver CSI do Ficheiros do Azure também suporta nós e contentores do Windows. Para usar contentores Windows, siga o início rápido dos contentores Windows para adicionar um pool de nós Windows. Depois de teres um pool de nós Windows, podes usar as classes de armazenamento incorporadas como azurefile-csi ou criar uma personalizada. O exemplo conjunto com estado baseado no Windows nesta secção guarda carimbos de data e hora num ficheiro data.txt a cada segundo, que é montado numa partilha de ficheiros do Azure usando o driver CSI do Ficheiros do Azure.
Crie o conjunto com estado usando o
kubectl applycomando:kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/windows/statefulset.yamlSua saída deve ser semelhante à saída de exemplo a seguir:
statefulset.apps/busybox-azurefile createdValide que os carimbos temporais estão a ser escritos na partilha de ficheiros usando os seguintes
kubectl execcomandos para executar ocatcomando dentro do pod:kubectl exec -it busybox-azurefile-0 -- cat c:\\mnt\\azurefile\\data.txt # on Linux/MacOS Bash kubectl exec -it busybox-azurefile-0 -- cat c:\mnt\azurefile\data.txt # on Windows Powershell/CMDA sua saída deve assemelhar-se à seguinte saída de exemplo, que mostra que os carimbos temporais estão a ser escritos na partilha de ficheiros a cada segundo:
2020-08-27 22:11:01Z 2020-08-27 22:11:02Z 2020-08-27 22:11:04Z (...)
Use o protocolo NFS com Ficheiros do Azure
Ficheiros do Azure suporta o protocolo NFS v4.1. O suporte NFS versão 4.1 para Ficheiros do Azure proporciona-lhe um sistema de ficheiros NFS totalmente gerido como um serviço, construído numa plataforma de armazenamento distribuído resiliente altamente disponível e muito durável.
Esta opção é otimizada para cargas de trabalho de acesso aleatório com atualizações de dados in-loco e fornece suporte completo ao sistema de arquivos POSIX. Esta secção mostra-lhe como usar partilhas NFS com o driver CSI do Ficheiros do Azure num cluster AKS.
Pré-requisitos para usar partilhas NFS com Ficheiros do Azure
- O NFS exige partilhas de ficheiros SSD (como
PremiumV2_LRS,PremiumV2_ZRS,Premium_LRS, ouPremium_ZRS) e uma conta de armazenamento virtual habilitada para rede. - A identidade do plano de controlo do seu cluster AKS (ou seja, o nome do cluster AKS) é adicionada ao papel de Contribuidor na VNet e no Grupo de Segurança da Rede.
- O principal de serviço ou a identidade gerida do seu cluster AKS devem ser atribuídos à função de Contribuidor na conta de armazenamento.
Observação
Você pode usar um ponto de extremidade privado em vez de permitir o acesso à VNet selecionada.
Otimizar opções de tamanho de leitura e escrita
Esta secção fornece informações sobre como abordar a otimização de desempenho NFS com o driver Ficheiros do Azure CSI, com as opções rsize e wsize. As rsize opções e wsize definem o tamanho máximo de transferência de uma operação NFS. Se rsize ou wsize não forem especificados durante a montagem, o cliente e o servidor negociarão o maior tamanho suportado por ambos. Atualmente, tanto o Ficheiros do Azure como as distribuições Linux modernas suportam tamanhos de leitura e escrita de até 1.048.576 Bytes (1 MiB).
O desempenho ideal baseia-se na comunicação eficiente cliente-servidor. Aumentar ou diminuir os valores de tamanho da opção de leitura e gravação mount pode melhorar o desempenho do NFS. O tamanho padrão dos pacotes de leitura/gravação transferidos entre cliente e servidor são 8 KB para NFS versão 2 e 32 KB para NFS versão 3 e 4. Estes valores podem ser demasiado grandes ou demasiado pequenos. Reduzir o rsize e wsize pode melhorar o desempenho do NFS numa rede congestionada ao enviar pacotes mais pequenos para cada resposta e pedido de escrita lido pelo NFS. No entanto, isso pode aumentar o número de pacotes necessários para enviar dados pela rede, aumentando o tráfego total da rede e a utilização da CPU no cliente e no servidor.
É importante que realizes testes para encontrar um rsize e um wsize que sustentem uma transferência eficiente de pacotes e que não diminuam o débito nem aumentem a latência.
O seguinte manifesto de exemplo configura a secção mountOptions numa classe de armazenamento para um máximo de rsize e wsize de 256 KiB:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi-premiumv2-custom
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
protocol: nfs
skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, Premium_ZRS, PremiumV2_ZRS
mountOptions:
- nconnect=4
- noresvport
- actimeo=30
- rsize=262144
- wsize=262144
Para obter uma lista de opções suportadas mountOptions, consulte Opções de montagem NFS.
Criar classe de armazenamento de compartilhamento de arquivos NFS
Observação
vers, minorversion, sec são configurados pelo driver CSI do Ficheiros do Azure. Não é suportada a especificação de um valor no manifesto para estas propriedades.
Crie um ficheiro com nome
nfs-sc.yamle cole no manifesto seguinte. Certifique-se de especificarprotocol: nfsna seção de parâmetros e ajuste omountOptionsconforme necessário para a sua carga de trabalho.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: azurefile-csi-premiumv2-custom provisioner: file.csi.azure.com allowVolumeExpansion: true parameters: protocol: nfs skuName: PremiumV2_LRS # SSD provisioned v2 (recommended). Alternatives: Premium_LRS, Premium_ZRS, PremiumV2_ZRS mountOptions: - nconnect=4 - noresvport - actimeo=30Após editar e guardar o ficheiro, crie a classe de armazenamento usando o
kubectl applycomando.kubectl apply -f nfs-sc.yamlSua saída deve ser semelhante à saída de exemplo a seguir:
storageclass.storage.k8s.io/azurefile-csi-nfs created
Crie um conjunto com estado com uma partilha de ficheiros suportada por NFS
Crie um ficheiro com nome
nfs-ss.yamle cole no manifesto seguinte. Esta configuração guarda timestamps em um ficheirodata.txt.apiVersion: apps/v1 kind: StatefulSet metadata: name: statefulset-azurefile labels: app: nginx spec: podManagementPolicy: Parallel # default is OrderedReady serviceName: statefulset-azurefile replicas: 1 template: metadata: labels: app: nginx spec: nodeSelector: "kubernetes.io/os": linux containers: - name: statefulset-azurefile image: mcr.microsoft.com/oss/nginx/nginx:1.19.5 command: - "/bin/bash" - "-c" - set -euo pipefail; while true; do echo $(date) >> /mnt/azurefile/outfile; sleep 1; done volumeMounts: - name: persistent-storage mountPath: /mnt/azurefile updateStrategy: type: RollingUpdate selector: matchLabels: app: nginx volumeClaimTemplates: - metadata: name: persistent-storage spec: storageClassName: azurefile-csi-premiumv2-custom accessModes: ["ReadWriteMany"] resources: requests: storage: 100GiCrie o conjunto com estado usando o
kubectl applycomando.kubectl apply -f nfs-ss.yamlSua saída deve ser semelhante à saída de exemplo a seguir:
statefulset.apps/statefulset-azurefile createdValide o conteúdo do volume usando o seguinte
kubectl execcomando para executar odf -hcomando dentro do pod:kubectl exec -it statefulset-azurefile-0 -- df -hA sua saída deve assemelhar-se à seguinte saída de exemplo, que mostra que a partilha de ficheiros NFS está montada no caminho correto com o tamanho correto:
Filesystem Size Used Avail Use% Mounted on ... /dev/sda1 29G 11G 19G 37% /etc/hosts accountname.file.core.windows.net:/accountname/pvc-cccccccc-2222-3333-4444-dddddddddddd 100G 0 100G 0% /mnt/azurefile ...Como o compartilhamento de arquivos NFS está em uma conta de armazenamento Premium, o tamanho mínimo de compartilhamento de arquivos é de 100 GiB. Se você criar um PVC com um tamanho de armazenamento pequeno, poderá encontrar um erro semelhante ao seguinte: falha ao criar compartilhamento de arquivos ... tamanho (5)....
Encriptação em trânsito (EiT) para partilhas de ficheiros NFS
Observação
A funcionalidade EiT está disponível a partir da versão 1.33 do AKS. O Ubuntu 20.04 e os nós Windows não são atualmente suportados.
A funcionalidade é suportada em todas as regiões Azure que suportam partilhas de ficheiros Azure SSD.
A encriptação em Trânsito (EiT) garante que todas as leituras e escritas nas partilhas de ficheiros NFS dentro da rede virtual são encriptadas, proporcionando uma camada extra de segurança.
Ao definir os parâmetros na StorageClass encryptInTransit: "true" ou no PersistentVolume volumeAttributes, pode ativar a encriptação de dados em trânsito para partilhas de ficheiros Azure NFS.
Provisão dinâmica (StorageClass)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi-premiumv2-eit
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
protocol: nfs
skuName: PremiumV2_LRS
encryptInTransit: "true"
mountOptions:
- nconnect=4
- noresvport
- actimeo=30
Volumes persistentes existentes
Para PVs que foram criados sem encriptação durante o trânsito, defina encryptInTransit: "true" em volumeAttributes:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-azurefile-eit
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
mountOptions:
- nconnect=4
- noresvport
- actimeo=30
csi:
driver: file.csi.azure.com
volumeHandle: "{resource-group-name}#{account-name}#{file-share-name}"
volumeAttributes:
protocol: nfs
encryptInTransit: "true"
resourceGroup: "{resource-group-name}"
storageAccount: "{account-name}"
shareName: "{file-share-name}"
Use a identidade gerida para aceder ao armazenamento do Ficheiros do Azure
O Ficheiros do Azure agora suporta autenticação baseada em identidade gerida para acesso SMB. Isto permite que as suas aplicações acedam de forma segura ao Ficheiros do Azure sem armazenar ou gerir credenciais.
Observação
O suporte de identidade gerida para Ficheiros do Azure no AKS está disponível a partir da versão 1.34 do AKS nos nós Linux.
Pré-requisitos para usar a identidade gerida para aceder ao armazenamento do Ficheiros do Azure
- Verifique se a identidade do Kubelet atribuída pelo usuário tem a
Storage File Data SMB MI Adminfunção na conta de armazenamento.- Se você usar sua própria conta de armazenamento, precisará atribuir
Storage File Data SMB MI Adminfunção à identidade Kubelet atribuída pelo usuário nessa conta de armazenamento. - Se a conta de armazenamento for criada pelo driver CSI, conceda
Storage File Data SMB MI Admina função ao grupo de recursos onde a conta de armazenamento reside.
- Se você usar sua própria conta de armazenamento, precisará atribuir
Ativar identidade gerida para PVs dinâmicos com Ficheiros do Azure
Para permitir a identidade gerida para volumes provisionados dinamicamente, precisa de criar uma nova classe de armazenamento com mountWithManagedIdentity: "true" e implementar o seu conjunto de estado usando esta classe de armazenamento.
O seguinte manifesto de exemplo configura uma classe de armazenamento para usar identidade gerida para aceder ao Ficheiros do Azure:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi
provisioner: file.csi.azure.com
parameters:
resourceGroup: EXISTING_RESOURCE_GROUP_NAME # optional, node resource group by default if it's not provided
storageAccount: EXISTING_STORAGE_ACCOUNT_NAME # optional, a new account will be created if it's not provided
mountWithManagedIdentity: "true"
# optional, clientID of the managed identity, kubelet identity would be used by default if it's not provided
clientID: "xxxxx-xxxx-xxx-xxx-xxxxxxx"
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
# Canonical permissions: 0755/uid=1000/gid=1000 for least privilege.
# Use 0777/uid=0/gid=0 only if app requires root or broad write access.
- dir_mode=0755
- file_mode=0755
- uid=1000
- gid=1000
- mfsymlinks
- cache=strict # https://linux.die.net/man/8/mount.cifs
- nosharesock # reduce probability of reconnect race
- actimeo=30 # reduce latency for metadata-heavy workload
- nobrl # disable sending byte range lock requests to the server
Ativar a identidade gerida para PVs estáticos com Ficheiros do Azure
Para usar identidade gerida com volumes persistentes Ficheiros do Azure estaticamente provisionados, assegure a seguinte configuração:
- Ative o SMBOauth na conta de armazenamento executando:
az storage account update --name <account-name> --resource-group <resource-group-name> --enable-smb-oauth true - Crie um PV com
mountWithManagedIdentity:"true"e monte o PV no seu pod de aplicação.
O seguinte manifesto de exemplo configura um PV para usar identidade gerida para aceder ao Ficheiros do Azure:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-azurefile
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: azurefile-csi
mountOptions:
# Canonical permissions: 0755/uid=1000/gid=1000 for least privilege.
# Use 0777/uid=0/gid=0 only if app requires root or broad write access.
- dir_mode=0755
- file_mode=0755
- uid=1000
- gid=1000
- mfsymlinks
- cache=strict # https://linux.die.net/man/8/mount.cifs
- nosharesock # reduce probability of reconnect race
- actimeo=30 # reduce latency for metadata-heavy workload
- nobrl # disable sending byte range lock requests to the server
csi:
driver: file.csi.azure.com
# make sure volumeHandle is unique for every identical share in the cluster
volumeHandle: "{resource-group-name}#{account-name}#{file-share-name}"
volumeAttributes:
resourceGroup: EXISTING_RESOURCE_GROUP_NAME # optional, node resource group by default if it's not provided
storageAccount: EXISTING_STORAGE_ACCOUNT_NAME # optional, a new account will be created if it's not provided
shareName: EXISTING_FILE_SHARE_NAME
mountWithManagedIdentity: "true"
# optional, clientID of the managed identity, kubelet identity would be used by default if it's empty
clientID: "xxxxx-xxxx-xxx-xxx-xxxxxxx"
Use a identidade da carga de trabalho para aceder ao armazenamento do Ficheiros do Azure
O Ficheiros do Azure agora suporta autenticação baseada em identidade de carga de trabalho para acesso a SMB. A identidade da carga de trabalho permite o acesso ao Ficheiros do Azure ao nível do pod, com privilégio mínimo, sem vincular a identidade da aplicação ao ciclo de vida do nó.
Observação
O suporte para identidade de carga de trabalho para Ficheiros do Azure no AKS está disponível a partir da versão 1.35.0 do AKS nos nós Linux.
Pré-requisitos para usar a identidade de carga de trabalho para aceder ao armazenamento Ficheiros do Azure
Antes de usar a identidade da carga de trabalho para aceder ao Ficheiros do Azure a partir do AKS, cumpra os seguintes pré-requisitos.
1. Criar um cluster com oidc-issuer ativado e obter a credencial do cluster AKS
Crie um novo cluster AKS com o emissor OIDC ativado, ou verifique se já está ativado. Siga a documentação oficial para criar um novo cluster AKS com o --enable-oidc-issuer parâmetro e recupere as credenciais do cluster. E definir as seguintes variáveis de ambiente:
export RESOURCE_GROUP=<your resource group name>
export CLUSTER_NAME=<your cluster name>
export REGION=<your region>
2. Preparar a conta de armazenamento
Crie uma nova conta de armazenamento e partilha de ficheiros, ou use uma já existente. Consulte a documentação Ficheiros do Azure para instruções detalhadas. Defina as seguintes variáveis de ambiente:
export STORAGE_RESOURCE_GROUP=<your storage account resource group>
export ACCOUNT=<your storage account name>
export SHARE=<your fileshare name> # optional
3. Criar ou reutilizar uma identidade gerida e conceder as permissões necessárias
Crie uma identidade gerida atribuída pelo utilizador, ou reutilize uma existente (por exemplo, uma identidade gerida associada ao grupo de recursos de nós AKS). E recupere os detalhes necessários sobre identidade e recursos:
export UAMI=<your managed identity name>
az identity create --name $UAMI --resource-group $RESOURCE_GROUP
export USER_ASSIGNED_CLIENT_ID="$(az identity show -g $RESOURCE_GROUP --name $UAMI --query 'clientId' -o tsv)"
export IDENTITY_TENANT=$(az aks show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --query identity.tenantId -o tsv)
export ACCOUNT_SCOPE=$(az storage account show --name $ACCOUNT --query id -o tsv)
Conceder a função Storage File Data SMB MI Admin à identidade gerida. Esta função possibilita a montagem do Ficheiros do Azure apenas usando tokens de identidade de cargas de trabalho, sem depender de chaves de conta de armazenamento.
az role assignment create --role "Storage File Data SMB MI Admin" --assignee $USER_ASSIGNED_CLIENT_ID --scope $ACCOUNT_SCOPE
4. Criar uma Conta de Serviço Kubernetes
Cria uma Conta de Serviço Kubernetes que a tua carga de trabalho irá usar.
export SERVICE_ACCOUNT_NAME=<your sa name>
export SERVICE_ACCOUNT_NAMESPACE=<your sa namespace>
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: ${SERVICE_ACCOUNT_NAME}
namespace: ${SERVICE_ACCOUNT_NAMESPACE}
EOF
5. Criar a credencial de identidade federada
Crie a credencial de identidade federada entre a identidade gerida, o emissor da conta de serviço e o sujeito, usando o comando az identity federated-credential create.
export FEDERATED_IDENTITY_NAME=<your federated identity name>
export AKS_OIDC_ISSUER="$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "oidcIssuerProfile.issuerUrl" -o tsv)"
az identity federated-credential create --name $FEDERATED_IDENTITY_NAME \
--identity-name $UAMI \
--resource-group $RESOURCE_GROUP \
--issuer $AKS_OIDC_ISSUER \
--subject system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}
Após completar estes passos, cargas de trabalho em execução com a ServiceAccount especificada podem autenticar-se junto ao Ficheiros do Azure utilizando a identidade de carga de trabalho Microsoft Entra, sem usar chaves de conta de armazenamento ou identidades geridas ao nível do nó.
Ativar a identidade da carga de trabalho para PVs dinâmicos com o Ficheiros do Azure
Para usar a identidade da carga de trabalho com volumes persistentes Ficheiros do Azure provisionados dinamicamente, assegure a seguinte configuração:
Conceder permissões à identidade do plano de controlo do condutor CSI
- Atribuir a função
Storage Account Contributorà identidade usada pelo plano de controle do driver CSI para a conta de armazenamento alvo. - Se a conta de armazenamento for criada dinamicamente pelo driver CSI, atribua o papel
Storage Account Contributorao grupo de recursos do nó. - Por padrão, a identidade do plano de controlo do cluster AKS já está atribuída à função no grupo de recursos de nós para a criação da conta de armazenamento.
- Atribuir a função
Crie uma nova classe de armazenamento com
mountWithWorkloadIdentityToken:"true"e implemente o seu conjunto com estado usando esta classe de armazenamento.
O seguinte manifesto de exemplo configura uma classe de armazenamento para usar a identidade da carga de trabalho para aceder ao Ficheiros do Azure:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azurefile-csi-wi
provisioner: file.csi.azure.com
parameters:
resourceGroup: EXISTING_RESOURCE_GROUP_NAME # optional, node resource group by default if it's not provided
storageAccount: EXISTING_STORAGE_ACCOUNT_NAME # optional, a new account will be created if it's not provided
mountWithWorkloadIdentityToken: "true"
# optional, clientID of the managed identity, kubelet identity would be used by default if it's not provided
clientID: "xxxxx-xxxx-xxx-xxx-xxxxxxx"
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
- dir_mode=0777 # modify this permission if you want to enhance the security
- file_mode=0777
- mfsymlinks
- cache=strict # https://linux.die.net/man/8/mount.cifs
- nosharesock # reduce probability of reconnect race
- actimeo=30 # reduce latency for metadata-heavy workload
- nobrl # disable sending byte range lock requests to the server
Ativar identidade de carga de trabalho para PVs estáticos com o Ficheiros do Azure
Para usar a identidade da carga de trabalho com volumes persistentes do Ficheiros do Azure provisionados estaticamente, assegure a seguinte configuração:
- Ative o SMBOauth na conta de armazenamento executando:
az storage account update --name <account-name> --resource-group <resource-group-name> --enable-smb-oauth true - Crie um PV com
mountWithWorkloadIdentityToken:"true"especificado e ligue o PV ao seu pod de aplicação.
O exemplo de manifesto a seguir configura uma PV para utilizar a identidade de workload e aceder ao Ficheiros do Azure:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-azurefile
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: azurefile-csi
mountOptions:
- dir_mode=0777 # modify this permission if you want to enhance the security
- file_mode=0777
- uid=0
- gid=0
- mfsymlinks
- cache=strict # https://linux.die.net/man/8/mount.cifs
- nosharesock # reduce probability of reconnect race
- actimeo=30 # reduce latency for metadata-heavy workload
- nobrl # disable sending byte range lock requests to the server
csi:
driver: file.csi.azure.com
# make sure volumeHandle is unique for every identical share in the cluster
volumeHandle: "{resource-group-name}#{account-name}#{file-share-name}"
volumeAttributes:
resourceGroup: EXISTING_RESOURCE_GROUP_NAME # optional, node resource group by default if it's not provided
storageAccount: EXISTING_STORAGE_ACCOUNT_NAME # optional, a new account will be created if it's not provided
shareName: EXISTING_FILE_SHARE_NAME
mountWithWorkloadIdentityToken: "true"
# optional, clientID of the managed identity, kubelet identity would be used by default if it's empty
clientID: "xxxxx-xxxx-xxx-xxx-xxxxxxx"
Crie um PV estático com o Ficheiros do Azure
As secções seguintes fornecem instruções para criar um PV estático com Ficheiros do Azure. Um PV estático é um volume persistente que um administrador cria manualmente. Este PV está disponível para uso em cápsulas no cluster. Para usar um PV estático, cria-se um PVC que faz referência ao PV e depois cria-se um pod que faz referência ao PVC.
Parâmetros de classe de armazenamento para PVs estáticos com Ficheiros do Azure
A tabela seguinte inclui parâmetros que pode usar para definir uma classe de armazenamento personalizada para os seus PVCs estáticos com Ficheiros do Azure:
| Nome | Meaning | Valores disponíveis | Obrigatório | Valor predefinido |
|---|---|---|---|---|
volumeAttributes.resourceGroup |
Especifique um nome de grupo de recursos Azure. | myResourceGroup | Não | Se estiver vazio, o driver usará o mesmo nome de grupo de recursos do cluster atual. |
volumeAttributes.storageAccount |
Especifique um nome de conta de armazenamento Azure existente. | storageAccountName | Yes | |
volumeAttributes.shareName |
Especifique um nome de partilha de ficheiros Azure. | fileShareName | Yes | |
volumeAttributes.folderName |
Especifique o nome de uma pasta na partilha de ficheiros do Azure. | folderName | Não | Se o nome da pasta não existir no compartilhamento de arquivos, a montagem falhará. |
volumeAttributes.protocol |
Especifique o protocolo de compartilhamento de arquivos. |
smb, nfs |
Não | smb |
volumeAttributes.server |
Especificar o endereço do servidor de conta de armazenamento Azure | Endereço do servidor existente, por exemplo accountname.privatelink.file.core.windows.net. |
Não | Se estiver vazio, o driver usa o endereço padrão accountname.file.core.windows.net ou outro endereço de conta de nuvem soberana. |
| --- | Os seguintes parâmetros são apenas para o protocolo SMB | --- | --- | --- |
volumeAttributes.secretName |
Especifique um nome secreto que armazene o nome e a chave da conta de armazenamento. | Não | ||
volumeAttributes.secretNamespace |
Especifique um namespace secreto. |
default,kube-system, etc. |
Não | Espaço de nomes PVC (csi.storage.k8s.io/pvc/namespace) |
nodeStageSecretRef.name |
Especifique um nome secreto que armazene o nome e a chave da conta de armazenamento. | Nome secreto existente. | Não | Se estiver vazio, o driver utiliza a identidade do kubelet para obter a chave da conta. |
nodeStageSecretRef.namespace |
Especifique um namespace secreto. | Namespace do Kubernetes | Não | |
| --- | Os seguintes parâmetros são apenas para o protocolo NFS | --- | --- | --- |
volumeAttributes.fsGroupChangePolicy |
Indica como o driver altera a propriedade de um volume. Pod securityContext.fsGroupChangePolicy é ignorado. |
OnRootMismatch (por defeito), Always, None |
Não | OnRootMismatch |
volumeAttributes.mountPermissions |
Especifique as permissões de pasta montada. A predefinição é 0777 |
Não |
Criar uma partilha de ficheiros no Azure
Antes de poder usar uma partilha de ficheiros do Ficheiros do Azure como volume de Kubernetes, deve criar uma conta de Armazenamento Azure e a partilha de ficheiros.
Obtenha o nome do grupo de recursos de nós do seu cluster AKS usando o
az aks showcomando com o--query nodeResourceGroupparâmetro.az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsvA saída do comando é semelhante ao seguinte exemplo:
MC_myResourceGroup_myAKSCluster_eastusCrie uma conta de armazenamento usando o
az storage account createcomando com o--skuparâmetro. O comando a seguir cria uma conta de armazenamento usando aStandard_LRSSKU. Certifique-se de substituir os seguintes espaços reservados:-
myAKSStorageAccountcom o nome da conta de armazenamento -
nodeResourceGroupNamecom o nome do grupo de recursos no qual os nós do cluster AKS estão hospedados -
locationcom o nome da região na qual criar o recurso. Deve ser a mesma região que os nós de cluster AKS.
az storage account create --name myAKSStorageAccount --resource-group nodeResourceGroupName --location location --sku Standard_LRS-
Exporta o cadeia de ligação como variável de ambiente, que usas para criar a partilha de ficheiros, usando o comando [
az storage account show-connection-string][az-storage-account-show-connection-string]. Certifica-te de substituirstorageAccountNameeresourceGroupNamecom o nome da tua conta de armazenamento e o nome do grupo de recursos.export AZURE_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string --name storageAccountName --resource-group resourceGroupName -o tsv)Observação
As cadeias de ligação devem ser protegidas através da rotação de chaves ou armazenadas em um Azure Key Vault. Para mais informações sobre cadeias de ligação, veja Configure cadeias de ligação Armazenamento do Azure e Gerir chaves de acesso à conta de armazenamento. Para ambientes de produção, a Microsoft recomenda a utilização da autenticação Microsoft Entra ID. Para mais informações, consulte Autorizar o acesso a dados em Armazenamento do Azure.
Crie o compartilhamento de arquivos usando o
az storage share createcomando. Certifique-se de substituirshareNamepelo nome do seu compartilhamento.az storage share create --name shareName --connection-string $AZURE_STORAGE_CONNECTION_STRINGExporte a chave da conta de armazenamento como variável de ambiente usando o comando [
az storage account keys list][az-storage-account-keys-list]. Certifica-te de substituirstorageAccountNameeresourceGroupNamecom o nome da tua conta de armazenamento e o nome do grupo de recursos.STORAGE_KEY=$(az storage account keys list --resource-group nodeResourceGroupName --account-name myAKSStorageAccount --query "[0].value" -o tsv)Eco o nome e a chave da conta de armazenamento usando o seguinte comando. Toma nota da chave da conta de armazenamento, que usas para criar um segredo Kubernetes no passo seguinte.
echo Storage account key: $STORAGE_KEY
Criar um segredo do Kubernetes
O Kubernetes precisa de credenciais para acessar o compartilhamento de arquivos criado na etapa anterior. Essas credenciais são armazenadas em um segredo do Kubernetes, que é referenciado quando você cria um pod do Kubernetes.
Crie o segredo usando o
kubectl create secretcomando. O exemplo a seguir cria um segredo chamado azure-secret e preenche azurestorageaccountname e azurestorageaccountkey da etapa anterior. Para usar uma conta de armazenamento Azure existente, forneça o nome e a chave da conta.kubectl create secret generic azure-secret --from-literal=azurestorageaccountname=myAKSStorageAccount --from-literal=azurestorageaccountkey=$STORAGE_KEY
Monte o compartilhamento de arquivos como um volume persistente
Crie um novo arquivo com o nome
azurefiles-pv.yamle copie no conteúdo a seguir. Emcsi, atualizarresourceGroup,volumeHandleeshareName. Para opções de montagem, o valor padrão parafileModeedirModeé 0777.apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/provisioned-by: file.csi.azure.com name: azurefile spec: capacity: storage: 5Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: azurefile-csi csi: driver: file.csi.azure.com volumeHandle: "{resource-group-name}#{account-name}#{file-share-name}" # make sure this volumeid is unique for every identical share in the cluster volumeAttributes: shareName: aksshare nodeStageSecretRef: name: azure-secret namespace: default mountOptions: # Canonical permissions: 0755/uid=1000/gid=1000 for least privilege. # Use 0777/uid=0/gid=0 only if app requires root or broad write access. - dir_mode=0755 - file_mode=0755 - uid=1000 - gid=1000 - mfsymlinks - cache=strict - nosharesock - actimeo=30 - nobrl # disable sending byte range lock requests to the server and for applications which have challenges with posix locksCria o PV usando o
kubectl createcomando.kubectl create -f azurefiles-pv.yamlCrie um novo ficheiro chamado azurefiles-mount-options-pvc.yaml e cole o conteúdo seguinte. Certifica-te de que corresponde
storageClassNameao nome da tua classe de armazenamento existente evolumeNameao nome do PV que criaste no passo anterior.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: azurefile spec: accessModes: - ReadWriteMany storageClassName: azurefile-csi volumeName: azurefile resources: requests: storage: 5GiCria o PVC usando o
kubectl applycomando.kubectl apply -f azurefiles-mount-options-pvc.yamlVerifique se o seu PVC foi criado e ligado ao PV usando o comando
kubectl get.kubectl get pvc azurefileA sua saída deve assemelhar-se à seguinte saída de exemplo, que mostra que o PVC está num
Boundestado, e está ligado ao PV nomeado azurefile:NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE azurefile Bound azurefile 5Gi RWX azurefile 5sAtualize a especificação do seu contentor para referenciar o seu PVC e o seu pod no ficheiro YAML. Por exemplo:
... volumes: - name: azure persistentVolumeClaim: claimName: azurefileUma especificação do pod não pode ser atualizada no local, portanto, exclua o pod usando o
kubectl deletecomando e recrie-o usando okubectl applycomando.kubectl delete pod mypod kubectl apply -f azure-files-pod.yaml
Monte a partilha de ficheiros como um volume integrado
Observação
Para evitar problemas de desempenho, recomendamos que você use um volume persistente em vez de um volume embutido quando vários pods estiverem acessando o mesmo compartilhamento de arquivos. O volume inline só pode acessar segredos no mesmo namespace que o pod. Para especificar um namespace secreto diferente, use um volume persistente.
Para montar a partilha de ficheiros Ficheiros do Azure no teu pod, configuras o volume na especificação do contentor.
Crie um novo arquivo com o nome
azure-files-pod.yamle copie no conteúdo a seguir. Se você alterou o nome do compartilhamento de arquivos ou o nome secreto, atualize oshareNameesecretName. Você também pode atualizar omountPath, que é o caminho onde a partilha de ficheiros está montada no pod. Para Windows Server contentores, especifique ummountPathusando a convenção do caminho Windows, como 'D:'.apiVersion: v1 kind: Pod metadata: name: mypod spec: nodeSelector: kubernetes.io/os: linux containers: - image: 'mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine' name: mypod resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - name: azure mountPath: /mnt/azure readOnly: false volumes: - name: azure csi: driver: file.csi.azure.com volumeAttributes: secretName: azure-secret # required shareName: aksshare # required mountOptions: 'dir_mode=0755,file_mode=0755,uid=1000,gid=1000,cache=strict,actimeo=30,nosharesock,nobrl' # optionalCrie o pod usando o
kubectl applycomando.kubectl apply -f azure-files-pod.yamlVeja o estado do pod usando o
kubectl describecomando:kubectl describe pod mypod