尝试将 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。根据 文档:
我还注意到,根据文档,错误消息引用的是 .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
)相关有什么见解吗?
您遇到的错误,
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
接下来,让我们创建存储帐户,仅启用 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
接下来,我们需要为此设置一个私有端点。
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 `
创建专用端点后,我们还需要创建 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
在 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
创建集群后,我们可以继续创建一个挂载 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。
一旦我们有了 Pod,我们就可以执行它,并查看文件共享上有什么可用的。
这就是如何在 Azure Kubernetes 集群中通过 NFS 挂载 Azure 文件。
参考资料: