在本文中,我们将创建用于在 Azure Kubernetes 服务 (AKS) 上运行 Valkey 群集所需的基础结构资源。
先决条件
- 如果尚未部署,请查看 概述,了解如何在 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 export MY_LOCATION=chinanorth3 export MY_ACR_REGISTRY=mydnsrandomname$(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 实例。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 KeyVault 机密提供程序加载项,使 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_DS4_v2 \ --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 efecebf9-8894-46b9-9d68-09bfdadc474a 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
使用
az aks show
命令获取 Azure KeyVault 机密提供程序加载项创建的标识 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
命令将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 04628c5e-371a-49b8-8462-4ecd7f90a43f 6a9a8328-7257-4db2-8c4f-169687f36556 94fa3265-4ac2-4e19-8516-f3e830642ca8 ServicePrincipal myResourceGroup-rg /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/roleDefinitions/7f951dda-4ed3-4680-a7ca-43fe172d538d 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_D4s_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 b7aa8e37-ff39-4ec7-bed0-cb37876416cc 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 部署基础结构,我们将使用适用于 AKS 的 Azure 验证模块。
注释
如果计划在生产环境中运行此部署,建议查看 适用于 Azure 验证模块的 AKS 生产模式模块。 此模块附带了最佳做法建议。
使用 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
通过创建
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 映像导入容器注册表的容器注册表任务可能会失败。
- 运行以下命令,将 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