共用方式為


無法在 Azure 磁碟上設定 uid 和 gid 掛接選項

本文討論當您嘗試在 Azure 磁碟上設定使用者識別碼 () 和群組標識碼 (uidgid) 的掛接選項時,如何修正Microsoft Azure Kubernetes Service (AKS) 叢集上所發生的問題。

徵兆

如果您嘗試在 Azure 磁碟的記憶體類別組態設定中mountOptions設定 uidgid 1000,您會收到類似下列文字的錯誤:

Warning  FailedMount             63s                  kubelet, aks-nodepool1-29460110-0  MountVolume.MountDevice failed for volume "pvc-d783d0e4-85a1-11e9-8a90-369885447933" : azureDisk - mountDevice:FormatAndMount failed with mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/plugins/kubernetes.io/azure-disk/mounts/m436970985 --scope -- mount -t xfs -o dir_mode=0777,file_mode=0777,uid=1000,gid=1000,defaults /dev/disk/azure/scsi1/lun2 /var/lib/kubelet/plugins/kubernetes.io/azure-disk/mounts/m436970985
Output: Running scope as unit run-rb21966413ab449b3a242ae9b0fbc9398.scope.
mount: wrong fs type, bad option, bad superblock on /dev/sde,
       missing codepage or helper program, or other error

原因

Azure 磁碟預設會使用 ext4/xfs 文件系統,而且掛接選項,例如 uid=x,gid=x 無法在掛接時設定。

因應措施 1:使用 Pod 安全性內容來指定使用者和群組

設定 Pod 的安全性內容。 在 Pod 組態檔 (YAML 格式)的 spec/securityContext 欄位中,將欄位設定 runAsUser 為先前指定的 uid 值,並將欄位設定 fsGroup 為先前指定的 gid 值。 例如,組態檔的開頭可能會類似下列程序代碼:

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 0
    fsGroup: 0

注意

根據預設, giduid 選項會掛接為根或 0。 如果這些選項設定為非根目錄(例如 1000),Kubernetes 會使用變更擁有者命令 (chown) 來變更該磁碟內的所有目錄和檔案。 這項作業可能很耗時,而且可能會讓磁碟掛接作業變慢。

因應措施 2:使用 init 容器和變更擁有者命令來指定使用者和群組

設定 init 容器,然後執行 chown 命令,指定容器中的使用者和群組值。 下列程式代碼示範如何設定 init 容器來設定使用者和群組:

initContainers:
- name: volume-mount
  image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11
  command: ["sh", "-c", "chown -R 100:100 /data"]
  volumeMounts:
  - name: <your-data-volume>
    mountPath: /data

協力廠商資訊免責聲明

本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。