在本文中,我们将创建用于在 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
使用
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
使用
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 群集。 我们启用 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 工作负载的节点池。 此节点池已禁用自动扩展,并由跨两个可用区域的六个节点组成,因为我们希望在不同区域中的每个主区域拥有一个辅助节点。
使用
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
在本部分中,我们将从 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 部署基础结构,我们将使用适用于 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