本文討論當您嘗試在 Azure 磁碟上設定使用者識別碼 () 和群組標識碼 (uid
gid
) 的掛接選項時,如何修正Microsoft Azure Kubernetes Service (AKS) 叢集上所發生的問題。
徵兆
如果您嘗試在 Azure 磁碟的記憶體類別組態設定中mountOptions
設定 uid
和 gid
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
注意
根據預設, gid
和 uid
選項會掛接為根或 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 意見反應社群提交產品意見反應。