手动AKS PV失败,并显示“ New-SmbGlobalMapping MountVolume.SetUp的卷失败”错误

时间:2019-07-17 19:19:51

标签: kubernetes azure-aks

我正在尝试在Windows AKS pod上挂载azureFile卷,但出现错误:

  

kubelet,MountVolume.SetUp对于卷“文件共享”失败:   New-SmbGlobalMapping失败:fork / exec   C:\ windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe:   参数不正确。,输出:“”

我的pod.yml看起来像:

apiVersion: v1
kind: Pod
metadata:
  name: q-pod-sample-03
  namespace: mq
spec:
  containers:
  - image: test.azurecr.io/q/p:01
    name: q-ctr-sample-03
    imagePullPolicy: "IfNotPresent"
    volumeMounts:
      - name: azfileshare
        mountPath: 'c:/app/app-data' 
  nodeSelector:
    "beta.kubernetes.io/os": windows
  volumes:
  - name: azfs
    azureFile:
      secretName: qastapv-share-01-secret
      shareName: qastapv-share-01
      readOnly: false

我的secret.yml如下:

apiVersion: v1
kind: Secret
metadata:
  name: qastapv-share-01-secret
  namespace: mq
type: Opaque
data:
  azurestorageaccountname: <Base64Str>
  azurestorageaccountkey: <Base64Str>

我的PV如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-azfs-q-01
  namespace: mq
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  azureFile:
    secretName: qastapv-share-01-secret
    shareName: qastapv-share-01
    readOnly: false
  mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=1000
  - gid=1000

我在这里想念的是什么? 我正在使用AKS 1.14。

1 个答案:

答案 0 :(得分:1)

如我所见,您的yaml文件中有问题。首先,在您的pod yaml文件中:

apiVersion: v1
kind: Pod
metadata:
  name: q-pod-sample-03
  namespace: mq
spec:
  containers:
  - image: test.azurecr.io/q/p:01
    name: q-ctr-sample-03
    imagePullPolicy: "IfNotPresent"
    volumeMounts:
      - name: azfileshare
        mountPath: 'c:/app/app-data' 
  nodeSelector:
    "beta.kubernetes.io/os": windows
  volumes:
  - name: azfileshare         # this name should be the same with the name in volumeMounts
    azureFile:
      secretName: qastapv-share-01-secret
      shareName: qastapv-share-01
      readOnly: false

我不知道如何将存储帐户名和密钥转换为base64。因此,我还将展示两种在AKS中创建机密的方法。

一种方法是使用以下命令进行创建:

kubectl create secret generic azure-secret --from-literal=azurestorageaccountname=$AKS_PERS_STORAGE_ACCOUNT_NAME --from-literal=azurestorageaccountkey=$STORAGE_KEY

第二个方法是使用yaml文件,并将存储帐户名和密钥转换为base64,然后将它们输入到yaml文件中,如下所示:

echo 'storageAccountName' | base64
echo 'storageAccountKey' | base64

显示的yaml文件并输入上述命令的输出。

按照上述步骤,您无需创建PV个人。

有关更多详细信息,请参见Manually create and use a volume with Azure Files share in Azure Kubernetes Service (AKS)。如果要使用PV / PVC,请查看Mount volumes via PV and PVC

更新

如果使用yaml文件创建密钥,则还需要注意将字符串转换为base64的操作系统。不同的操作系统对于base64可能具有不同的规则。对于您来说,您使用Windows节点,因此需要在Windows系统上将存储帐户名和密钥转换为base64。以下是要转换的PowerShell命令:

$Name= [System.Text.Encoding]::UTF8.GetBytes("storageAccountName ")
[System.Convert]::ToBase64String($Name )
$Key = [System.Text.Encoding]::UTF8.GetBytes("storageAccountKey")
[System.Convert]::ToBase64String($Key)