在本文中,你将预配生产就绪的 AKS 部署所需的核心 Azure 资源。 本文验证 Azure 访问权限、创建资源组、建立 Azure 容器注册表(ACR)、部署基线 AKS 群集、(可选)为用户工作负荷添加其他节点池,并授予群集从 ACR 拉取权限。 所有命令都依赖于参数化环境变量,以便工作流在区域和订阅之间保持可重复。
先决条件
在运行指南之前,需要具备以下工具和帐户访问权限。 确保已使用 Azure 进行身份验证 az login ,并具有创建资源组、容器注册表和 AKS 群集的足够权限。
- 具有所选区域的配额的 Azure 订阅
- 具有所有者或参与者权限的 Azure CLI (
az) - 已为集群访问在本地配置了 kubectl
- jq (可选)用于在验证期间分析 JSON 输出
运行以下命令以确认你拥有所有必要的 CLI 工具和 Azure 访问权限:
command -v az >/dev/null || echo "Azure CLI missing"
command -v kubectl >/dev/null || echo "kubectl missing"
command -v jq >/dev/null || echo "jq missing (optional)"
设置环境
在这里,定义预配步骤中使用的所有环境变量。 重复执行期间,时间戳可确保资源名称的唯一性。 集群和注册表的默认值以概念验证的最小化影响为目标,但你可以根据需要对其进行调整。
以下命令为预配序列建立 Azure 范围、AKS 大小调整和 ACR 命名约定,而不考虑下游工作负荷。
export HASH="${HASH:-$(date -u +"%y%m%d%H%M")}" # YYMMDDHHMM stamp
# Azure scope and regional placement
export LOCATION="${LOCATION:-chinanorth3}"
export SUBSCRIPTION_ID="${SUBSCRIPTION_ID:-$(az account show --query id -o tsv)}"
export RESOURCE_GROUP="${RESOURCE_GROUP:-rg_aks_${HASH}}"
# AKS cluster naming and version control
# Hyphen required because AKS cluster names cannot include underscores
export AKS_CLUSTER_NAME="${AKS_CLUSTER_NAME:-aks-openwebsearch-${HASH}}"
export AKS_VERSION="${AKS_VERSION:-}" # Optional Kubernetes version override
# Node pool sizing
export AKS_SYSTEM_NODE_COUNT="${AKS_SYSTEM_NODE_COUNT:-1}"
export AKS_USER_NODE_COUNT="${AKS_USER_NODE_COUNT:-1}"
export AKS_NODE_VM_SIZE="${AKS_NODE_VM_SIZE:-Standard_D4s_v5}"
export AKS_SYSTEM_NODEPOOL_NAME="${AKS_SYSTEM_NODEPOOL_NAME:-system}"
export AKS_USER_NODEPOOL_NAME="${AKS_USER_NODEPOOL_NAME:-user}"
# ACR configuration
export ACR_NAME="${ACR_NAME:-acrwebsearch${HASH}}"
export ACR_LOGIN_SERVER="${ACR_LOGIN_SERVER:-${ACR_NAME}.azurecr.cn}"
验证环境变量值
在创建资源之前查看有效配置。 在进行任何调整后重新运行该块,以确保目标订阅和区域的活动值正确无误。
使用以下命令固定活动参数以验证命名、大小调整和区域选择。
: "${HASH:=$(date -u +"%y%m%d%H%M")}" # Ensure HASH exists
VARS=(
HASH
LOCATION
SUBSCRIPTION_ID
RESOURCE_GROUP
AKS_CLUSTER_NAME
AKS_VERSION
AKS_SYSTEM_NODE_COUNT
AKS_USER_NODE_COUNT
AKS_NODE_VM_SIZE
AKS_SYSTEM_NODEPOOL_NAME
AKS_USER_NODEPOOL_NAME
ACR_NAME
ACR_LOGIN_SERVER
)
for v in "${VARS[@]}"; do
printf "%s=%s\n" "$v" "${!v}"
done
Steps
按顺序执行每个步骤。 每个子节都包含用途、命令和摘要,用于确认预期结果。
检查 Azure 订阅上下文
验证活动的 Azure 订阅,并确保已注册 AKS 和 ACR 操作所需的资源提供程序。
az account show --query id -o tsv
az provider register --namespace Microsoft.ContainerService
az provider register --namespace Microsoft.ContainerRegistry
创建资源组
提供一个专用资源组来隔离 AKS 群集、注册表及支持工作负载的基础设施。
az group create \
--name "${RESOURCE_GROUP}" \
--location "${LOCATION}" \
--output table
配置 Azure 容器注册表
创建用于存储容器映像的 Azure 容器注册表,并验证本地 Docker 守护程序以推送映像。
az acr create \
--name "${ACR_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--location "${LOCATION}" \
--sku Basic \
--output table
az acr login --name "${ACR_NAME}"
创建 AKS 群集
部署 AKS 群集以托管工作负荷。 在创建之前进行检查,防止重用现有群集名称。
if az aks show \
--name "${AKS_CLUSTER_NAME}" \
--resource-group "${RESOURCE_GROUP}" >/dev/null 2>&1; then
echo "AKS cluster ${AKS_CLUSTER_NAME} already exists in ${RESOURCE_GROUP}";
echo "Skip creation or provide a new AKS_CLUSTER_NAME.";
else
az aks create \
--name "${AKS_CLUSTER_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--location "${LOCATION}" \
--generate-ssh-keys \
--node-count "${AKS_SYSTEM_NODE_COUNT}" \
--nodepool-name "${AKS_SYSTEM_NODEPOOL_NAME}" \
--node-vm-size "${AKS_NODE_VM_SIZE}" \
${AKS_VERSION:+--kubernetes-version "${AKS_VERSION}"} \
--output table
fi
添加可选用户节点池
请求时预配其他节点池。 add 命令以异步方式运行,以避免 CLI 超时;等待命令跟踪 Azure 的进度。 该脚本首先检查池是否已存在,以防止出现重复名称错误。
if [ "${AKS_USER_NODE_COUNT}" -gt 0 ]; then
if az aks nodepool show \
--cluster-name "${AKS_CLUSTER_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--name "${AKS_USER_NODEPOOL_NAME}" >/dev/null 2>&1; then
echo "Node pool ${AKS_USER_NODEPOOL_NAME} already exists; skipping add.";
else
az aks nodepool add \
--cluster-name "${AKS_CLUSTER_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--name "${AKS_USER_NODEPOOL_NAME}" \
--node-count "${AKS_USER_NODE_COUNT}" \
--node-vm-size "${AKS_NODE_VM_SIZE}" \
--no-wait
az aks nodepool wait \
--cluster-name "${AKS_CLUSTER_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--name "${AKS_USER_NODEPOOL_NAME}" \
--created
fi
fi
检索群集凭据
将 AKS kubeconfig 合并到本地上下文中,并验证所有节点是否可访问。
az aks get-credentials \
--name "${AKS_CLUSTER_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--overwrite-existing
kubectl get nodes -o wide
将 ACR 附加到 AKS 集群
授予 AKS 群集从预配的 ACR 拉取映像的权限,以便将来的部署可以访问容器映像。
az aks update \
--name "${AKS_CLUSTER_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--attach-acr "${ACR_NAME}" \
--output table
验证
在继续执行下游部署步骤之前,请确认 AKS 群集是否存在并响应基本 kubectl 查询。 首先确保 AKS 群集存在。
if ! az aks show \
--name "${AKS_CLUSTER_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--query "{name:name,provisioningState:provisioningState,location:location}" \
--output table; then
echo "AKS cluster '${AKS_CLUSTER_NAME}' not found in resource group '${RESOURCE_GROUP}'."
else
echo "AKS cluster '${AKS_CLUSTER_NAME}' exists in resource group '${RESOURCE_GROUP}'."
fi
如果已创建 AKS 群集,你将看到如下内容:
AKS cluster ${AKS_CLUSTER_NAME} exists in resource group ${RESOURCE_GROUP}.
接下来,检查 kubectl 是否正确配置:
kubectl cluster-info
此命令将输出当前群集的状态,如下所示:
Kubernetes control plane is running at ...
CoreDNS is running at https://...
Metrics-server is running at https://...
最后,确保有系统和用户节点可用:
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.labels.agentpool}{"\n"}{end}' |
sort |
uniq -c
这将输出节点计数,如下所示:
1 system
1 user
摘要:验证 AKS 群集是否存在、正常且可通过当前上下文中的 kubectl 访问。
概要
将验证资源组、容器注册表、AKS 群集、可选节点池和注册表附件,使群集可供任何容器化工作负荷使用。
后续步骤
-
docs/OpenWebSearch_On_AKS.md继续部署 KMCP 和 MCP 服务器 - 配置特定于安全状态的角色指派或网络策略
- 集成 Azure Monitor 或 Log Analytics 以实现操作可见性
- 在试验后运行基础结构清理命令来管理成本