本指南逐步讲解在 AKS 上运行 Valkey 群集的完整设置过程。 此过程包括配置环境变量、预配核心 Azure 资源(例如资源组、Azure Key Vault 和 Azure 容器注册表 (ACR),创建具有集成工作负荷标识和管理机密的 AKS 群集。 它还介绍了如何为 Valkey 工作负荷创建专用节点池,以及如何将 Valkey 映像导入专用注册表。 如果你更喜欢基础结构即代码,本指南包含将 Terraform 与 Azure 验证模块配合使用的替代部署路径,确保最佳做法和生产准备情况。
若要使用 Terraform 部署基础结构,请使用适用于 AKS 的 Azure 验证模块。
注释
如果计划在生产环境中运行此部署,建议查看 适用于 Azure 验证模块的 AKS 生产模式模块。 此模块附带了最佳做法建议。
先决条件
- 如果尚未部署,请查看 概述,了解如何在 Azure Kubernetes 服务(AKS)上部署 Valkey 群集。
- Azure 订阅。 如果没有试用版,请创建 一个试用版。
- Azure CLI 版本 2.61.0。 若要安装或升级,请参阅 安装 Azure CLI。
- Helm 3 或更高版本。 若要安装,请参阅 安装 Helm。
- 已在本地计算机上安装 Docker。 若要安装,请参阅 “获取 Docker”。
设置环境变量
设置本指南中需要使用的环境变量:
random=$(echo $RANDOM | tr '[0-9]' '[a-z]') export MY_RESOURCE_GROUP_NAME=myResourceGroup-rg-$(echo $random) export MY_LOCATION=chinanorth3 export MY_ACR_REGISTRY=mydns$(echo $random) export MY_KEYVAULT_NAME=vault-$(echo $random)-kv export MY_CLUSTER_NAME=cluster-aks
创建资源组
使用
az group create命令创建资源组。az group create --name $MY_RESOURCE_GROUP_NAME --location $MY_LOCATION --output table示例输出:
Location Name ---------- ------------------ chinanorth3 myResourceGroup-rg
创建 Azure Key Vault 实例
使用
az keyvault create命令创建 Azure Key Vault 实例。 Azure Key Vault 安全地存储和访问 API 密钥、密码、证书或加密密钥等机密。az keyvault create --name $MY_KEYVAULT_NAME --resource-group $MY_RESOURCE_GROUP_NAME --location $MY_LOCATION --enable-rbac-authorization false --output table示例输出:
Location Name ResourceGroup ---------- -------------- ------------------ chinanorth3 vault-bbbhe-kv myResourceGroup-rg
创建 Azure 容器注册表
使用
az acr create命令创建 Azure 容器注册表来存储和管理容器映像。az acr create \ --name ${MY_ACR_REGISTRY} \ --resource-group $MY_RESOURCE_GROUP_NAME \ --sku Premium \ --location $MY_LOCATION \ --admin-enabled true \ --output table export MY_ACR_REGISTRY_ID=$(az acr show --name $MY_ACR_REGISTRY --resource-group $MY_RESOURCE_GROUP_NAME --query id --output tsv)示例输出:
NAME RESOURCE GROUP LOCATION SKU LOGIN SERVER CREATION DATE ADMIN ENABLED -------------------- ------------------ ---------- ------- ------------------------------- -------------------- --------------- mydnsrandomnamebbbhe myResourceGroup-rg chinanorth3 Premium mydnsrandomnamebbbhe.azurecr.cn 2024-06-11T09:36:43Z True
创建 AKS 群集
在此步骤中,我们创建 AKS 群集。 我们启用 Azure Key Vault 机密提供程序加载项 (azure-keyvault-secrets-provider),允许 AKS 群集访问 Azure Key Vault 中存储的机密。 我们还启用 工作负荷标识,使 AKS 群集能够安全地访问其他 Azure 资源。
使用
az aks create命令创建 AKS 群集。az aks create \ --location $MY_LOCATION \ --name $MY_CLUSTER_NAME \ --tier standard \ --resource-group $MY_RESOURCE_GROUP_NAME \ --network-plugin azure \ --node-vm-size Standard_D4_v3 \ --node-count 3 \ --auto-upgrade-channel stable \ --node-os-upgrade-channel NodeImage \ --attach-acr ${MY_ACR_REGISTRY} \ --enable-oidc-issuer \ --enable-workload-identity \ --enable-addons azure-keyvault-secrets-provider \ --zones 1 2 3 \ --generate-ssh-keys \ --output table示例输出:
Kind KubernetesVersion Location MaxAgentPools Name NodeResourceGroup ProvisioningState ResourceGroup ResourceUid SupportPlan ----------------------------------------------------------------------- -------------------------- ---------------------- ---------------------------------- ------------------------------------ ------------------------- ------------ ---------------------------------------------------------------- ------ ------------------- ---------- --------------- ----------- ---------------------------------------- ------------------- ------------------ ------------------------ ------------------ cluster-ak-myresourcegroup--9b70ac-hhrizake.portal.hcp.chinanorth3.cx.prod.service.azk8s.cn 1.28.9 False cluster-ak-myResourceGroup--9b70ac a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1 False True cluster-ak-myresourcegroup--9b70ac-hhrizake.hcp.chinanorth3.cx.prod.service.azk8s.cn Base 1.28 chinanorth3 100 cluster-aks MC_myResourceGroup-rg_cluster-aks_chinanorth3 Succeeded myResourceGroup-rg 66681ad812cd770001814d32 KubernetesOfficial
获取 Azure Key Vault 机密提供程序的标识 ID 和对象 ID
使用
az aks show命令获取 Azure Key Vault 机密提供程序加载项创建的标识 ID 和对象 ID。export userAssignedIdentityID=$(az aks show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --query addonProfiles.azureKeyvaultSecretsProvider.identity.clientId --output tsv) export userAssignedObjectID=$(az aks show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --query addonProfiles.azureKeyvaultSecretsProvider.identity.objectId --output tsv)
将 AcrPull 角色分配给 kubelet 标识
使用
AcrPull命令将az role assignment create角色分配给 kubelet 身份。export KUBELET_IDENTITY=$(az aks show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --output tsv --query identityProfile.kubeletidentity.objectId) az role assignment create \ --assignee ${KUBELET_IDENTITY} \ --role "AcrPull" \ --scope ${MY_ACR_REGISTRY_ID} \ --output table示例输出:
CreatedBy CreatedOn Name PrincipalId PrincipalName PrincipalType ResourceGroup RoleDefinitionId RoleDefinitionName Scope UpdatedBy UpdatedOn ------------------------------------ -------------------------------- ------------------------------------ ------------------------------------ ------------------------------------ ---------------- ------------------ ------------------------------------------------------------------------------------------------------------------------------------------ -------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------ -------------------------------- bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f 2024-06-11T09:41:36.631310+00:00 00aa00aa-bb11-cc22-dd33-44ee44ee44ee aaaaaaaa-bbbb-cccc-1111-222222222222 bbbbbbbb-cccc-dddd-2222-333333333333 ServicePrincipal myResourceGroup-rg /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/roleDefinitions/aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb AcrPull /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup-rg/providers/Microsoft.ContainerRegistry/registries/mydnsrandomnamebbbhe bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f 2024-06-11T09:41:36.631310+00:00
为 Valkey 工作负载创建节点池
在本部分中,我们将创建一个专用于运行 Valkey 工作负载的节点池。 此节点池已禁用自动扩展,并由跨两个可用区域的六个节点组成,因为我们希望在不同区域中的每个主区域拥有一个辅助节点。 副本被安排在第三个区域。
使用
az aks nodepool add命令新建一个节点池。while [ "$(az aks show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --output tsv --query provisioningState)" != "Succeeded" ]; do echo "waiting for cluster to be ready"; sleep 10; done az aks nodepool add \ --resource-group $MY_RESOURCE_GROUP_NAME \ --cluster-name $MY_CLUSTER_NAME \ --name valkey \ --node-vm-size Standard_D4_v3 \ --node-count 6 \ --zones 1 2 3 \ --output table示例输出:
Count CurrentOrchestratorVersion ETag EnableAutoScaling EnableCustomCaTrust EnableEncryptionAtHost EnableFips EnableNodePublicIp EnableUltraSsd KubeletDiskType MaxPods Mode Name NodeImageVersion OrchestratorVersion OsDiskSizeGb OsDiskType OsSku OsType ProvisioningState ResourceGroup ScaleDownMode TypePropertiesType VmSize WorkloadRuntime ------- ---------------------------- ------------------------------------ ------------------- --------------------- ------------------------ ------------ -------------------- ---------------- ----------------- --------- ------ ------ ---------------------------------------- --------------------- -------------- ------------ ------- -------- ------------------- ------------------ --------------- ----------------------- --------------- ----------------- 6 1.28.9 aaaa0000-bb11-2222-33cc-444444dddddd False False False False False False OS 30 User valkey AKSUbuntu-2204gen2containerd-202405.27.0 1.28 128 Managed Ubuntu Linux Succeeded myResourceGroup-rg Delete VirtualMachineScaleSets Standard_D4s_v3 OCIContainer
将 Valkey 映像上传到 Azure 容器注册表
在本部分中,我们将从 Docker 中心下载 Valkey 映像并将其上传到 Azure 容器注册表。 此步骤可确保映像在专用注册表中可用,并且可以在 AKS 群集中使用。 不建议在生产环境中使用公共映像。
从 Dockerhub 导入 Valkey 映像,并使用
az acr import命令将其上传到 Azure 容器注册表。az acr import \ --name $MY_ACR_REGISTRY \ --source docker.io/valkey/valkey:latest \ --image valkey:latest \ --output table
克隆 Terraform 模块
使用 Terraform 模块克隆 git 存储库。
git clone https://github.com/Azure/terraform-azurerm-avm-res-containerservice-managedcluster.git cd terraform-azurerm-avm-res-containerservice-managedcluster/tree/stateful-workloads/examples/stateful-workloads-valkey
创建 Terraform 变量文件
通过创建
valkey.tfvars包含以下内容的文件来设置 Valkey 变量。 还可以在此步骤中提供特定 变量 :acr_task_content = <<-EOF version: v1.1.0 steps: - cmd: bash echo Waiting 10 seconds the propagation of the Container Registry Data Importer and Data Reader role - cmd: bash sleep 10 - cmd: az login --identity - cmd: az acr import --name $RegistryName --source docker.io/valkey/valkey:latest --image valkey:latest EOF valkey_enabled = true node_pools = { valkey = { name = "valkey" vm_size = "Standard_DS4_v2" node_count = 3 zones = [1, 2, 3] os_type = "Linux" } }
部署基础结构
若要部署基础结构,请运行 Terraform 命令。 在此步骤中,我们设置部署 Valkey 所需的变量。
terraform init export MY_RESOURCE_GROUP_NAME=myResourceGroup-rg export MY_LOCATION=centralus SECRET=$(openssl rand -base64 32) export TF_VAR_valkey_password=${SECRET} export TF_VAR_location=${MY_LOCATION} export TF_VAR_resource_group_name=${MY_RESOURCE_GROUP_NAME} terraform apply -var-file="valkey.tfvars"注释
在某些情况下,将 Valkey 映像导入容器注册表的容器注册表任务可能会失败。 有关详细信息,请参阅 container-registry-task。 在大多数情况下,重试可解决问题。
运行以下命令,将 Terraform 输出值导出为终端中的环境变量,以在后续步骤中使用它们:
export MY_ACR_REGISTRY=$(terraform output -raw acr_registry_name) export MY_CLUSTER_NAME=$(terraform output -raw aks_cluster_name)
后续步骤
供稿人
Microsoft 会维护本文。 本系列文章为以下参与者的原创作品:
- Nelly Kiboi | 服务工程师
- Saverio Proto | 首席客户体验工程师
- Don High | 首席客户工程师
- LaBrina Loving | 首席服务工程师
- Ken Kilty | 首席 TPM
- Russell de Pina | 首席 TPM
- Colin Mixon | 产品经理
- Ketan Chawda | 高级客户工程师
- Naveed Kharadi | 客户体验工程师
- Erin Schaffer | 内容开发人员 2