你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

为 Azure Kubernetes 服务预配 Azure NetApp 文件 NFS 卷

为 Azure Kubernetes 服务配置 Azure NetApp 文件后,可为 Azure Kubernetes 服务预配 Azure NetApp 文件卷。

Azure NetApp 文件支持使用 NFS(NFSv3 或 NFSv4.1)、SMB 和双重协议(NFSv3 和 SMB,或 NFSv4.1 和 SMB)的卷。

静态配置使用 NFS 卷的应用程序

本节介绍如何在 Azure NetApp 文件上创建 NFS 卷并将该卷静态公开给 Kubernetes。 本节还介绍了如何在容器化应用程序中使用卷。

创建 NFS 卷

  1. 定义变量供以后使用。 将 myresourcegroup、mylocation、myaccountname、mypool1、premium、myfilepath、myvolsize、myvolname、vnetid 和 anfSubnetID 分别替换为你的帐户和环境中的相应值。 filepath 在所有 ANF 帐户中必须是唯一的。

    RESOURCE_GROUP="myresourcegroup"
    LOCATION="mylocation"
    ANF_ACCOUNT_NAME="myaccountname"
    POOL_NAME="mypool1"
    SERVICE_LEVEL="premium" # Valid values are Standard, Premium, and Ultra
    UNIQUE_FILE_PATH="myfilepath"
    VOLUME_SIZE_GIB="myvolsize"
    VOLUME_NAME="myvolname"
    VNET_ID="vnetId"
    SUBNET_ID="anfSubnetId"
    
  2. 使用 az netappfiles volume create 命令创建卷。 有关详细信息,请参阅为 Azure NetApp 文件创建 NFS 卷

    az netappfiles volume create \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION \
        --account-name $ANF_ACCOUNT_NAME \
        --pool-name $POOL_NAME \
        --name "$VOLUME_NAME" \
        --service-level $SERVICE_LEVEL \
        --vnet $VNET_ID \
        --subnet $SUBNET_ID \
        --usage-threshold $VOLUME_SIZE_GIB \
        --file-path $UNIQUE_FILE_PATH \
        --protocol-types NFSv3
    

创建永久性卷

  1. 使用 az netappfiles volume show 命令列出卷的详细信息。 如果未在上一步中定义,请将变量替换为 Azure NetApp 文件帐户和环境中的适当值。

    az netappfiles volume show \
        --resource-group $RESOURCE_GROUP \
        --account-name $ANF_ACCOUNT_NAME \
        --pool-name $POOL_NAME \
        --volume-name "$VOLUME_NAME -o JSON
    

    以下输出是以实际值执行上述命令的示例。

    {
      ...
      "creationToken": "myfilepath2",
      ...
      "mountTargets": [
        {
          ...
          "ipAddress": "10.0.0.4",
          ...
        }
      ],
      ...
    }
    
  2. 创建名为 pv-nfs.yaml 的文件,并将其复制到以下 YAML 中。 确保服务器与步骤 1 中的输出 IP 地址匹配,并且路径与上面 creationToken 的输出匹配。 容量还必须与上述步骤中的卷大小匹配。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-nfs
    spec:
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteMany
      mountOptions:
        - vers=3
      nfs:
        server: 10.0.0.4
        path: /myfilepath2
    
  3. 使用 kubectl apply 命令创建永久性卷:

    kubectl apply -f pv-nfs.yaml
    
  4. 使用 kubectl describe 命令验证永久性卷的状态是否为“Available”:

    kubectl describe pv pv-nfs
    

创建永久性卷声明

  1. 创建名为 pvc-nfs.yaml 的文件,并将其复制到以下 YAML 中。 此清单为 100Gi 存储和 ReadWriteMany 访问模式创建一个名为 pvc-nfs 的 PVC,与你创建的 PV 匹配。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-nfs
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ""
      resources:
        requests:
          storage: 100Gi
    
  2. 使用 kubectl apply 命令创建永久性卷声明:

    kubectl apply -f pvc-nfs.yaml
    
  3. 使用 kubectl describe 命令验证永久性卷声明的状态是否为“Bound”:

    kubectl describe pvc pvc-nfs
    

