你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。

规划 AKS 灵活节点(预览版)

Important

AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

弹性节点可将 Azure Kubernetes 服务 (AKS) 群集扩展到由你管理、且不属于该群集 Azure 托管节点池的 Linux 计算机。 在添加弹性节点之前,请选择主机如何向Azure进行身份验证、如何到达 Kubernetes API 服务器,以及网络流量在 AKS 和弹性节点环境之间移动的方式。

本文可帮助你做出这些决策、规划不重叠的地址范围,并为剩余的部署文章创建共享环境文件。

在您开始之前

  • 查看AKS 弹性节点概述。
  • 查看 弹性节点的标识和访问概念。
  • 查看 弹性节点的网络概念。
  • 使用具有所需工具和网络访问权限的 Linux 兼容 Bash 环境。 本部署系列将该环境称为你的 Bash 环境。 加入群集的独立计算机是 弹性节点主机。
  • 安装 Azure CLI。 运行 az --version 查找已安装的版本。 若要安装或升级,请参阅安装 Azure CLI。
  • 使用可读取目标订阅和虚拟网络配置的帐户登录到Azure。
  • 为Azure托管的 AKS 节点准备现有的Azure虚拟网络和子网。 虚拟网络可以位于 AKS 群集的不同资源组中。 如果是,请确保 AKS 群集标识对子网具有所需的权限。

做出部署决策

在创建或配置资源之前,请规划以下决策。

决定 选项 该决定控制的内容
主机标识 托管标识、Azure Arc 托管标识或服务主体 弹性节点代理如何向Azure进行身份验证
AKS API 访问 公共或专用 AKS 群集 Bash 环境和灵活节点主机如何解析并到达 Kubernetes API 服务器
Flex 节点连接性 第 3 层连接或 Unbounded-Net WireGuard 网关 AKS 托管节点、弹性节点、Pod 和 Kubernetes 服务之间如何通信

这些决策解决了部署的不同部分。 例如,选择公共 AKS API 终结点不会在 AKS 托管节点和弹性节点主机之间创建网络连接。

选择主机标识

使用弹性节点的标识和访问概念中的决策表来选择弹性节点代理使用的 Azure 标识。

主机标识授权Azure操作。 它不能替代主机加入集群所需的网络连通性或 Kubernetes 引导配置。 不要将凭据存储在共享环境文件中。

选择公共或专用 AKS API 访问

Kubernetes API 服务器是群集的管理终结点。 Bash 环境和每个弹性节点主机必须能够解析并连接到此终结点。

  • 公共 AKS API 访问 使用受保护的公共终结点。 Kubernetes 身份验证和授权仍控制对群集的访问。 公共 API 终结点不会公开群集中运行的应用程序。
  • 专用 AKS API 访问 使用 AKS 虚拟网络中的专用终结点。 在 Bash 环境中运行Azure CLIkubectl和群集安装命令,该命令必须在连接到该专用网络的计算机上运行。 弹性节点网络还必须能够解析群集的专用 DNS 名称,并将流量路由到专用终结点。

弹性节点部署支持对 API 服务器的公用和专用访问。 专用路径需要额外的 DNS、路由和命令执行配置,适用之处会另行说明。 有关常规 AKS 指南,请参阅 AKS 的计划控制平面网络、 创建专用 AKS 群集和 连接到专用 AKS 群集。

选择弹性节点连接

此部署系列创建没有内置网络插件的 AKS 群集,并在 AKS 托管节点和弹性节点上安装 Unbounded-Net。 Unbounded-Net 分配 Pod 地址范围,并在 AKS 和弹性节点环境之间配置路由。 本文介绍该工作流。 其他 CNI 或网络配置可能需要不同的路由、防火墙、DNS、网关、安全性和生命周期配置。 有关公共预览版网络模型的说明,请参阅 弹性节点的网络概念。

您提供 AKS 与弹性节点环境之间的底层网络连接。 第 3 层连接意味着两个节点网络都可以双向将 IP 数据包路由到彼此的节点地址。 选择适合现有网络的方法:

