挂载azure文件nfs共享到pod

问题描述 投票:0回答:1

尝试将 azure 文件 nfs 共享挂载到 kubernetes pod,但得到以下信息:

MountVolume.MountDevice 卷“#azurestorage#fileshare2#azurestorage-volume#ephemeral--azure-storage-poc”失败:rpc 错误:代码 = 内部 desc = 卷(#azurestorage#fileshare2#azurestorage-volume#ephemeral- -azure-storage-poc) 在 /var/lib/kubelet/plugins/kubernetes.io/csi/file.csi.azure.com//globalmount 上挂载 //.file.core.windows.net/fileshare2挂载失败:退出状态 32 安装命令:mount 安装参数:-t cifs -o dir_mode=0777,actimeo=30,mfsymlinks,nosharesock,file_mode=0777, //stgactdbanfs.file.core.windows.net/fileshare2 / var/lib/kubelet/plugins/kubernetes.io/csi/file.csi.azure.com//globalmount 输出:挂载错误(13):权限被拒绝 请参阅 mount.cifs(8) 手册页(例如 man mount.cifs)和内核日志消息(dmesg)请参考 http://aka.ms/filemounterror 了解安装错误的可能原因和解决方案。

关键问题是安装错误 13。根据 文档:

  • 我已经确认它有一个私有端点
  • 我已确认托管 aks 集群的虚拟网络与包含专用终结点的专用 DNS 区域之间存在虚拟网络链接
  • 我还明确启用了来自选定网络的流量,并将来自集群 vnet 内子网的流量开放到存储帐户中

我还注意到,根据文档,错误消息引用的是 .file.core.windows.net,而不是 .file.core.windows.net,这表明它没有针对专用端点进行解析

但是我在存储类中指定了专用端点

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: azurestoragepoc4
provisioner: file.csi.azure.com 
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict
  - actimeo=30
parameters:
  skuName: Premium_LRS
  location: eastus2
  resourceGroup: <resource-group>
  accountName: <storageaccout>.privatelink.file.core.windows.net
  shareName: fileshare2
  protocol: nfs

和PV:

apiVersion: "v1"
kind: "PersistentVolume"
metadata:
  name: "pv0002"
spec:
  capacity:
    storage: "100Mi"
  accessModes:
  - "ReadWriteMany"
  storageClassName: azurestoragepoc4
  azureFile:
    accountName: <storageaccount>.privatelink.file.core.windows.net
    secretName: accountkey
    shareName: fileshare2
    readOnly: false
    claimRef:
      name: claim4

secretName 值通过 Vault 提取

不确定我在这里缺少什么,我已经确认保险库中的值是正确的,连接已打开。我是否缺少 aks vmss 特有的内容?我从其他文章中读到,此错误代码通常与缺少依赖项(例如 nfs-common-utils

)相关

有什么见解吗?

azure kubernetes azure-blob-storage azure-aks persistent-volumes
1个回答
0
投票

您遇到的错误,

mount error(13): Permission denied
,通常表示尝试挂载 NFS 共享时出现身份验证或授权问题。根据您的设置和故障排除步骤的详细描述,您似乎已经解决了许多常见问题。然而,一些领域仍然可能存在问题或值得重新检查。该错误消息表明存在潜在的 DNS 解析问题,因为它正在尝试解析
.file.core.windows.net
,而不是使用您指定的专用端点。这可能表明 AKS 群集中的 DNS 设置存在问题。您使用的安装选项适用于 CIFS/SMB (
-t cifs
),但您提到要使用 NFS。 NFS 和 CIFS 是不同的协议,并且各自的挂载选项不可互换。

Azure 文件是 Azure 中的托管文件共享服务。最初,该服务仅支持 CIFS/SMB 作为挂载/访问文件的协议。 CIFS/SMB 与 NFS 类似,但它是不同的协议。为了使 Azure 文件对 Linux 用户更加友好,最近发布了公开 NFS 端点的 Azure 文件预览版。

在下面的示例中,我将使用专用终结点通过 NFS 设置 Azure 文件。

首先,我们需要注册预览功能:

az feature register --name AllowNfsFileShares --namespace Microsoft.Storage
az provider register --namespace Microsoft.Storage

注册需要一段时间。要获取状态,请使用以下命令。

az feature show --name AllowNfsFileShares --namespace Microsoft.Storage --query properties.state

准备好后,我们可以创建这项工作所需的网络:

