分享方式:


自訂 Azure Kubernetes Service (AKS) 節點集區的節點設定

自訂節點設定可讓您調整作業系統 (OS) 設定或 kubelet 參數,以符合工作負載需求。 當您建立 AKS 叢集或將節點集區新增至叢集時,可以自訂常用 OS 和 kubelet 設定子集。 若要設定此子集以外的設定,您可以使用精靈集來自訂所需的設定,而不會遺失節點的 AKS 支援 (部分機器翻譯)。

使用自訂的節點設定建立 AKS 叢集

建立設定檔

OS 和 kubelet 組態變更需要您建立具有參數和所需設定的新組態檔。 如果未指定參數的值,則值會設定為預設值。

Kubelet 設定

建立含有下列內容的檔案 linuxkubeletconfig.json

{
 "cpuManagerPolicy": "static",
 "cpuCfsQuota": true,
 "cpuCfsQuotaPeriod": "200ms",
 "imageGcHighThreshold": 90,
 "imageGcLowThreshold": 70,
 "topologyManagerPolicy": "best-effort",
 "allowedUnsafeSysctls": [
  "kernel.msg*",
  "net.*"
],
 "failSwapOn": false
}

OS 設定

建立含有下列內容的檔案 linuxosconfig.json

{
 "transparentHugePageEnabled": "madvise",
 "transparentHugePageDefrag": "defer+madvise",
 "swapFileSizeMB": 1500,
 "sysctls": {
  "netCoreSomaxconn": 163849,
  "netIpv4TcpTwReuse": true,
  "netIpv4IpLocalPortRange": "32000 60000"
 }
}

使用自訂設定檔建立新的叢集

建立新的叢集時,您可以使用在先前步驟中建立的自訂設定檔來指定 kubelet 設定、OS 設定或兩者。

注意

如果您在建立叢集時指定設定,則只有初始節點集區中的節點才會套用該設定。 JSON 檔案中未設定的任何設定都會保留預設值。 不支援 CustomLinuxOsConfig 的 OS 類型:Windows。

使用 az aks create (部分機器翻譯) 命令並指定您的設定檔,使用自訂設定檔來建立新的叢集。 下列範例命令會建立具有自訂 ./linuxkubeletconfig.json./linuxosconfig.json 檔案的新叢集:

az aks create --name myAKSCluster --resource-group myResourceGroup --kubelet-config ./linuxkubeletconfig.json --linux-os-config ./linuxosconfig.json

使用自訂設定檔新增節點集區

將節點集區新增到叢集時,您可以使用在先前步驟中建立的自訂設定檔來指定 kubelet 設定。 Linux 和 Windows 10 節點集區不支援 CustomKubeletConfig

注意

當您將 Linux 節點集區新增至現有叢集時,可以指定 kubelet 設定、OS 設定或兩者。 當您將 Windows 節點集區新增至現有叢集時,僅能指定 kubelet 設定。 如果您在新增節點集區時指定設定,則只有新節點集區中的節點才會套用該設定。 JSON 檔案中未設定的任何設定都會保留預設值。

az aks nodepool add --name mynodepool1 --cluster-name myAKSCluster --resource-group myResourceGroup --kubelet-config ./linuxkubeletconfig.json

其他設定

下列設定可以用來修改其他作業系統設定:

當天的訊息

傳遞具有檔案位置的 --message-of-the-day 旗標,以在叢集建立或節點集區建立時取代 Linux 節點上當天的訊息。

az aks create --cluster-name myAKSCluster --resource-group myResourceGroup --message-of-the-day ./newMOTD.txt
Nodepool 建立
az aks nodepool add --name mynodepool1 --cluster-name myAKSCluster --resource-group myResourceGroup --message-of-the-day ./newMOTD.txt

針對自定義節點組態進行疑難解答

確認已套用設定

在套用自訂節點設定之後,您可以連線至主機 (部分機器翻譯),並驗證已在檔案系統上進行 sysctl 或設定變更,以確認這些設定已套用至節點。

自訂節點設定支援的參數

Kubelet 自訂設定

Linux 和 Windows 節點集區支援 kubelet 自訂設定。 支援的參數有所不同,如下所述。

Linux Kubelet 自訂設定