装载到 Pod

  1. 创建名为 nginx-nfs.yaml 的文件,并将其复制到以下 YAML 中。 这个清单定义了一个使用持久卷声明的 nginx pod。

    kind: Pod
    apiVersion: v1
    metadata:
      name: nginx-nfs
    spec:
      containers:
      - image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
        name: nginx-nfs
        command:
        - "/bin/sh"
        - "-c"
        - while true; do echo $(date) >> /mnt/azure/outfile; sleep 1; done
        volumeMounts:
        - name: disk01
          mountPath: /mnt/azure
      volumes:
      - name: disk01
        persistentVolumeClaim:
          claimName: pvc-nfs
    
  2. 使用 kubectl apply 命令创建 Pod:

    kubectl apply -f nginx-nfs.yaml
    
  3. 使用 kubectl describe 命令验证 Pod 是否正在运行:

    kubectl describe pod nginx-nfs
    
  4. 验证卷是否已装载到 Pod 上:使用 kubectl exec 连接到 Pod,然后使用 df -h 检查该卷是否已装载。

    kubectl exec -it nginx-nfs -- sh
    
    / # df -h
    Filesystem             Size  Used Avail Use% Mounted on
    ...
    10.0.0.4:/myfilepath2  100T  384K  100T   1% /mnt/azure
    ...
    

动态配置使用 NFS 卷的应用程序

Astra Trident 可用于在 Azure NetApp 文件上动态配置 NFS 或 SMB 文件。 动态预配的 SMB 卷仅支持 Windows 工作器节点。

本节介绍如何使用 Astra Trident 在 Azure NetApp 文件上动态创建 NFS 卷,以及如何将 NFS 卷自动挂载到容器化应用程序。

安装 Astra Trident

要动态预配 NFS 卷,请安装 Astra Trident。 Astra Trident 是 NetApp 的动态存储预配程序,专为 Kubernetes 而构建。 使用 Astra Trident 的行业标准容器存储接口 (CSI) 驱动程序简化 Kubernetes 应用程序的存储消耗。 Astra Trident 在 Kubernetes 群集上部署为 Pod,并为 Kubernetes 工作负荷提供动态存储业务流程服务。

可以使用 Trident 运算符(通过手动方式或通过 Helm)或 tridentctl 来安装 Trident。 若要详细了解这些安装方法及其工作原理,请参阅 Astra Trident 安装指南

使用 Helm 安装 Trident

必须在工作站上安装 Helm,才能使用此方法安装 Astra Trident。 有关安装 Astra Trident 的其他方法,请参阅 Astra Trident 安装指南

  1. 若要使用 Helm 为仅具有 Linux 工作器节点的群集安装 Astra Trident,请运行以下命令:

    helm repo add netapp-trident https://netapp.github.io/trident-helm-chart   
    helm install trident netapp-trident/trident-operator --version 23.04.0  --create-namespace --namespace trident
    

    该命令的输出类似于以下示例:

    NAME: trident
    LAST DEPLOYED: Fri May  5 13:55:36 2023
    NAMESPACE: trident
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    Thank you for installing trident-operator, which will deploy and manage NetApp's Trident CSI storage provisioner for Kubernetes.
    
    Your release is named 'trident' and is installed into the 'trident' namespace.
    Please note that there must be only one instance of Trident (and trident-operator) in a Kubernetes cluster.
    
    To configure Trident to manage storage resources, you will need a copy of tridentctl, which is available in pre-packaged Trident releases.  You may find all Trident releases and source code online at https://github.com/NetApp/trident. 
    
    To learn more about the release, try:
    
        $ helm status trident
          $ helm get all trident
    
  2. 若要确认 Astra Trident 已成功安装,请运行以下 kubectl describe 命令:

    kubectl describe torc trident
    

    该命令的输出类似于以下示例:

    Name:         trident
    Namespace:    
    Labels:       app.kubernetes.io/managed-by=Helm
    Annotations:  meta.helm.sh/release-name: trident
                  meta.helm.sh/release-namespace: trident
    API Version:  trident.netapp.io/v1
    Kind:         TridentOrchestrator
    Metadata:
        ...
    Spec:
      IPv6:                  false
      Autosupport Image:     docker.io/netapp/trident-autosupport:23.04
      Autosupport Proxy:     <nil>
      Disable Audit Log:     true
      Enable Force Detach:   false
      Http Request Timeout:  90s
      Image Pull Policy:     IfNotPresent
      k8sTimeout:            0
      Kubelet Dir:           <nil>
      Log Format:            text
      Log Layers:            <nil>
      Log Workflows:         <nil>
      Namespace:             trident
      Probe Port:            17546
      Silence Autosupport:   false
      Trident Image:         docker.io/netapp/trident:23.04.0
      Windows:               false
    Status:
      Current Installation Params:
        IPv6:                       false
        Autosupport Hostname:       
        Autosupport Image:          docker.io/netapp/trident-autosupport:23.04
        Autosupport Proxy:          
        Autosupport Serial Number:  
        Debug:                      false
        Disable Audit Log:          true
        Enable Force Detach:        false
        Http Request Timeout:       90s
        Image Pull Policy:          IfNotPresent
        Image Pull Secrets:
        Image Registry:       
        k8sTimeout:           30
        Kubelet Dir:          /var/lib/kubelet
        Log Format:           text
        Log Layers:           
        Log Level:            info
        Log Workflows:        
        Probe Port:           17546
        Silence Autosupport:  false
        Trident Image:        docker.io/netapp/trident:23.04.0
      Message:                Trident installed
      Namespace:              trident
      Status:                 Installed
      Version:                v23.04.0
    Events:
      Type    Reason      Age    From                        Message
      ----    ------      ----   ----                        -------
      Normal  Installing  2m59s  trident-operator.netapp.io  Installing Trident
      Normal  Installed   2m31s  trident-operator.netapp.io  Trident installed
    

