AzureDisk

AzureDiskarrow-up-right 爲 Azure 上面運行的虛擬機提供了彈性塊存儲服務,它以 VHD 的形式掛載到虛擬機中,並可以在 Kubernetes 容器中使用。AzureDisk 優點是性能高,特別是 Premium Storage 提供了非常好的性能arrow-up-right;其缺點是不支持共享,只可以用在單個 Pod 內。

根據配置的不同,Kubernetes 支持的 AzureDisk 可以分爲以下幾類

  • Managed Disks: 由 Azure 自動管理磁盤和存儲賬戶

  • Blob Disks:

    • Dedicated (默認):爲每個 AzureDisk 創建單獨的存儲賬戶,當刪除 PVC 的時候刪除該存儲賬戶

    • Shared:AzureDisk 共享 ResourceGroup 內的同一個存儲賬戶,這時刪除 PVC 不會刪除該存儲賬戶

注意:

  • AzureDisk 的類型必須跟 VM OS Disk 類型一致,即要麼都是 Manged Disks,要麼都是 Blob Disks。當兩者不一致時,AzureDisk PV 會報無法掛載的錯誤。

  • 由於 Managed Disks 需要創建和管理存儲賬戶,其創建過程會比 Blob Disks 慢(3 分鐘 vs 1-2 分鐘)。

  • 但節點最大支持同時掛載 16 個 AzureDisk。

使用 AzureDisk 推薦的版本:

Kubernetes version
Recommended version

1.12

1.12.9 或更高版本

1.13

1.13.6 或更高版本

1.14

1.14.2 或更高版本

>=1.15

>=1.15

使用 aks-enginearrow-up-right 部署的 Kubernetes 集群,會自動創建兩個 StorageClass,默認爲managed-standard(即HDD):

kubectl get storageclass
NAME                PROVISIONER                AGE
default (default)   kubernetes.io/azure-disk   45d
managed-premium     kubernetes.io/azure-disk   53d
managed-standard    kubernetes.io/azure-disk   53d

AzureDisk 掛載失敗

在 AzureDisk 從一個 Pod 遷移到另一 Node 上面的 Pod 時或者同一臺 Node 上面使用了多塊 AzureDisk 時有可能會碰到這個問題。這是由於 kube-controller-manager 未對 AttachDisk 和 DetachDisk 操作加鎖從而引發了競爭問題(kubernetes#60101arrow-up-right acs-engine#2002arrow-up-right ACS#12arrow-up-right)。

通過 kube-controller-manager 的日誌,可以查看具體的錯誤原因。常見的錯誤日誌爲

臨時性解決方法爲

(1)更新所有受影響的虛擬機狀態

使用powershell:

使用 Azure CLI:

(2)重啓虛擬機

  • kubectl cordon NODE

  • 如果 Node 上運行有 StatefulSet,需要手動刪除相應的 Pod

  • kubectl drain NODE

  • Get-AzureRMVM -ResourceGroupName $rg -Name $vmname | Restart-AzureVM

  • kubectl uncordon NODE

該問題的修復 #60183arrow-up-right 已包含在 v1.10 中。

掛載新的 AzureDisk 後,該 Node 中其他 Pod 已掛載的 AzureDisk 不可用

在 Kubernetes v1.7 中,AzureDisk 默認的緩存策略修改爲 ReadWrite,這會導致在同一個 Node 中掛載超過 5 塊 AzureDisk 時,已有 AzureDisk 的盤符會隨機改變(kubernetes#60344arrow-up-right kubernetes#57444arrow-up-right AKS#201arrow-up-right acs-engine#1918arrow-up-right)。比如,當掛載第六塊 AzureDisk 後,原來 lun0 磁盤的掛載盤符有可能從 sdc 變成 sdk

這樣,原來使用 lun0 磁盤的 Pod 就無法訪問 AzureDisk 了

臨時性解決方法是設置 AzureDisk StorageClass 的 cachingmode: None,如

該問題的修復 #60346arrow-up-right 將包含在 v1.10 中。

AzureDisk 掛載慢

AzureDisk PVC 的掛載過程一般需要 1 分鐘的時間,這些時間主要消耗在 Azure ARM API 的調用上(查詢 VM 以及掛載 Disk)。#57432arrow-up-right 爲 Azure VM 增加了一個緩存,消除了 VM 的查詢時間,將整個掛載過程縮短到大約 30 秒。該修復包含在v1.9.2+ 和 v1.10 中。

另外,如果 Node 使用了 Standard_B1s 類型的虛擬機,那麼 AzureDisk 的第一次掛載一般會超時,等再次重複時纔會掛載成功。這是因爲在 Standard_B1s 虛擬機中格式化 AzureDisk 就需要很長時間(如超過 70 秒)。

Azure German Cloud 無法使用 AzureDisk

Azure German Cloud 僅在 v1.7.9+、v1.8.3+ 以及更新版本中支持(#50673arrow-up-right),升級 Kubernetes 版本即可解決。

MountVolume.WaitForAttach failed

該問題arrow-up-right 僅在 Kubernetes v1.10.0 和 v1.10.1 中存在,將在 v1.10.2 中修復。

在 mountOptions 中設置 uid 和 gid 時失敗

默認情況下,Azure 磁盤使用 ext4、xfs filesystem 和 mountOptions,如 uid = x,gid = x 無法在裝入時設置。 例如,如果你嘗試設置 mountOptions uid = 999,gid = 999,將看到類似於以下內容的錯誤:

可以通過執行以下操作之一來緩解此問題

備註: 因爲 gid 和 uid 默認裝載爲 root 或0。如果 gid 或 uid 設置爲非根(例如1000),則 Kubernetes 將使用 chown 更改該磁盤下的所有目錄和文件。此操作可能非常耗時,並且可能會導致裝載磁盤的速度非常慢。

  • 使用 initContainers 中的 chown 設置 gid 和 uid。例如:

刪除 pod 使用的 Azure 磁盤 PersistentVolumeClaim 時出錯

如果嘗試刪除 pod 使用的 Azure 磁盤 PersistentVolumeClaim,可能會看到錯誤。例如:

在 Kubernetes 版本1.10 及更高版本中,默認情況下已啓用 PersistentVolumeClaim protection 功能以防止此錯誤。如果你使用的 Kubernetes 版本不能解決此問題,則可以通過在刪除 PersistentVolumeClaim 前使用 PersistentVolumeClaim 刪除 pod 來緩解此問題。

參考文檔

Last updated