Creación y uso de un volumen con Azure Blob Storage en Azure Kubernetes Service (AKS)
Las aplicaciones que usan contenedores a menudo necesitan acceder a un volumen de datos externo y conservar datos en él. Si varios pods necesitan acceso simultáneo al mismo volumen de almacenamiento, puede usar Azure Blob Storage para conectarse mediante blobfuse o Network File System (NFS).
En este artículo aprenderá a:
- Trabaje con un volumen persistente dinámico (PV) mediante la instalación del controlador Container Storage Interface (CSI) y la creación dinámica de un contenedor de Azure Blob Storage para asociarse a un pod.
- Trabaje con un PV estático mediante la creación de un contenedor de Azure Blob Storage o use uno existente y conéctelo a un pod.
Para más información sobre los volúmenes de Kubernetes, consulte Opciones de almacenamiento para aplicaciones en AKS.
Antes de empezar
Habilite el controlador CSI de Blob Storage en el clúster de AKS.
Para admitir una cuenta de almacenamiento de Azure DataLake Gen2 al usar el montaje de blobfuse, deberá hacer lo siguiente:
- Para crear una cuenta de ADLS mediante el controlador en el aprovisionamiento dinámico, especifique
isHnsEnabled: "true"
en los parámetros de la clase de almacenamiento. - Para habilitar el acceso de blobfuse a una cuenta de ADLS en aprovisionamiento estático, debe especificar la opción de montaje
--use-adls=true
en el volumen persistente. - Si va a habilitar una cuenta de almacenamiento con espacio de nombres jerárquico, se deben volver a montar los volúmenes persistentes existentes con la opción de montaje
--use-adls=true
.
- Para crear una cuenta de ADLS mediante el controlador en el aprovisionamiento dinámico, especifique
Acerca de la caché de blobfuse
- De forma predeterminada, la caché de blobfuse se encuentra en el directorio
/mnt
. Si la SKU de máquina virtual proporciona un disco temporal, el directorio/mnt
se monta en el disco temporal. Sin embargo, si la SKU de máquina virtual no proporciona ningún disco temporal, el directorio/mnt
se monta en el disco del sistema operativo, podría establecer la opción de montaje--tmp-path=
para especificar otro directorio de caché.
- De forma predeterminada, la caché de blobfuse se encuentra en el directorio
Aprovisionar un volumen dinámicamente
En esta sección se proporcionan instrucciones para los administradores de clústeres que quieren aprovisionar uno o varios volúmenes persistentes que incluyen detalles de Blob Storage para que los use una carga de trabajo. Una notificación de volumen persistente (PVC) usa el objeto de clase de almacenamiento para aprovisionar de forma dinámica un contenedor de Azure Blob Storage.
Parámetros de clase de almacenamiento para volúmenes persistentes dinámicos
En la tabla siguiente se incluyen parámetros que puede usar para definir una clase de almacenamiento personalizada para la notificación de volumen persistente.
Nombre | Descripción | Ejemplo | Mandatory | Valor predeterminado |
---|---|---|---|---|
skuName | Especifique un tipo de cuenta de almacenamiento de Azure (alias: storageAccountType ). |
Standard_LRS , Premium_LRS , Standard_GRS , Standard_RAGRS |
No | Standard_LRS |
ubicación | seleccione una ubicación de Azure. | eastus |
No | Si está vacío, el controlador usará el mismo nombre de ubicación que el clúster actual. |
resourceGroup | Especifique un nombre de grupo de recursos de Azure. | myResourceGroup | No | Si está vacío, el controlador usará el mismo nombre de grupo de recursos que el clúster actual. |
StorageAccount | Especifique un nombre de cuenta de almacenamiento de Azure. | storageAccountName | No- | Cuando no se proporcione un nombre de cuenta de almacenamiento específico, el controlador buscará una cuenta de almacenamiento adecuada que coincida con la configuración de la cuenta que se encuentre en el mismo grupo de recursos. Si no encuentra una cuenta de almacenamiento coincidente, la creará. Sin embargo, si se especifica un nombre de cuenta de almacenamiento, la cuenta de almacenamiento ya debe existir. |
networkEndpointType | Especifique el tipo de punto de conexión de red para la cuenta de almacenamiento creada por el controlador. Si se especifica privateEndpoint, se crea un punto de conexión privado para la cuenta de almacenamiento. En otros casos, se creará un punto de conexión de servicio para el protocolo NFS.1 | privateEndpoint |
No | Para un clúster de AKS, agregue el nombre del clúster de AKS al rol Colaborador en el grupo de recursos que hospeda la red virtual. |
protocol | Especifique el montaje de blobfuse o el montaje de NFSv3. | fuse , nfs |
No | fuse |
containerName | Especifique el nombre del contenedor (directorio) existente. | contenedor | No | Si está vacío, el controlador crea un nuevo nombre de contenedor, empezando por pvc-fuse para blobfuse o pvc-nfs para NFS v3. |
containerNamePrefix | Especifique el prefijo de directorio de Azure Storage que ha creado el controlador. | my | Solo puede contener letras minúsculas, números, guiones y la longitud debe ser inferior a 21 caracteres. | No |
server | Especifique el nombre de dominio de la cuenta de almacenamiento de Azure. | Nombre de dominio DNS de la cuenta de almacenamiento existente, por ejemplo, <storage-account>.privatelink.blob.core.windows.net . |
No | Si está vacío, el controlador usa el <storage-account>.blob.core.windows.net predeterminado u otro nombre de dominio DNS de la cuenta de almacenamiento en la nube soberana. |
allowBlobPublicAccess | Permitir o denegar el acceso público a todos los blobs o contenedores para la cuenta de almacenamiento creada por el controlador. | true ,false |
No | false |
storageEndpointSuffix | Especifique el sufijo del punto de conexión de Azure Storage. | core.windows.net |
No | Si está vacío, el controlador usará el sufijo de punto de conexión de almacenamiento predeterminado según el entorno de nube. |
etiquetas | Tags se crearía en una nueva cuenta de almacenamiento. | Formato de etiqueta: 'foo=aaa,bar=bbb' | No | "" |
matchTags | Coincidencia de etiquetas cuando el controlador intenta encontrar una cuenta de almacenamiento adecuada. | true ,false |
No | false |
--- | Los parámetros siguientes solo son para blobfuse | --- | --- | --- |
subscriptionID | Especifique el identificador de suscripción de Azure donde se creará el directorio de Blob Storage. | Identificador de suscripción de Azure | No | Si no está vacío, se debe proporcionar resourceGroup . |
storeAccountKey | Especifique la clave de cuenta de almacén en el secreto de Kubernetes. Nota: false significa que el controlador usa la identidad de kubelet para obtener la clave de cuenta. |
true ,false |
No | true |
secretName | Especifique el nombre del secreto para almacenar la clave de cuenta. | No | ||
secretNamespace | Especifique el espacio de nombres del secreto para almacenar la clave de cuenta. | default ,kube-system , etc. |
No | Espacio de nombres pvc |
isHnsEnabled | Habilite Hierarchical namespace para la cuenta de almacenamiento de Azure Data Lake. |
true ,false |
No | false |
--- | Los parámetros siguientes solo son para el protocolo NFS | --- | --- | --- |
mountPermissions | Especifique los permisos de carpeta montada. | El valor predeterminado es 0777 . Si se establece en 0 , el controlador no realizará chmod después del montaje. |
0777 |
No |
1 Si el controlador crea la cuenta de almacenamiento, solo tiene que especificar el parámetro networkEndpointType: privateEndpoint
en la clase de almacenamiento. El controlador CSI crea el punto de conexión privado junto con la cuenta. Si trae su propia cuenta de almacenamiento, debe crear el punto de conexión privado para la cuenta de almacenamiento.
Creación de una notificación de volumen persistente mediante la clase de almacenamiento integrada
Una notificación de volumen persistente (PVC) usa el objeto de clase de almacenamiento para aprovisionar de forma dinámica un contenedor de Azure Blob Storage. El siguiente código YAML puede utilizarse para crear una notificación de volumen persistente con un tamaño de 5 GB y con acceso ReadWriteMany mediante la clase de almacenamiento integrada. Para más información sobre los modos de acceso, consulte la documentación sobre volúmenes persistentes de Kubernetes.
Cree un archivo denominado
blob-nfs-pvc.yaml
y cópielo en el siguiente código YAML.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: azure-blob-storage spec: accessModes: - ReadWriteMany storageClassName: azureblob-nfs-premium resources: requests: storage: 5Gi
Cree la notificación del volumen persistente con el comando kubectl create:
kubectl create -f blob-nfs-pvc.yaml
Una vez completado, se creará el contenedor de Blob Storage. Puede usar el comando kubectl get para ver el estado de la PVC:
kubectl get pvc azure-blob-storage
La salida del comando es similar al ejemplo siguiente:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
azure-blob-storage Bound pvc-b88e36c5-c518-4d38-a5ee-337a7dda0a68 5Gi RWX azureblob-nfs-premium 92m
Uso de la notificación de volumen persistente
El siguiente código de YAML crea un pod que usa la notificación de volumen persistente azure-blob-storage para montar Azure Blob Storage en la ruta de acceso "/mnt/blob".
Cree un archivo denominado
blob-nfs-pv
y cópielo en el siguiente código YAML. Asegúrese de que claimName coincide con la clase PVC creada en el paso anterior.kind: Pod apiVersion: v1 metadata: name: mypod spec: containers: - name: mypod image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - mountPath: "/mnt/blob" name: volume readOnly: false volumes: - name: volume persistentVolumeClaim: claimName: azure-blob-storage
Cree el pod con el comando kubectl apply:
kubectl apply -f blob-nfs-pv.yaml
Una vez que el pod esté en estado de ejecución, ejecute el siguiente comando para crear un nuevo archivo llamado
test.txt
.kubectl exec mypod -- touch /mnt/blob/test.txt
Para validar que el disco se haya montado correctamente, ejecute el siguiente comando y compruebe que ve el archivo
test.txt
en la salida:kubectl exec mypod -- ls /mnt/blob
La salida del comando es similar al ejemplo siguiente:
test.txt
Creación de una clase de almacenamiento personalizada
Las clases de almacenamiento predeterminadas se adaptan a los escenarios más comunes, pero no a todos. En algunos casos, puede que quiera tener una clase de almacenamiento propia personalizada con sus propios parámetros. En esta sección, se proporcionan dos ejemplos. La primera usa el protocolo NFS y la segunda usa blobfuse.
Clase de almacenamiento mediante el protocolo NFS
En este ejemplo, el siguiente manifiesto configura el montaje de un contenedor de Blob Storage mediante el protocolo NFS. Úselo para agregar el parámetro tags.
Cree un archivo denominado
blob-nfs-sc.yaml
y pegue el siguiente manifiesto de ejemplo:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: azureblob-nfs-premium provisioner: blob.csi.azure.com parameters: protocol: nfs tags: environment=Development volumeBindingMode: Immediate allowVolumeExpansion: true mountOptions: - nconnect=4
Cree la clase de almacenamiento con el comando kubectl apply:
kubectl apply -f blob-nfs-sc.yaml
La salida del comando es similar al ejemplo siguiente:
storageclass.storage.k8s.io/blob-nfs-premium created
Clase de almacenamiento mediante blobfuse
En este ejemplo, el siguiente manifiesto se configura mediante blobfuse y monta un contenedor de Blob Storage. Úselo para actualizar el parámetro skuName.
Cree un archivo denominado
blobfuse-sc.yaml
y pegue el siguiente manifiesto de ejemplo:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: azureblob-fuse-premium provisioner: blob.csi.azure.com parameters: skuName: Standard_GRS # available values: Standard_LRS, Premium_LRS, Standard_GRS, Standard_RAGRS reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true mountOptions: - -o allow_other - --file-cache-timeout-in-seconds=120 - --use-attr-cache=true - --cancel-list-on-mount-seconds=10 # prevent billing charges on mounting - -o attr_timeout=120 - -o entry_timeout=120 - -o negative_timeout=120 - --log-level=LOG_WARNING # LOG_WARNING, LOG_INFO, LOG_DEBUG - --cache-size-mb=1000 # Default will be 80% of available memory, eviction will happen beyond that.
Cree la clase de almacenamiento con el comando kubectl apply:
kubectl apply -f blobfuse-sc.yaml
La salida del comando es similar al ejemplo siguiente:
storageclass.storage.k8s.io/blob-fuse-premium created
Aprovisionar un volumen estáticamente
En esta sección se proporcionan instrucciones para los administradores de clústeres que quieren crear uno o varios volúmenes persistentes que incluyen detalles de Blob Storage para que los use una carga de trabajo.
Parámetros de aprovisionamiento estáticos para volúmenes persistentes
En la tabla siguiente se incluyen parámetros que puede usar para definir un volumen persistente.
Nombre | Descripción | Ejemplo | Mandatory | Valor predeterminado |
---|---|---|---|---|
volumeHandle | Especifique un valor que el controlador pueda usar para identificar de forma única el contenedor de blobs de almacenamiento en el clúster. | Una manera recomendada de generar un valor único es combinar el nombre de la cuenta de almacenamiento único global y el nombre del contenedor: {account-name}_{container-name} .Nota: los caracteres # y / están reservados para uso interno y no se pueden usar en un manipulador de volumen. |
Sí | |
volumeAttributes.resourceGroup | Especifique un nombre de grupo de recursos de Azure. | myResourceGroup | No | Si está vacío, el controlador usa el mismo nombre de grupo de recursos que el clúster actual. |
volumeAttributes.storageAccount | Especifique un nombre de la cuenta de almacenamiento de Azure existente. | storageAccountName | Yes | |
volumeAttributes.containerName | Especifique el nombre del contenedor existente. | contenedor | Sí | |
volumeAttributes.protocol | Especifique el montaje de blobfuse o el montaje de NFS v3. | fuse , nfs |
No | fuse |
--- | Los parámetros siguientes solo son para blobfuse | --- | --- | --- |
volumeAttributes.secretName | Nombre secreto que almacena el nombre y la clave de la cuenta de almacenamiento (solo se aplica a SMB). | No | ||
volumeAttributes.secretNamespace | Especifique el espacio de nombres del secreto para almacenar la clave de cuenta. | default |
No | Espacio de nombres pvc |
nodeStageSecretRef.name | Especifique el nombre del secreto que almacena uno de los siguientes elementos:azurestorageaccountkey azurestorageaccountsastoken msisecret azurestoragespnclientsecret . |
No | Nombre del secreto de Kubernetes existente | |
nodeStageSecretRef.namespace | Especifique el espacio de nombres del secreto. | Espacio de nombres de Kubernetes | Yes | |
--- | Los parámetros siguientes solo son para el protocolo NFS | --- | --- | --- |
volumeAttributes.mountPermissions | Especifique los permisos de carpeta montada. | 0777 |
No | |
--- | Los parámetros siguientes solo son para la configuración de red virtual NF. | --- | --- | --- |
vnetResourceGroup | Especifique el grupo de recursos de red virtual que hospeda la red virtual. | myResourceGroup | No | Si está vacío, el controlador usa el valor vnetResourceGroup especificado en el archivo de configuración de la nube de Azure. |
vnetName | Especifica el nombre de red virtual. | aksVNet | No | Si está vacío, el controlador usa el valor vnetName especificado en el archivo de configuración de la nube de Azure. |
subnetName | Especifique el nombre de subred existente del nodo del agente. | aksSubnet | No | Si está vacío, el controlador usa el valor subnetName en el archivo de configuración de la nube de Azure. |
--- | Los parámetros siguientes solo son para la característica: blobfuse Autenticación de identidad administrada y nombre de entidad de seguridad de servicio |
--- | --- | --- |
volumeAttributes.AzureStorageAuthType | Especifique el tipo de autenticación. | Key , SAS , MSI , SPN |
No | Key |
volumeAttributes.AzureStorageIdentityClientID | Especifique el identificador de cliente de identidad. | No | ||
volumeAttributes.AzureStorageIdentityResourceID | Especifique el identificador de recurso de identidad. | No | ||
volumeAttributes.MSIEndpoint | Especifique el punto de conexión de MSI. | No | ||
volumeAttributes.AzureStorageSPNClientID | Especifique el identificador de cliente del nombre de entidad de seguridad de servicio (SPN) de Azure. | No | ||
volumeAttributes.AzureStorageSPNTenantID | Especifique el identificador de inquilino de SPN de Azure. | No | ||
volumeAttributes.AzureStorageAADEndpoint | Especifique el punto de conexión de Microsoft Entra. | No | ||
--- | Los parámetros siguientes solo son para la característica: blobfuse lee la clave de cuenta o el token de SAS del almacén de claves. | --- | --- | --- |
volumeAttributes.keyVaultURL | Especifique el nombre DNS de Azure Key Vault. | {vault-name}.vault.azure.net | No | |
volumeAttributes.keyVaultSecretName | Especifique el nombre del secreto de Azure Key Vault. | Nombre de secreto de Azure Key Vault existente. | No | |
volumeAttributes.keyVaultSecretVersion | Versión del secreto de Azure Key Vault. | Versión existente | No | Si está vacío, el controlador usa la versión actual. |
Creación de un contenedor de Blob Storage
Cuando crea un recurso de Azure Blob Storage para usarlo con AKS, puede crear el recurso en el grupo de recursos del nodo. Este enfoque permite que el clúster de AKS acceda al recurso de Blob Storage y lo administre.
En este artículo, se crea el contenedor en el grupo de recursos del nodo. En primer lugar, obtenga el nombre del grupo de recursos con el comando az aks show y agregue el parámetro de consulta --query nodeResourceGroup
. En este ejemplo se obtiene el grupo de recursos del nodo para el clúster de AKS denominado myAKSCluster en el grupo de recursos llamado myResourceGroup:
az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
La salida del comando es similar al ejemplo siguiente:
MC_myResourceGroup_myAKSCluster_eastus
A continuación, cree un contenedor para almacenar blobs siguiendo los pasos descritos en Administración de Blob Storage para autorizar el acceso y, a continuación, cree el contenedor.
Montaje del volumen
En esta sección, montará el volumen persistente mediante el protocolo NFS o Blobfuse.
El montaje de Blob Storage mediante el protocolo NFS v3 no se autentica mediante una clave de cuenta. El clúster de AKS necesita residir en la misma red virtual que el nodo del agente o en la red virtual emparejada. La única forma de proteger los datos de su cuenta de almacenamiento es mediante una red virtual y otros valores de la seguridad de red. Para más información sobre cómo configurar el acceso NFS a la cuenta de almacenamiento, consulte Montaje de Blob Storage mediante el protocolo Network File System (NFS) 3.0.
En el ejemplo siguiente se muestra cómo montar un contenedor de Blob Storage como un volumen persistente mediante el protocolo NFS.
Cree un archivo denominado
pv-blob-nfs.yaml
y cópielo en el siguiente código YAML. EnstorageClass
, actualiceresourceGroup
,storageAccount
ycontainerName
.Nota
El valor
volumeHandle
debe ser un valor volumeID único para cada contenedor de Blob Storage idéntico en el clúster. Los caracteres#
y/
están reservados para uso interno y no se pueden usar.apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/provisioned-by: blob.csi.azure.com name: pv-blob spec: capacity: storage: 1Pi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain # If set as "Delete" container would be removed after pvc deletion storageClassName: azureblob-nfs-premium mountOptions: - nconnect=4 csi: driver: blob.csi.azure.com # make sure volumeid is unique for every identical storage blob container in the cluster # character `#` and `/` are reserved for internal use and cannot be used in volumehandle volumeHandle: account-name_container-name volumeAttributes: resourceGroup: resourceGroupName storageAccount: storageAccountName containerName: containerName protocol: nfs
Nota:
Si bien el atributo de capacidad de la API de Kubernetes es obligatorio, el controlador CSI de Azure Blob Storage no usa este valor, ya que puede escribir datos de forma flexible hasta alcanzar el límite de capacidad de la cuenta de almacenamiento. El valor del atributo
capacity
solo se usa para la coincidencia de tamaño entre PersistentVolumes y PersistentVolumeClaims. Se recomienda usar un valor alto ficticio. El pod ve un volumen montado con un tamaño ficticio de 5 Petabytes.Ejecute el siguiente comando para crear el volumen persistente mediante el comando kubectl create que hace referencia al archivo YAML creado anteriormente:
kubectl create -f pv-blob-nfs.yaml
Cree un archivo
pvc-blob-nfs.yaml
con un elemento PersistentVolumeClaim. Por ejemplo:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-blob spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi volumeName: pv-blob storageClassName: azureblob-nfs-premium
Ejecute el siguiente comando para crear la notificación de volumen persistente mediante el comando kubectl create que hace referencia al archivo YAML creado anteriormente:
kubectl create -f pvc-blob-nfs.yaml
Uso del volumen persistente
El siguiente archivo YAML crea un pod que usa el volumen persistente o la notificación de volumen persistente llamada pvc-blob creada anteriormente, para montar Azure Blob Storage en la ruta de acceso /mnt/blob
.
Cree un archivo denominado
nginx-pod-blob.yaml
y cópielo en el siguiente código YAML. Asegúrese de que claimName coincide con el PVC creado en el paso anterior al crear un volumen persistente para NFS o Blobfuse.kind: Pod apiVersion: v1 metadata: name: nginx-blob spec: nodeSelector: "kubernetes.io/os": linux containers: - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine name: nginx-blob volumeMounts: - name: blob01 mountPath: "/mnt/blob" readOnly: false volumes: - name: blob01 persistentVolumeClaim: claimName: pvc-blob
Ejecute el siguiente comando para crear el pod y montar el PVC mediante el comando kubectl create que hace referencia al archivo YAML creado anteriormente:
kubectl create -f nginx-pod-blob.yaml
Ejecute el siguiente comando para crear una sesión de shell interactiva con el pod para comprobar el almacenamiento de blobs montado:
kubectl exec -it nginx-blob -- df -h
La salida del comando es similar al ejemplo siguiente:
Filesystem Size Used Avail Use% Mounted on ... blobfuse 14G 41M 13G 1% /mnt/blob ...
Pasos siguientes
- Para obtener información sobre cómo usar el controlador CSI para Azure Blob Storage, consulte Uso de Azure Blob Storage con controladores CSI.
- Para consultar los procedimientos recomendados asociados, consulte Procedimientos recomendados para el almacenamiento y las copias de seguridad en Azure Kubernetes Service (AKS).
Azure Kubernetes Service