创建后端

要指示 Astra Trident Azure NetApp 文件订阅及其需要在何处创建卷,请创建后端。 此步骤需要上一步中创建的帐户详细信息。

  1. 创建名为 backend-secret.yaml 的文件,并将其复制到以下 YAML 中。 将 Client IDclientSecret 更改为环境的正确值。

    apiVersion: v1
    kind: Secret
    metadata:
      name: backend-tbc-anf-secret
    type: Opaque
    stringData:
      clientID: 00001111-aaaa-2222-bbbb-3333cccc4444
      clientSecret: rR0rUmWXfNioN1KhtHisiSAnoTherboGuskey6pU
    
  2. 创建名为 backend-anf.yaml 的文件,并将其复制到以下 YAML 中。 将 subscriptionIDtenantIDlocationserviceLevel 更改为环境的正确值。 对启用了 Azure NetApp 文件的 Azure 订阅使用 subscriptionID。 从具有足够 Azure NetApp 文件服务权限的 Microsoft Entra ID 中的应用程序注册获取 tenantIDclientIDclientSecret。 应用程序注册包括 Azure 预定义的“所有者”或“参与者”角色。 该位置必须是至少包含一个在上一步中创建的委派子网的 Azure 位置。 serviceLevel 必须匹配针对为 AKS 工作负载配置 Azure NetApp 文件中的容量池配置的 serviceLevel

    apiVersion: trident.netapp.io/v1
    kind: TridentBackendConfig
    metadata:
      name: backend-tbc-anf
    spec:
      version: 1
      storageDriverName: azure-netapp-files
      subscriptionID: aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
      tenantID: aaaabbbb-0000-cccc-1111-dddd2222eeee
      location: eastus
      serviceLevel: Premium
      credentials:
        name: backend-tbc-anf-secret
    

    有关后端的详细信息,请参阅 Azure NetApp 文件后端配置选项和示例

  3. 使用 kubectl apply 命令应用机密和后端。 首先应用机密:

    kubectl apply -f backend-secret.yaml -n trident
    

    该命令的输出类似于以下示例:

    secret/backend-tbc-anf-secret created
    

    应用后端:

    kubectl apply -f backend-anf.yaml -n trident
    

    该命令的输出类似于以下示例:

    tridentbackendconfig.trident.netapp.io/backend-tbc-anf created
    
  4. 使用 kubectl get 命令确认已创建后端:

     kubectl get tridentbackends -n trident
    

    该命令的输出类似于以下示例:

    NAME        BACKEND               BACKEND UUID
    tbe-kfrdh   backend-tbc-anf   8da4e926-9dd4-4a40-8d6a-375aab28c566
    

