使用 Azure Operator Service Manager (AOSM) 叢集登錄 (CR) 改善雲端原生網路功能的復原能力
文件歷程記錄
- 建立與首次發行:2024 年 7 月 26 日
- 高可用性更新:2024 年 10 月 16 日
- GC 更新:2024 年 11 月 5 日
功能相依性
這項功能需要下列最低環境:
- 最低 AOSM ARM API 版本:2023-09-01
- 第一版,沒有網路功能 (NF) kubernetes 延伸模組的高可用性 (HA):1.0.2711-7
- 第一個版本,針對 NF kubernetes 延伸模組使用高可用性:2.0.2810-144
- 第一個版本,針對 NF kubernetes 延伸模組使用 GC:2.0.2860-160
叢集登錄概觀
Azure Operator Service Manager (AOSM) 叢集登錄 (CR) 可在 Nexus K8s 叢集中啟用容器映像的本機複本。 在啟用叢集登錄的情況下安裝容器化網路功能 (CNF) 時,容器映像會從遠端 AOSM 成品存放區提取並儲存至此本機叢集登錄。 使用變動 Webhook 的叢集登錄會自動攔截映像要求並取代本機登錄路徑,以避免發行者封裝變更。 使用叢集登錄時,CNF 對容器映像的存取在與遠端成品存放區的連線中斷時仍然存在。
主要使用案例和優點
不僅在使用 AOSM 成品存放區進行初始部署期間,雲端原生網路功能 (CNF) 需要存取容器映像,還要讓網路功能保持運作。 其中一些案例包括:
- Pod 重新啟動:停止和啟動 Pod 可能導致叢集節點從登錄提取容器映像。
- Kubernetes 排程器作業:在 Pod 至節點指派期間,根據排程器設定檔規則,如果新節點沒有本機快取的容器映像,節點會從登錄提取容器映像。
使用 AOSM 叢集登錄的優點:
- 提供必要的本機映像,以防止 CNF 中斷與 AOSM 成品存放區的連線遺失。
- 減少 AOSM 成品存放區上的映像提取數目,因為每個叢集節點現在只會從本機登錄提取映像。
- 使用變動 Webhook 來取代適當的本機登錄 URL 路徑,以克服格式錯誤登錄 URL 的問題。
叢集登錄命令語法
AOSM 叢集登錄是使用 Network Function Operator (NFO) Arc K8s 延伸模組來啟用。 下列 CLI 顯示如何在 Nexus K8s 叢集上啟用叢集登錄。
az k8s-extension create --cluster-name
--cluster-type {connectedClusters}
--extension-type {Microsoft.Azure.HybridNetwork}
--name
--resource-group
--scope {cluster}
--release-namespace {azurehybridnetwork}
--release-train {preview, stable}
--config Microsoft.CustomLocation.ServiceAccount=azurehybridnetwork-networkfunction-operator
[--auto-upgrade {false, true}]
[--config global.networkfunctionextension.enableClusterRegistry={false, true}]
[--config global.networkfunctionextension.enableLocalRegistry={false, true}]
[--config global.networkfunctionextension.enableEarlyLoading={false,true}]
[--config global.networkfunctionextension.clusterRegistry.highAvailability.enabled={true, false}]
[--config global.networkfunctionextension.clusterRegistry.autoScaling.enabled={true, false}]
[--config global.networkfunctionextension.webhook.highAvailability.enabled={true, false}]
[--config global.networkfunctionextension.webhook.autoScaling.enabled={true, false}]
[--config global.networkfunctionextension.clusterRegistry.storageClassName=]
[--config global.networkfunctionextension.clusterRegistry.storageSize=]
[--config global.networkfunctionextension.webhook.pod.mutation.matchConditionExpression=]
[--config global.networkfunctionextension.clusterRegistry.clusterRegistryGCCadence=]
[--config global.networkfunctionextension.clusterRegistry.clusterRegistryGCThreshold=]
[--version]
在 Network Function Operator Arc K8s 延伸模組中啟用叢集登錄功能時,從 AOSM 成品存放區部署的任何容器映像都可以在 Nexus K8s 叢集中進行本機存取。 使用者可選擇叢集登錄的永續性儲存體大小。
附註
如果使用者未提供任何輸入,則會使用預設永續性磁碟區 100 GB。
叢集登錄元件
叢集登錄功能會在目標邊緣叢集上部署協助程式 Pod,以協助 NFO 延伸模組。
元件協調器
- 此主要 Pod 負責協調 K8sBridge 在叢集上執行的
Microsoft.Kubernetes資源提供者 (RP)、混合式轉送和 Arc 代理程式的協助下建立的元件自訂資源物件 (CRO)。
Pod 變動 Webhook
- 這些 Pod 會實作 Kubernetes 變動許可 Webhook,以提供變動 API 的執行個體。 變動 API 會執行兩件事:
- 它會修改本機登錄 IP 的映像登錄路徑,並取代 AOSM 成品存放區 Azure Container Registry (ACR)。
- 它會在邊緣叢集上建立成品 CR。
成品協調器
- 此 Pod 會協調變動 Webhook 所建立的成品 CLO。
登錄
- 此 Pod 會儲存和擷取 CNF 的容器映像。
高可用性和復原考量
AOSM NF 延伸模組會使用變動 Webhook 和邊緣登錄來支援主要功能。
- 將 Helm 圖表上線,而不需要自訂映像路徑。
- 本機叢集登錄,可加速 Pod 作業,並啟用中斷連線模式支援。 這些基本元件必須具有高可用性和復原性。
高可用性作業模式詳細資料
啟用高可用性後,叢集登錄和 Webhook Pod 支援至少三個複本和最多五個複本的複本集。 複本集金鑰設定如下所示:
- 使用漸進式推出升級策略。
- PodDisruptionBudgets (PDB) 用於自願中斷期間的可用性。
- Pod 反親和性可用來將 Pod 平均分散到節點。
- 整備度探查可用來確保 Pod 在提供流量之前已就緒。
- AOSM 工作負載 Pod 只會指派給系統節點集區。
- Pod 會在 CPU 和記憶體負載下水平調整。
複本數
- 執行多個複本或應用程式複本的叢集提供第一層備援。 叢集登錄和 Webhook 都定義為 'kind:deployment',至少有三個複本,最多五個複本。
部署策略
- rollUpdate 策略可用來協助實現零停機時間升級,並支援漸進式推出應用程式。 預設 MaxUnavailable 設定一次只允許關閉一個 Pod,直到建立足夠的 Pod 以滿足備援原則為止。
Pod 中斷預算
- 原則中斷預算 (PDB) 可保護 Pod 免於自願中斷,並且會與 Deployment、ReplicaSet 或 StatefulSet 物件一起部署。 針對 AOSM 運算子 Pod,則會使用具有 minAvailable 參數為 2 的 PDB。
Pod 反親和性
- Pod 反親和性可控制應用程式 Pod 在叢集中多個節點之間的散發。 啟用HA後,AOSM會實作下列反親和性規則:
- 使用 preferredDuringSchedulingIgnoredDuringExecution(Soft) 規則類型。 使用軟式排程時,可以使用符合喜好設定準則的拓撲,Kubernetes 會排程 Pod。 如果沒有這類拓撲可用,Pod 仍可在不符合喜好設定的其他節點上排程。
- 拓撲金鑰會根據 kubernetes.io/hostname 的值來使用。
- 使用 100 的權數。
節點親和性
Nexus 節點位置會依設計平均分散到區域,因而產生區域性備援。 AOSM 會使用下列規則,將 Pod 平均分散到節點:
- 偏好沒有「控制平面」角色的節點 (權數:10)
- 偏好具有「系統」模式的節點(權數:20)
儲存體
- 由於 AOSM 邊緣登錄有多個複本,這些複本分散在節點上,因此永續性磁碟區必須支援 ReadWriteManyX (RWX) 存取模式。 PVC Nexus 共用;磁碟區可在 Nexus 叢集上使用,並支援 RWX 存取模式。
透過整備度探查進行監視
- AOSM 會使用 HTTP 整備度探查來得知容器何時就緒可開始接受流量。 當所有容器都就緒時,Pod 就會被視為就緒。 當 Pod 尚未就緒時,會從服務負載平衡器中移除。
系統節點集區
- 所有 AOSM 運算子 Pod 都會指派給系統節點集區。 此集區可防止設定錯誤或惡意應用程式 Pod 影響系統 Pod。
水平調整
- 在 Kubernetes 中,HorizontalPodAutoscaler (HPA) 會自動更新工作負載資源,目的是自動調整工作負載以符合需求。 AOSM 運算子 Pod 已設定下列 HPA 原則參數;
- 至少三個複本。
- 最多五個複本。
- CPU 和記憶體為 80% 的 targetAverageUtilization。
資源限制
- 資源限制可用來防止 AOSM Pod 執行所在節點上的資源多載。 AOSM 使用兩個資源參數來限制 CPU 和記憶體使用量。
- 資源要求 - 應保留給 Pod 的最低數量。 此值應設定為應用程式正常負載下的資源使用量。
- 資源限制 - Pod 應該使用的數量上限,如果使用量達到限制,則會終止。 所有 AOSM 運算子容器都會設定適當的要求、CPU 和記憶體的限制。
已知高可用性限制
- 系統代理程式集區中具有單一作用中節點的 Nexus AKS (NAKS) 叢集不適合高可用性。 Nexus 生產拓撲必須在系統代理程式集區中使用至少三個作用中節點。
- Nexus 共用儲存類別是網路檔案系統 (NFS) 儲存體服務。 此 NFS 儲存體服務適用於每個雲端服務網路 (CSN)。 連結至 CSN 的任何 Nexus Kubernetes 叢集都可以從這個共用存放集區佈建永續性磁碟區。 儲存集區目前限制為網路雲端 (NC) 3.10 的 1 TiB 大小上限,其中 NC 3.12 有 16 TiB 選項。
- Pod 反親和性只會處理 Pod 的初始放置、後續的 Pod 調整和修復,遵循標準 K8s 排程邏輯。
叢集登錄自動清除
啟用後,AOSM NFO 延伸模組會執行背景記憶體回收 (GC) 作業,以定期清除 NAKS 叢集登錄。 記憶體回收是在不再被任何資訊清單參考時,從檔案系統中移除成品的程序。 透過記憶體回收,使用者可以更妥善地管理叢集登錄所使用的磁碟空間。 當需要確保檔案系統上不再存在某些層時,記憶體回收也是一個安全性考量。 GC 作業會根據排程執行,檢查叢集登錄使用量是否達到指定的閾值,如果達到指定的閾值,則啟動記憶體回收程序。
清除未使用的映像資訊清單
AOSM 會維護 Pod 擁有者資源與叢集登錄中取用成品之間的參考。 起始叢集登錄清除程序時,會識別未連結至任何 Pod 的成品,並發出虛刪除以將其從叢集登錄中移除。 這種類型的虛刪除不會立即釋放叢集登錄儲存空間。 實際移除映像檔取決於實際的登錄垃圾收集設定。
附註
Pod 擁有者與其容器成品之間的參考可確保 AOSM 不會錯誤地刪除成品。 例如,如果複本集 Pod 關閉,AOSM 不會取值成品。 AOSM 只會在刪除複本集時取值成品。 相同的原則適用於 Kubernetes 作業和精靈集所管理的 Pod。
記憶體回收散發
AOSM 相依於記憶體回收 | 公開散發所提供的記憶體回收功能。 AOSM 實作標準的兩階段「標記和整理」程序,以刪除成品並釋放登錄儲存空間。 首先,會標記符合條件的映像,然後只有在符合特定準則時,才會在整理期間清除。
附註
GC 程序需要叢集登錄處於唯讀模式。 否則,可能會錯誤地刪除成品,導致成品損毀。 當 GC 執行時,它會將登錄鎖定在唯讀模式最多 1 分鐘。 在此期間,AOSM 會延遲新的作業,直到釋放登錄鎖定為止。
叢集登錄自動清除參數
下列參數會設定記憶體回收作業的排程和閾值。
- global.networkfunctionextension.clusterRegistry.clusterRegistryGCCadence
- global.networkfunctionextension.clusterRegistry.clusterRegistryGCThreshold
- 如需更多組態詳細數據,請參閱最新的 網路功能擴充功能安裝指示
常見問題集
是否可以搭配先前部署的 CNF 應用程式使用 AOSM 叢集登錄?
如果 CNF 應用程式已在沒有叢集登錄的情況下部署,則不會自動使用容器映像。 必須先啟用叢集登錄,才能使用 AOSM 部署網路功能。
我可在部署之後變更儲存體大小嗎?
在初始部署之後,無法修改儲存體大小。 建議將磁碟區大小設定為起始大小的 3 倍到 4 倍。
我可以列出目前儲存在叢集存放庫中的檔案嗎?
下列命令可用來列出人類可讀取格式的檔案:
kubectl get artifacts -A -o jsonpath='{range .items[*]}{.spec.sourceArtifact}'
這個指令應該產生下列輸出:
ppleltestpublisheras2f88b55037.azurecr.io/nginx:1.0.0