连接方法 何时使用它
虚拟网络对等互连 AKS 群集和弹性节点主机位于Azure虚拟网络中,包括不同区域中的虚拟网络。
VPN 网关 弹性节点主机位于本地部署环境中,或位于通过加密的站点到站点 VPN 与 Azure 连接的其他网络中。
ExpressRoute 你的组织在其网络和Azure之间使用专用连接。
Unbounded-Net WireGuard 网关 AKS 和弹性节点网络没有专用路由连接。 在 AKS 网关节点池上配置和操作 WireGuard 隧道,并且必须公开访问这些网关节点。 请规划好网关容量和可用性,因为跨环境 Pod 流量依赖该池。 请参阅 具有 Unbounded-Net WireGuard 实验室的公共 AKS 群集。

Microsoft Learn 演练使用与 Unbounded-Net 之间的第 3 层连接。

AKS API Flex 节点连接性 Guidance
Public 第 3 层连接 建议配置
专用 第 3 层连接 需要其他 DNS、路由和命令执行配置
Public Public WireGuard 网关 替代拓扑;请参阅 AKSFlexNode 实验室
专用 Public WireGuard 网关 本文档未涵盖此内容

注释

有关其他拓扑示例,请参阅 AKSFlexNode 实验室,包括使用具有 WireGuard 网关的公共 AKS API 服务器和具有客户管理的网络的专用 AKS API 服务器的示例。 这些实验室补充了本文中所述的配置。 这些实验室可能使用不同的网络组件,并承担不同的操作或支持责任。 在使用实验室之前,请查看其先决条件、限制、适用的组件版本和客户责任。 GitHub实验室不会扩展 Microsoft Learn 中所述的支持范围。

若要提供有关未表示的拓扑的反馈, 请在 AKSFlexNode 存储库中提出问题。 包括弹性节点主机位置、AKS API 访问模型、建议的连接方法、建议的 CNI 和方案所需的网络路径。

规划所需的网络连接

请与网络管理员协作,确保网络设计提供以下连接:

要求 为什么需要它
Bash 环境可以解析并访问 AKS API 服务器。 需要此连接才能配置和管理群集。
每个弹性节点主机都可以解析并访问 AKS API 服务器。 弹性节点代理和 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 VM,将网络安全组与主机子网或网络接口相关联。 对于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 Azure AKS 群集的资源 ID。 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 资源 ID。 创建 AKS 群集
AKS_NODE_VM_SIZE Azure 托管的 AKS 系统节点池的 Azure 虚拟机大小。 此值不调整灵活节点主机的大小。 创建 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、弹性节点、弹性 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可以识别其管理的资源中的冲突,但无法验证每个连接的本地或外部网络中的地址范围。

组件版本值

弹性节点需要兼容版本的 AKS、Azure CLI 扩展、Unbounded-Net 和弹性节点代理。 使用本文中列出的版本,不单独选择或升级这些组件。

Variable Description
AKS_VERSION AKS 集群支持的 Kubernetes 版本。
AKS_PREVIEW_VERSION aks-previewAzure CLI扩展版本22.0.0b8或更高版本。
UNBOUNDED_VERSION 支持 Unbounded-Net 版本。
AKS_FLEX_NODE_VERSION 支持的 Flex 节点代理版本。

区域可用性

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 私钥。

  1. 选择一个简短的部署标签,并为环境文件创建受保护的目录。

    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}"
    
  2. 创建环境文件。

    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
    fi
    

    set_flexnode_env 辅助程序允许后续文章记录 Azure 生成的值,而无需向文件添加重复的定义。

  3. 在编辑器中打开 ${FLEXNODE_ENV_FILE} ,并替换用尖括号括住的每个值。 将 后续文章记录的值 留空。

  4. 检查确认未保留任何占位符。

    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
    
  5. 加载环境文件,创建工作目录,并设置活动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。