【问题标题】:How to solve AzureFile mount error(22): Invalid argument inside container?如何解决 AzureFile mount error(22): Invalid argument inside container?
【发布时间】:2020-10-26 19:15:35
【问题描述】:

在 AKS(1.18.2) 容器中安装 AzureFile Share 时出错(在 Ubuntu 18.04 之上构建并安装了 cifs-utils):

Warning  FailedMount  0s  kubelet, aks-nodepool1-37397744-vmss000001  MountVolume.SetUp failed for volume "myapplication-logs" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/5e19e1d0-0bfd-4760-a87a-00cb0f3e573a/volumes/kubernetes.io~azure-file/crawler-logs --scope -- mount -t cifs -o file_mode=0777,dir_mode=0777,vers=3.0,<masked> //myazurestorage.file.core.windows.net/crawler-logs /var/lib/kubelet/pods/5e19e1d0-0bfd-4760-a87a-00cb0f3e573a/volumes/kubernetes.io~azure-file/myapplication-logs
Output: Running scope as unit run-r403b463e326d4562a7e44dc8fe018b4b.scope.
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

这是我的 yaml 配置:

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: myapplication-logs
    provisioner: kubernetes.io/azure-file
    reclaimPolicy: Retain
    allowVolumeExpansion: true
    parameters:
      skuName: Standard_LRS
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: myapplication-logs
    spec:
      capacity:
        storage: 3Gi
      accessModes:
        - ReadWriteMany
      storageClassName: myapplication-logs
      azureFile:
        secretName: azurefilesharesecretname}
        shareName: myapplication-logs
        readOnly: false
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: myapplication-logs
    spec:
      accessModes:
      - ReadWriteMany
      storageClassName: myapplication-logs
      resources:
        requests:
          storage: 3Gi
    ---
    apiVersion: apps/v1
    spec:
      selector:
        matchLabels:
          app: myapplication
      replicas: 1
      template:
        spec:
          containers:
            name: myapplication
            readinessProbe:
              httpGet:
                path: /probes/ready
                port: 5000
              timeoutSeconds: 60
              periodSeconds: 10
            ports:
            - containerPort: 21602
            - containerPort: 5000
            livenessProbe:
              httpGet:
                path: /probes/healthy
                port: 5000
              initialDelaySeconds: 30
              periodSeconds: 10
              timeoutSeconds: 30
            image: myappacr.azurecr.io/myapplication:1.0.391
            volumeMounts:
            - readOnly: true
              name: secrets-volume
              mountPath: /usr/bin/myapp/Secrets
            - name: configuration-volume
              mountPath: /usr/bin/myapp/Configuration
            - name: myapplication-logs
              mountPath: /usr/bin/myapp/logs
    
          imagePullSecrets:
          - name: acr-dev-regcred
          volumes:
          - name: secrets-volume
            secret:
              secretName: myapplication-secrets
          - configMap:
              name: myapplication-configuration
            name: configuration-volume
          - name: myapplication-logs
            persistentVolumeClaim:
              claimName: myapplication-logs
        metadata:
          labels:
            app: myapplication
    kind: Deployment
    metadata:
      name: myapplication-deployment
      labels:
        app: myapplication

StorageClass、PersistentVolume 和 PersistentVolumeClaim 部署成功,没有任何错误\事件。

找不到问题出在哪里? 对正在发生的事情有任何想法吗?

【问题讨论】:

    标签: kubernetes mount azure-aks azure-files


    【解决方案1】:

    问题解决了! 我创建的秘密存在问题。 它是用 kubectl apply -f secret.json 创建的,accountstoragekey 没有用 base64 编码。

    感谢 Azure 支持!

    【讨论】:

      【解决方案2】:

      有两种方法可以将 Azure 文件共享用作 AKS 中容器中的卷

      1. 通过 Azure 文件共享手动创建和使用卷。文档here

      这种情况下PV需要指定mountOptions

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: azurefile
      spec:
        capacity:
          storage: 5Gi
        accessModes:
          - ReadWriteMany
        storageClassName: azurefile
        azureFile:
          secretName: azure-secret
          shareName: aksshare
          readOnly: false
        mountOptions:
        - dir_mode=0777
        - file_mode=0777
        - uid=1000
        - gid=1000
        - mfsymlinks
        - nobrl
      
      1. 动态创建持久卷并将其与 Azure 文件一起使用。文档here

      在这种情况下,StorageClass 需要有mountOptions

      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: my-azurefile
      provisioner: kubernetes.io/azure-file
      mountOptions:
        - dir_mode=0777
        - file_mode=0777
        - uid=0
        - gid=0
        - mfsymlinks
        - cache=strict
      parameters:
        skuName: Standard_LRS
      

      现在查看您的 yamls 似乎您正在混合手动和动态模式,因为您正在创建 PersistentVolume 和 StorageClass。我建议采用一种合适的方法,并正确指定mountOptions,这对于两种模式都是强制性的。

      【讨论】:

      • 我尝试了很多方法 - 首先当然是这里的 Microsoft 文档:docs.microsoft.com/en-us/azure/aks/azure-files-volume 只有动态有效 - 但我需要静态代替。我创建自己的 StorageClass 的原因是因为一些参数:```reclaimPolicy: Retain allowVolumeExpansion: true ``
      • 该文档在 PersistentVolume 中显示了挂载选项。您尝试过吗?
      • 是的,舒尔!所有组合 - 有和没有安装选项。
      • 另外我假设这些 mountOptions 现在在 kubernetes 版本 1.18.2 中是默认的 - 至少错误显示了所有参数 - 并且有与 mountOptions 中相同的参数
      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2023-03-16
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多