RGNAME=nfsaks
VNETNAME=nfsaks
az group create -n $RGNAME -l westus2
az network vnet create -g $RGNAME -n $VNETNAME \
  --address-prefixes 10.0.0.0/16 --subnet-name aks \
  --subnet-prefixes 10.0.0.0/24
az network vnet subnet create -g $RGNAME --vnet-name $VNETNAME \
  -n NFS --address-prefixes 10.0.1.0/24 

enter image description here

接下来,让我们创建存储帐户,仅启用 HTTPS,然后创建共享:

STACC=nfnfsaks
az storage account create \
  --name $STACC \
  --resource-group $RGNAME \
  --location westus2 \
  --sku Premium_LRS \
  --kind FileStorage
az storage account update --https-only false \
  --name $STACC --resource-group $RGNAME
az storage share-rm create \
  --storage-account $STACC \
  --enabled-protocol NFS \
  --root-squash RootSquash \
  --name "akstest" \
  --quota 100

enter image description here

接下来,我们需要为此设置一个私有端点。

SUBNETID=`az network vnet subnet show \
  --resource-group $RGNAME \
  --vnet-name $VNETNAME \
  --name NFS \
  --query "id" -o tsv `
STACCID=`az storage account show \
  --resource-group $RGNAME \
  --name $STACC \
  --query "id" -o tsv `
az network vnet subnet update \
  --ids $SUBNETID\
  --disable-private-endpoint-network-policies 
ENDPOINT=`az network private-endpoint create \
  --resource-group $RGNAME \
  --name "$STACC-PrivateEndpoint" \
  --location westus2 \
  --subnet $SUBNETID \
  --private-connection-resource-id $STACCID\
  --group-id "file" \
  --connection-name "$STACC-Connection" \
  --query "id" -o tsv `

enter image description here

创建专用端点后,我们还需要创建 DNS 区域并为我们的存储帐户设置 A 记录:

DNSZONENAME="privatelink.file.core.windows.net"
VNETID=`az network vnet show \
  --resource-group $RGNAME \
  --name $VNETNAME \
  --query "id" -o tsv`
dnsZone=`az network private-dns zone create \
  --resource-group $RGNAME \
  --name $DNSZONENAME \
  --query "id" -o tsv`
az network private-dns link vnet create \
  --resource-group $RGNAME \
  --zone-name $DNSZONENAME \
  --name "$VNETNAME-DnsLink" \
  --virtual-network $VNETID \
  --registration-enabled false 

ENDPOINTNIC=`az network private-endpoint show \
  --ids $ENDPOINT \
  --query "networkInterfaces[0].id" -o tsv `
ENDPOINTIP=`az network nic show \
  --ids $ENDPOINTNIC \
  --query "ipConfigurations[0].privateIpAddress" -o tsv `

az network private-dns record-set a create \
        --resource-group $RGNAME \
        --zone-name $DNSZONENAME \
        --name $STACC 
az network private-dns record-set a add-record \
        --resource-group $RGNAME \
        --zone-name $DNSZONENAME  \
        --record-set-name $STACC \
        --ipv4-address $ENDPOINTIP 

enter image description here enter image description here 在 AKS 中挂载 NFS

我们首先在之前预先创建的 AKS 子网中创建一个新集群:

AKSSUBNETID=`az network vnet subnet show \
  --resource-group $RGNAME \
  --vnet-name $VNETNAME \
  --name AKS\
  --query "id" -o tsv `
az aks create -g $RGNAME -n nfstest \
 --vnet-subnet-id $AKSSUBNETID \
 --service-cidr 10.1.0.0/16 \
 --dns-service-ip 10.1.0.10 \
 --network-plugin kubenet
az aks get-credentials -g $RGNAME -n nfstest

enter image description here

创建集群后,我们可以继续创建一个挂载 NFS 共享的 pod。

apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  containers:
  - name: myapp
    image: busybox
    command: ["/bin/sh", "-ec", "sleep 1000"]
    volumeMounts:
      - name: nfs
        mountPath: /var/nfs
  volumes:
  - name: nfs
    nfs:
      server: nfnfsaks.file.core.windows.net
      path: "/nfnfsaks/akstest"

我们可以使用

kubectl create -f pod-with-nfs.yaml
创建这个 Pod。

enter image description here

一旦我们有了 Pod,我们就可以执行它,并查看文件共享上有什么可用的。

enter image description here

enter image description here

这就是如何在 Azure Kubernetes 集群中通过 NFS 挂载 Azure 文件。

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.