參數 允許的值/間隔 預設 描述
cpuManagerPolicy 無、靜態 none 靜態原則可讓具有整數 CPU 要求的保證 Pod 中的容器存取節點上的獨佔 CPU。
cpuCfsQuota True、False true 針對指定 CPU 限制的容器啟用/停用 CPU CFS 配額強制執行。
cpuCfsQuotaPeriod 間隔 (毫秒) 100ms 設定 CPU CFS 配額期間值。
imageGcHighThreshold 0-100 85 磁碟使用量的百分比,在此百分比之後,一律會執行映像記憶體回收。 觸發記憶體回收的最小磁碟使用量。 若要停用映像記憶體回收,請設定為 100。
imageGcLowThreshold 0-100,不高於 imageGcHighThreshold 80 磁碟使用量的百分比,在此百分比之前,絕不會執行映像記憶體回收。 觸發記憶體回收的最小磁碟使用量。
topologyManagerPolicy none、best-effort、restricted、single-numa-node none 最佳化 NUMA 節點對齊方式,如需詳細資訊,請參閱這裡
allowedUnsafeSysctls kernel.shm*、、 kernel.msg*kernel.semfs.mqueue.*net.* 不安全 sysctls 或不安全 sysctl 模式的允許清單。
containerLogMaxSizeMB 大小 (MB) 50 容器記錄檔在輪替之前的大小上限 (例如 10 MB)。
containerLogMaxFiles ≥ 2 5 容器可存在的容器記錄檔數目上限。
podMaxPids -1 到核心 PID 限制 -1 (∞) 可在 Pod 中執行的程序識別碼數量上限
seccompDefault Unconfined, RuntimeDefault Unconfined 設定所有工作負載的預設 seccomp 設定檔。 RuntimeDefault 會使用 containerd 的預設 seccomp 配置檔,限制特定系統呼叫來增強安全性。 受限制的 syscalls 將會失敗。 Unconfined 不會限制 syscalls,而且允許所有系統呼叫以減少安全性。 如需詳細資訊,請參閱 containerD default seccomp 配置檔。 此參數處於預覽狀態。 使用az feature register命令搭配 --namespace “Microsoft.ContainerService” 註冊 “KubeletDefaultSeccompProfilePreview” 功能旗標。

Windows Kubelet 自訂設定

參數 允許的值/間隔 預設 描述
imageGcHighThreshold 0-100 85 磁碟使用量的百分比,在此百分比之後,一律會執行映像記憶體回收。 觸發記憶體回收的最小磁碟使用量。 若要停用映像記憶體回收,請設定為 100。
imageGcLowThreshold 0-100,不高於 imageGcHighThreshold 80 磁碟使用量的百分比,在此百分比之前,絕不會執行映像記憶體回收。 觸發記憶體回收的最小磁碟使用量。
containerLogMaxSizeMB 大小 (MB) 10 容器記錄檔在輪替之前的大小上限 (例如 10 MB)。
containerLogMaxFiles ≥ 2 5 容器可存在的容器記錄檔數目上限。

Linux 自訂 OS 組態設定

重要

為了簡化搜尋和可讀性,本文會依名稱顯示 OS 設定,但應該使用 camelCase 大寫慣例,將其新增至設定 JSON 檔案或 AKS API。

例如,如果您修改 'vm.max_map_count' 設定,則應該在設定 JSON 檔案中重新格式化為 'vmMaxMapCount'。

檔案控制代碼限制

服務大量流量時,流量通常來自大量本機檔案。 您可以調整下列核心設定和內建限制,讓您能夠處理更多項目,但會耗用部分系統記憶體。

設定 允許的值/間隔 預設 描述
fs.file-max 8192 - 12000500 709620 Linux 核心將配置的檔案控制代碼數目上限,而增加此值,即可增加允許的已開啟檔案數目上限。
fs.inotify.max_user_watches 781250 - 2097152 1048576 系統允許的檔案監看式次數上限。 每個「監看式」在 32 位元核心上大約是 90 個位元組,而在 64 位元核心上大約是 160 個位元組。
fs.aio-max-nr 65536 - 6553500 65536 aio-nr 顯示目前全系統的非同步 IO 要求數目。 aio-max-nr 可讓您變更 aio-nr 可成長為的最大值。
fs.nr_open 8192 - 20000500 1048576 程序可配置的檔案控制代碼數目上限。

通訊端和網路微調

針對預期要處理非常大量並行工作階段的代理程式節點,您可以使用下面的 TCP 和網路選項子集,以調整每個節點集區。

設定 允許的值/間隔 預設 描述
net.core.somaxconn 4096 - 3240000 16384 可針對任何所指定接聽通訊端排入佇列的連線要求數目上限。 傳遞至 listen(2) 函數的待處理項目參數值上限。 如果待處理項目引數大於 somaxconn,則會以無訊息方式截斷此限制。
net.core.netdev_max_backlog 1000 - 3240000 1000 介面接收封包的速度比核心處理封包的速度還要快時,在 INPUT 端排入佇列的封包數目上限。
net.core.rmem_max 212992 - 134217728 212992 接收通訊端緩衝區大小上限 (位元組)。
net.core.wmem_max 212992 - 134217728 212992 傳送通訊端緩衝區大小上限 (位元組)。
net.core.optmem_max 20480 - 4194304 20480 每個通訊端允許的輔助緩衝區大小上限 (選項記憶體緩衝區)。 少數情況會使用通訊端選項記憶體來儲存與通訊端使用相關的額外結構。
net.ipv4.tcp_max_syn_backlog 128 - 3240000 16384 尚未接收到連線端用戶端通知的佇列連線要求數目上限。 如果超過此數目,則核心將會開始卸除要求。
net.ipv4.tcp_max_tw_buckets 8000 - 1440000 32768 系統同時持有的 timewait 通訊端數目上限。 如果超過此數目,則會立即終結時間等候通訊端,並列印出警告。
net.ipv4.tcp_fin_timeout 5 - 120 60 孤立 (任何應用程式都不再參考) 連線在本機端中止之前,將維持 FIN_WAIT_2 狀態的時間長度。
net.ipv4.tcp_keepalive_time 30 - 432000 7200 啟用 keepalive 時,TCP 送出 keepalive 訊息的頻率。
net.ipv4.tcp_keepalive_probes 1 - 15 9 TCP 在決定連線中斷之前所送出的 keepalive 探查數目。
net.ipv4.tcp_keepalive_intvl 10 - 90 75 送出探查的頻率。將其乘上 tcp_keepalive_probes,即構成啟動探查之後終止未回應連線的時間。
net.ipv4.tcp_tw_reuse 0 或 1 0 在通訊協定觀點視為安全時,允許針對新的連線重複使用 TIME-WAIT 通訊端。
net.ipv4.ip_local_port_range 最先:1024 - 60999,最後:32768 - 65535] 最先:32768,最後:60999 TCP 和 UDP 流量用來選擇本機連接埠的本機連接埠範圍。 由兩個數字組成:第一個數字是代理程式節點上允許 TCP 和 UDP 流量的第一個本機連接埠,第二個則是最後一個本機連接埠號碼。
net.ipv4.neigh.default.gc_thresh1 128 - 80000 4096 可能在 ARP 快取中的項目數下限。 如果項目數低於此設定,則不會觸發記憶體回收。
net.ipv4.neigh.default.gc_thresh2 512 - 90000 8192 可能在 ARP 快取中的項目數非強制上限。 這可能是最重要的設定,因為 ARP 記憶體回收大約將會在達到此非強制上限之後的 5 秒觸發。
net.ipv4.neigh.default.gc_thresh3 1024 - 100000 16384 ARP 快取中項目數強制上限。
net.netfilter.nf_conntrack_max 131072 - 2097152 131072 nf_conntrack 是一個模組,可追蹤 Linux 內 NAT 的連線項目。 nf_conntrack 模組會使用雜湊表來記錄 TCP 通訊協定的「已建立連線」記錄。 nf_conntrack_max 是雜湊表中的節點數目上限,即 nf_conntrack 模組所支援的連線數目上限或連線追蹤資料表的大小。
net.netfilter.nf_conntrack_buckets 65536 - 524288 65536 nf_conntrack 是一個模組,可追蹤 Linux 內 NAT 的連線項目。 nf_conntrack 模組會使用雜湊表來記錄 TCP 通訊協定的「已建立連線」記錄。 nf_conntrack_buckets 是雜湊表的大小。

背景工作角色限制

如同檔案描述項限制,程序可建立的背景工作角色或執行緒數目受到核心設定和使用者限制的限制。 AKS 上的使用者限制無限制。

設定 允許的值/間隔 預設 描述
kernel.threads-max 20 - 513785 55601 程序可以啟動背景工作執行緒。 可建立的所有執行緒數目上限是使用核心設定 kernel.threads-max 所設定。

虛擬記憶體

下面的設定可以用來微調 Linux 核心的虛擬記憶體 (VM) 子系統的作業,以及將變更過的資料 writeout 至磁碟。

設定 允許的值/間隔 預設 描述
vm.max_map_count 65530 - 262144 65530 此檔案包含程序可能具有的記憶體對應區域數目上限。 記憶體對應區域用作由 mmapmprotectmadvise 直接呼叫 malloc 的副作用,同時也是載入共用程式庫時的副作用。
vm.vfs_cache_pressure 1 - 100 100 此百分比值可控制核心回收記憶體的傾向,而此記憶體用於快取目錄和 inode 物件。
vm.swappiness 0 - 100 60 此控制項用來定義核心將交換記憶體分頁的積極程度。 較高的值將會增加積極性,較低的值則減少交換量。 值 0 會指示核心不要在可用和檔案所支援分頁數量小於區域中的上限標記之前起始交換。
swapFileSizeMB 1 MB - 暫存磁碟 (/dev/sdb) 的大小 SwapFileSizeMB 指定將會在此節點集區的代理程式節點上建立交換檔案大小 (MB)。
transparentHugePageEnabled always、 、 madvisenever always 透明 Hugepage 是 Linux 核心功能,旨在藉由更有效率地使用處理器的記憶體對應硬體來改善效能。 啟用時,核心會盡可能嘗試配置 hugepages,如果 mmap 區域自然符合 2 MB,則任何 Linux 程序都會接收到 2 MB 分頁。 在某些情況下,全系統啟用 hugepages 時,應用程式最後可能會配置更多記憶體資源。 應用程式可能會 mmap 大型區域,但只觸控該區域的 1 個位元組,在此情況下,可能會配置 2 MB 分頁,而不是 4k 分頁。 此案例是為什麼可能全系統停用 hugepages 或只在 MADV_HUGEPAGE madvise 區域內擁有其的原因。
transparentHugePageDefrag always、、 deferdefer+madvisemadvisenever madvise 此值可控制核心是否應該積極使用記憶體壓縮,以提供更多可用的 hugepages

下一步