创建存储类

存储类用于定义使用永久性卷动态创建存储单位的方式。 要使用 Azure NetApp 文件卷,必须创建存储类。

  1. 创建名为 anf-storageclass.yaml 的文件,并将其复制到以下 YAML 中:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: azure-netapp-files
    provisioner: csi.trident.netapp.io
    parameters:
      backendType: "azure-netapp-files"
      fsType: "nfs"
    
  2. 使用 kubectl apply 命令创建存储类:

    kubectl apply -f anf-storageclass.yaml
    

    该命令的输出类似于以下示例:

    storageclass/azure-netapp-files created
    
  3. 运行 kubectl get 命令以查看存储类的状态:

    kubectl get sc
    NAME                 PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    azure-netapp-files   csi.trident.netapp.io   Delete          Immediate           false                  
    

创建 PVC

永久性卷声明 (PVC) 是指用户对存储空间的请求。 创建永久性卷声明后,Astra Trident 会自动创建 Azure NetApp 文件卷,使其可供 Kubernetes 工作负荷使用。

  1. 创建名为 anf-pvc.yaml 的文件,并将其复制到以下 YAML 中。 在此示例中,需要一个具有 ReadWriteMany 访问权限的 1 TiB 卷。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: anf-pvc
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 1Ti
      storageClassName: azure-netapp-files
    
  2. 使用 kubectl apply 命令创建持久卷声明:

    kubectl apply -f anf-pvc.yaml
    

    该命令的输出类似于以下示例:

    persistentvolumeclaim/anf-pvc created
    
  3. 若要查看有关永久性卷声明的信息,请运行 kubectl get 命令:

    kubectl get pvc
    

    该命令的输出类似于以下示例:

    kubectl get pvc -n trident
    NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS         AGE
    anf-pvc   Bound    pvc-bffa315d-3f44-4770-86eb-c922f567a075   1Ti        RWO            azure-netapp-files   62s
    

使用永久性卷

创建 PVC 后,Astra Trident 将创建持久卷。 可以启动 Pod 以挂载和访问 Azure NetApp 文件卷。

以下清单可用于定义 NGINX Pod,其可装载上一步创建的 Azure NetApp 文件卷。 在本示例中,卷将装载到 /mnt/data

  1. 创建名为 anf-nginx-pod.yaml 的文件,并将其复制到以下 YAML 中:

    kind: Pod
    apiVersion: v1
    metadata:
      name: nginx-pod
    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:
        - mountPath: "/mnt/data"
          name: volume
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: anf-pvc
    
  2. 使用 kubectl apply 命令创建 Pod:

    kubectl apply -f anf-nginx-pod.yaml
    

    该命令的输出类似于以下示例:

    pod/nginx-pod created
    

    Kubernetes 已在位于 /mnt/datanginx 容器内创建一个装载了卷并可供访问的 Pod。 可以通过使用 kubectl describe 命令检查 Pod 的事件日志进行确认:

    kubectl describe pod nginx-pod
    

    该命令的输出类似于以下示例:

    [...]
    Volumes:
      volume:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  anf-pvc
        ReadOnly:   false
      default-token-k7952:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-k7952
        Optional:    false
    [...]
    Events:
      Type    Reason                  Age   From                     Message
      ----    ------                  ----  ----                     -------
      Normal  Scheduled               15s   default-scheduler        Successfully assigned trident/nginx-pod to brameshb-non-root-test
      Normal  SuccessfulAttachVolume  15s   attachdetach-controller  AttachVolume.Attach succeeded for volume "pvc-bffa315d-3f44-4770-86eb-c922f567a075"
      Normal  Pulled                  12s   kubelet                  Container image "mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine" already present on machine
      Normal  Created                 11s   kubelet                  Created container nginx
      Normal  Started                 10s   kubelet                  Started container nginx
    

后续步骤

Astra Trident 支持 Azure NetApp 文件的许多功能。 有关详细信息,请参阅: