Important
AKS 預覽功能以自助方式提供,並採選擇加入制。 預覽版本係依「現狀」及「可用情況」提供,且不適用於服務等級協定與有限保固。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:
Flex 節點將 Azure Kubernetes Service (AKS) 叢集擴展到你管理於叢集 Azure 管理節點池之外的 Linux 機器。 在新增彈性節點之前,先決定主機如何向 Azure 進行認證、如何連接到 Kubernetes API 伺服器,以及網路流量如何在 AKS 與 flex node 環境間流動。
本文協助你做出這些決策、規劃不重疊的位址範圍,並為剩餘的部署文章建立共用環境檔案。
開始之前
- 檢視 flex 節點以了解 AKS 的整體狀況。
- 複習 彈性節點的身份與存取概念。
- 複習 彈性節點的網路概念。
- 使用具備所需工具與網路存取的 Linux 相容 Bash 環境。 這個部署系列稱該環境為 Bash 環境。 加入叢集的獨立機器是 flex node 主機。
- 安裝 Azure CLI。 執行
az --version以尋找安裝的版本。 若要安裝或升級,請參閱安裝 Azure CLI。 - 請用能讀取目標訂閱和虛擬網路設定的帳號登入 Azure。
- 為 Azure 管理的 AKS 節點準備一個現有的 Azure 虛擬網路和子網。 虛擬網路可以位於與 AKS 叢集不同的資源群組中。 當是時,請確保 AKS 叢集身份在子網路上擁有所需的權限。
做出部署決策
在建立或配置資源前,先規劃以下決策。
| 決策 | 選項 | 決策控制的是什麼 |
|---|---|---|
| 宿主身份 | 管理身份、Azure Arc 管理身份,或服務主體 | Flex Node agent 如何向 Azure 進行認證 |
| AKS API 存取 | 公有或私有 AKS 叢集 | 您的 Bash 環境與 Flex Node 主機如何解析並連線至 Kubernetes API 伺服器 |
| Flex 節點連接性 | 第三層連接或 Unbounded-Net WireGuard 閘道器 | AKS 管理的節點、彈性節點、Pod 與 Kubernetes 服務如何溝通 |
這些決策涵蓋部署的不同環節。 例如,選擇公共 AKS API 端點並不會在 AKS 管理的節點與彈性節點主機之間建立網路連線。
選擇主機身份
在彈性節點的身份與存取概念中,使用決策表來選擇該 Flex 節點代理所使用的 Azure 身份。
主機身份授權 Azure 操作。 它不會取代主機加入叢集所需的網路連線或 Kubernetes 啟動配置。 不要把憑證儲存在共享環境檔案裡。
選擇公開或私有 AKS API 存取權限
Kubernetes API 伺服器是叢集的管理端點。 你的 Bash 環境和每個 flex node 主機都必須能夠解析並連接到這個端點。
- 公共 AKS API 存取 使用安全的公開端點。 Kubernetes 的認證與授權仍然控制著對叢集的存取。 公開 API 端點不會暴露叢集中執行的應用程式。
-
私有 AKS API 存取 使用了 AKS 虛擬網路中的私有端點。 在你的 Bash 環境中執行 Azure CLI
kubectl和叢集設定指令,這些指令必須在連接到該私有網路的機器上執行。 彈性節點網路也必須能夠解析叢集的私有 DNS 名稱,並將流量路由至私有端點。
Flex 節點部署支援對 API 伺服器的公開與私有存取。 私有路徑需要額外的 DNS、路由及指令執行設定,並在適用處標示。 一般 AKS 指引請參見 「規劃 AKS 控制平面網路」、「 建立私有 AKS 叢集,以及 連接至私人 AKS 叢集」。
選擇彈性節點連接性
此部署系列建立 AKS 叢集,無需內建網路外掛,並在 AKS 管理的節點與彈性節點上安裝 Unbounded-Net。 Unbounded-Net 負責分配 pod 位址範圍,並配置 AKS 與 flex node 環境之間的路由。 本文描述了這個工作流程。 其他 CNI 或網路配置可能需要不同的路由、防火牆、DNS、閘道器、安全性及生命週期設定。 關於公開預覽網路模型的說明,請參見 彈性節點的網路概念。
你負責提供 AKS 與 flex node 環境之間的底層網路連線。 第三層連接意味著兩個節點網路已經能將 IP 封包雙向路由到彼此的節點位址。 選擇最適合你現有網絡的方法:
| 連線方法 | 何時使用它 |
|---|---|
| 虛擬網路對等互連 | AKS 叢集和彈性節點主機都位於 Azure 虛擬網路中,包括不同區域的虛擬網路。 |
| VPN 閘道 | Flex Node 主機位於本地環境或其他透過加密站對站 VPN 連接 Azure 的網路中。 |
| ExpressRoute | 你的組織在網路與 Azure 之間使用專用的私人連線。 |
| Unbounded-Net WireGuard 閘道器 | AKS 和 Flex Node 網路沒有私有路由連線。 你要在 AKS 閘道節點池上配置並操作 WireGuard 隧道,這些閘道節點必須是公開存取的。 規劃閘道容量與可用性,因為跨環境的 Pod 流量依賴此池。 請參閱搭配 Unbounded-Net WireGuard 實驗室的公開 AKS 叢集。 |
Microsoft Learn 的攻略使用了 Unbounded-Net 的第三層連接。
| AKS API | Flex 節點連接性 | 指引 |
|---|---|---|
| Public | 第 3 層連線 | 建議組態 |
| 私人 | 第 3 層連線 | 需要額外的 DNS、路由及指令執行設定 |
| Public | 公開 WireGuard 閘道 | 替代拓撲;詳見 AKSFlexNode 實驗室 |
| 私人 | 公開 WireGuard 閘道 | 本文件未涵蓋 |
Note
更多拓撲範例請參見 AKSFlexNode 實驗室,包括使用公共 AKS API 伺服器搭配 WireGuard 閘道器,以及私有 AKS API 伺服器搭配客戶管理網路的範例。 這些實驗室補充了本文所描述的配置。 這些實驗室可能使用不同的網路元件,並承擔不同的營運或支援責任。 使用實驗室前,請先檢視其需求、限制、適用的元件版本及客戶責任。 GitHub 實驗室並不會擴展 Microsoft Learn 所描述的支援範圍。
若要對未被代表的拓撲提供回饋,請 在 AKSFlexNode 儲存庫中開啟一個問題。 包含彈性節點主機位置、AKS API 存取模型、建議的連接方式、建議的 CNI 以及情境所需的網路路徑。
規劃所需的網路連接
請與您的網路管理員合作,確保網路設計提供以下連結功能:
| 需求 | 為什麼必須這麼做 |
|---|---|
| 你的 Bash 環境可以解析並連接到 AKS API 伺服器。 | 你需要這個連線來配置和管理叢集。 |
| 每個 flex node 主機都可以解析並連接到 AKS API 伺服器。 | flex node agent 和 kubelet 會利用這段連線加入叢集並與 Kubernetes 控制平面溝通。 |
| 由 AKS 管理的節點與彈性節點主機可連線到彼此的私有 IP 位址。 | 對於大多數連接方法,Unbounded-Net 使用節點網路作為兩個環境之間的底層路徑。 |
| Pod 與 Kubernetes 服務流量可在 AKS 管理節點與彈性節點間路由。 | 工作負載需要跨節點通訊、叢集 DNS 以及 Kubernetes 服務存取。 |
| AKS 控制平面可連線到 Flex 節點上的 kubelet。 | AKS 使用此路徑進行 kubelet 運算,包括 kubectl logs、 kubectl exec、 kubectl port-forward和 。 |
你要配置並操作外部主機網路,包括路由、虛擬網路對等、VPN 或 ExpressRoute 連線、防火牆與網路安全群組規則、DNS、代理設定,以及本系列中描述的 Unbounded-Net 設定。 關於全責任模式,請參閱 彈性節點的支援政策。
限制主機管理存取權限,僅限於核准的來源位址。 對於 Azure 虛擬機,請將網路安全群組與主機子網或網路介面關聯。 對於 Azure 以外的主機,請套用等效的防火牆控制措施。 如果你用 az vm create 來建立彈性節點主機,請檢視該指令所建立的任何公共 IP 位址和網路安全群組規則。 除非你限制 SSH 規則,否則它可以允許從任何公開來源連接到 TCP 埠 22。
收集部署設定值
其餘條目重複使用以下數值。
常見 Azure 資源值
| Variable | Description | 當它被使用時 |
|---|---|---|
SUBSCRIPTION_ID |
包含 AKS 叢集及相關 Azure 資源的訂閱。 | 每次部署 |
RESOURCE_GROUP |
包含 AKS 叢集的資源群組。 | 每次部署 |
CLUSTER_NAME |
AKS 叢集的名稱。 | 每次部署 |
FLEX_POOL_NAME |
彈性節點集區的名稱。 請只使用字母和數字。 | 每次部署 |
AKS_API_ACCESS |
AKS 叢集的 API 存取模型。 將值設為 public 或 private。 |
叢集準備與 API 連接驗證 |
AKS_RESOURCE_ID |
AKS 叢集的 Azure 資源識別碼。 Azure 在叢集存在後才提供這個數值。 | 後續文章 |
AKS 叢集與虛擬網路值
| Variable | Description | 當它被使用時 |
|---|---|---|
LOCATION |
AKS 叢集的 Azure 區域。 確認該區域符合 區域可用性 需求。 | 建立 AKS 叢集 |
AKS_VNET_NAME |
包含 AKS 子網的虛擬網路名稱。 | 尋找與驗證 AKS 子網路 |
AKS_VNET_RESOURCE_GROUP |
包含 AKS 虛擬網路的資源群組。 它可以與 RESOURCE_GROUP不同。 |
尋找與驗證 AKS 子網路 |
AKS_SUBNET_NAME |
Azure 管理的 AKS 節點所使用的子網路名稱。 | 尋找與驗證 AKS 子網路 |
AKS_SUBNET_ID |
AKS 子網路的 Azure 資源識別碼。 | 建立 AKS 叢集 |
AKS_NODE_VM_SIZE |
Azure 管理的 AKS 系統節點集區的 Azure VM 大小。 此值不會決定 Flex 節點主機的大小。 | 建立 AKS 叢集 |
SERVICE_CIDR |
Kubernetes 服務的位址範圍。 | 設定 AKS 叢集網路設定檔 |
DNS_SERVICE_IP |
Kubernetes DNS 服務的 IP 位址。 | 設定 AKS 叢集網路設定檔 |
在建立環境檔案前,先取得 AKS 子網路資源 ID 與位址範圍:
az network vnet subnet show \
--resource-group '<virtual-network-resource-group>' \
--vnet-name '<virtual-network-name>' \
--name '<aks-subnet-name>' \
--query "{ResourceId:id,AddressPrefix:addressPrefix,AddressPrefixes:addressPrefixes}" \
--output json
AKS 與 Unbounded-Net 位址值
你使用 SERVICE_CIDR 並 DNS_SERVICE_IP 設定 AKS 叢集網路設定檔。 請設定節點與 pod CIDR,以設定本攻略所使用的 Unbounded-Net 站點。
AKS 節點、AKS Pod、flex 節點、flex pod 及 Kubernetes 服務範圍必須遵循所選的網路設計,且不得彼此重疊,或與任何可透過虛擬網路對等、VPN 或 ExpressRoute 連接的網路重疊。 與你的網路管理員協調最終數值。
不要從其他部署複製範例 CIDR。 CIDR 會識別可路由的位址空間,因此重複使用與 Azure 或連接網路重疊的範例,可能會使流量變得模糊,或阻礙節點與 Pod 彼此聯繫。
| Variable | Description | 使用對象 |
|---|---|---|
AKS_SUBNET_CIDR |
Azure 管理的 AKS 節點子網所分配的位址範圍。 | Azure 虛擬網路與 AKS 子網路驗證 |
AKS_NODE_CIDR |
包含 AKS 節點子網路的 Unbounded-Net 站台節點範圍。 | Unbounded-Net 主要叢集地點 |
AKS_POD_CIDR |
Azure 管理的 AKS 節點上 Pod 的位址集區。 | Unbounded-Net 主要叢集地點 |
FLEX_HOST_SUBNET_CIDR |
包含彈性節點主機的位址範圍。 | 彈性節點主機網路驗證 |
FLEX_NODE_CIDR |
包含彈性節點主機子網的 Unbounded-Net 站點節點範圍。 | Unbounded-Net 彈性節點網站 |
FLEX_POD_CIDR |
彈性節點上 Pod 的位址集區。 | Unbounded-Net 彈性節點網站 |
SERVICE_CIDR |
Kubernetes 服務的位址範圍。 | AKS 叢集網路設定檔 |
DNS_SERVICE_IP |
Kubernetes DNS 服務的 IP 位址。 | AKS 叢集網路設定檔 |
請將以下規則套用於地址計畫:
-
AKS_SUBNET_CIDR必須包含在AKS_NODE_CIDR。 -
FLEX_HOST_SUBNET_CIDR必須包含在FLEX_NODE_CIDR。 -
DNS_SERVICE_IP必須位於SERVICE_CIDR內部。
這八個數值並不是八個獨立的範圍。 其中五個是獨立範圍,且不得重疊;兩個是包含在其對應站點節點範圍內的子網路範圍;一個是服務範圍內的單一 IP 位址。
以下數值符合本節所有規則。 請將它們視為這些關係的示意,而不是預設值。 使用前,請先將您自己的值與 Azure 和已連線網路的位址空間進行比對。
| Variable | 範例 | Relationship |
|---|---|---|
AKS_NODE_CIDR |
10.10.0.0/16 |
獨立分布 |
AKS_SUBNET_CIDR |
10.10.1.0/24 |
包含在 AKS_NODE_CIDR 中 |
AKS_POD_CIDR |
10.244.0.0/16 |
獨立分布 |
FLEX_NODE_CIDR |
10.20.0.0/16 |
獨立分布 |
FLEX_HOST_SUBNET_CIDR |
10.20.1.0/24 |
包含在 FLEX_NODE_CIDR 中 |
FLEX_POD_CIDR |
10.245.0.0/16 |
獨立分布 |
SERVICE_CIDR |
10.96.0.0/16 |
獨立分布 |
DNS_SERVICE_IP |
10.96.0.10 |
內部 SERVICE_CIDR |
檢視目前的 Azure 虛擬網路位址空間:
az network vnet list \
--query "[].{ResourceGroup:resourceGroup,Name:name,AddressPrefixes:addressSpace.addressPrefixes}" \
--output table
Azure 可以辨識其管理資源內的衝突,但無法驗證每個連接的本地或外部網路的位址範圍。
元件版本值
Flex 節點需要相容版本的 AKS、Azure CLI 擴充套件、Unbounded-Net 以及 flex node agent。 請使用本文列出的版本,且不要獨立選擇或升級這些元件。
| Variable | Description |
|---|---|
AKS_VERSION |
支援 AKS 叢集的 Kubernetes 版本。 |
AKS_PREVIEW_VERSION |
aks-preview Azure CLI 擴充功能版本 22.0.0b8 或更新版本。 |
UNBOUNDED_VERSION |
支援 Unbounded-Net 版本。 |
AKS_FLEX_NODE_VERSION |
支援 Flex Node 代理版本。 |
區域可用性
Flex 節點在裝載您叢集的區域中需要 AKS 版本v20260904或後續版本。 AKS 會自動套用這些依日期的發行版本,而且它們與你在 AKS_VERSION 中設定的 Kubernetes 版本是分開的。
在建立或選擇叢集之前,先打開 AKS 發佈追蹤器的AKS 版本標籤,找到你的區域,並在「目前運作中」中檢查版本。 AKS 發行版本採用此 vYYYYMMDD 格式。 如果你的區域顯示的是較早版本,請等待該版本正式發布,或者如果你的部署需求允許,選擇有該版本可用的區域。
本地工作空間值
| Variable | Description |
|---|---|
WORK_DIR |
您 Bash 環境中的目錄,其餘文章會在此儲存下載項目、產生的檔案,以及叢集 kubeconfig 檔案。 預設值為 ~/.local/share/aksflexnode/<deployment-name>。 要將這些檔案存放在其他地方,例如部署後移除的暫存目錄,請更改 WORK_DIR 環境檔案中的值。 |
建立共享環境檔案
為每個部署建立一個環境檔案。 該檔案可讓非機密值在其餘文章與終端機工作階段之間保持一致。
不要在這個檔案中儲存存取權杖、啟動資料、kubeconfig 內容、服務主體憑證、憑證、憑證私鑰或 SSH 私鑰。
選擇一個簡短部署標籤,並為環境檔案建立受保護目錄。
export FLEXNODE_DEPLOYMENT="flexnode-demo" export FLEXNODE_ENV_DIR="${HOME}/.config/aks-flexnode" export FLEXNODE_ENV_FILE="${FLEXNODE_ENV_DIR}/${FLEXNODE_DEPLOYMENT}.env" install -d -m 0700 "${FLEXNODE_ENV_DIR}"建立環境檔案。
if [[ -e "${FLEXNODE_ENV_FILE}" ]]; then printf 'Environment file already exists: %s\n' "${FLEXNODE_ENV_FILE}" >&2 false else install -m 0600 /dev/null "${FLEXNODE_ENV_FILE}" cat > "${FLEXNODE_ENV_FILE}" <<'EOF' set_flexnode_env() { if [[ "$#" -ne 2 || ! "$1" =~ ^[A-Za-z_][A-Za-z0-9_]*$ ]]; then printf 'Usage: set_flexnode_env NAME VALUE\n' >&2 return 2 fi local name="$1" local value="$2" local temporary_file temporary_file="$(mktemp "$(dirname "${FLEXNODE_ENV_FILE}")/flexnode.env.XXXXXX")" || return 1 awk -v prefix="export ${name}=" 'index($0, prefix) != 1 { print }' \ "${FLEXNODE_ENV_FILE}" > "${temporary_file}" || { rm -f "${temporary_file}" return 1 } printf 'export %s=%q\n' "${name}" "${value}" >> "${temporary_file}" || { rm -f "${temporary_file}" return 1 } install -m 0600 "${temporary_file}" "${FLEXNODE_ENV_FILE}" || { rm -f "${temporary_file}" return 1 } rm -f "${temporary_file}" export "${name}=${value}" } # Customer inputs export SUBSCRIPTION_ID='<subscription-id>' export LOCATION='<supported-aks-region>' export RESOURCE_GROUP='<aks-resource-group>' export CLUSTER_NAME='<aks-cluster-name>' export FLEX_POOL_NAME='<flex-node-pool-name>' export AKS_API_ACCESS='<public-or-private>' # AKS virtual network export AKS_VNET_NAME='<virtual-network-name>' export AKS_VNET_RESOURCE_GROUP='<virtual-network-resource-group>' export AKS_SUBNET_NAME='<aks-subnet-name>' export AKS_SUBNET_ID='<aks-subnet-resource-id>' # Network address ranges export AKS_SUBNET_CIDR='<aks-node-subnet-cidr>' export AKS_POD_CIDR='<aks-pod-cidr>' export AKS_NODE_CIDR='<aks-site-node-cidr>' export FLEX_HOST_SUBNET_CIDR='<flex-host-subnet-cidr>' export FLEX_NODE_CIDR='<flex-site-node-cidr>' export FLEX_POD_CIDR='<flex-node-pod-cidr>' export SERVICE_CIDR='<kubernetes-service-cidr>' export DNS_SERVICE_IP='<kubernetes-dns-service-ip>' # Azure-managed AKS system node pool export AKS_NODE_VM_SIZE='<supported-and-available-aks-node-vm-size>' # Compatible component versions for flex nodes (preview) export AKS_VERSION='1.36.2' export AKS_PREVIEW_VERSION='22.0.0b8' export UNBOUNDED_VERSION='v0.8.0' export AKS_FLEX_NODE_VERSION='v0.2.0' # Local paths export WORK_DIR="${HOME}/.local/share/aksflexnode/${FLEXNODE_DEPLOYMENT}" # Values recorded by later articles export AKS_RESOURCE_ID='' export FLEXNODE_KUBECONFIG='' export FLEX_POOL_RESOURCE_ID='' export FLEX_MACHINE_NAME='' export FLEX_HOST_NAME='' export FLEX_HOST_SSH_TARGET='' export FLEX_HOST_PRIVATE_IP='' export HOST_PRINCIPAL_OBJECT_ID='' export HOST_IDENTITY_CLIENT_ID='' export SSH_PUBLIC_KEY_PATH='' export SSH_PRIVATE_KEY_PATH='' export VM_RESOURCE_GROUP='' export VM_NAME='' export VM_RESOURCE_ID='' export ARC_RESOURCE_GROUP='' export ARC_MACHINE_NAME='' export ARC_RESOURCE_ID='' export SP_TENANT_ID='' export SP_CLIENT_ID='' export SP_OBJECT_ID='' EOF fiset_flexnode_env這個輔助工具讓後續文章能記錄 Azure 產生的數值,而不會在檔案中加入重複定義。在編輯器中打開
${FLEXNODE_ENV_FILE},並替換以角括號包圍的每個值。 將 後續文章所記錄的值 下方的值留空。檢查確認未留下任何佔位符。
if grep -n '<[^>]*>' "${FLEXNODE_ENV_FILE}"; then printf 'Replace the unresolved placeholders before you continue.\n' >&2 false else printf 'No unresolved placeholders found.\n' fi載入環境檔案,建立工作目錄,並設定活躍的 Azure 訂閱。
source "${FLEXNODE_ENV_FILE}" install -d -m 0700 "${WORK_DIR:?Load the deployment environment first.}" az account set --subscription "${SUBSCRIPTION_ID}" az account show \ --query "{Name:name,SubscriptionId:id}" \ --output table確認退回的訂閱 ID 是否符合
SUBSCRIPTION_ID。確認
AKS_API_ACCESS識別的是受支援的路徑:case "${AKS_API_ACCESS}" in public|private) printf 'AKS API access: %s\n' "${AKS_API_ACCESS}" ;; *) printf 'Set AKS_API_ACCESS to public or private.\n' >&2 false ;; esac啟動每個新的終端機會話時,請先設定部署標籤並載入其環境檔案:
export FLEXNODE_DEPLOYMENT="flexnode-demo" export FLEXNODE_ENV_FILE="${HOME}/.config/aks-flexnode/${FLEXNODE_DEPLOYMENT}.env" test -s "${FLEXNODE_ENV_FILE}" source "${FLEXNODE_ENV_FILE}" install -d -m 0700 "${WORK_DIR:?Load the deployment environment first.}"
驗證規劃價值
確認所選的 AKS 子網路。
az network vnet subnet show \
--resource-group "${AKS_VNET_RESOURCE_GROUP}" \
--vnet-name "${AKS_VNET_NAME}" \
--name "${AKS_SUBNET_NAME}" \
--query "{AddressPrefix:addressPrefix,AddressPrefixes:addressPrefixes,ResourceId:id}" \
--output json
確認回傳的資源 ID 與位址範圍是否相符 AKS_SUBNET_ID 且 AKS_SUBNET_CIDR。
後續步驟
接著, 準備一個 AKS 叢集來支援彈性節點。 下一篇文章會建立公開或私有的 AKS 叢集,並記錄叢集資源 ID。