共用方式為

创建用于在 Azure Kubernetes 服务 (AKS) 上运行 Valkey 群集的基础结构

本指南逐步讲解在 AKS 上运行 Valkey 群集的完整设置过程。 此过程包括配置环境变量、预配核心 Azure 资源(例如资源组、Azure Key Vault 和 Azure 容器注册表 (ACR),创建具有集成工作负荷标识和管理机密的 AKS 群集。 它还介绍了如何为 Valkey 工作负荷创建专用节点池,以及如何将 Valkey 映像导入专用注册表。 如果你更喜欢基础结构即代码,本指南包含将 Terraform 与 Azure 验证模块配合使用的替代部署路径,确保最佳做法和生产准备情况。

若要使用 Terraform 部署基础结构,请使用适用于 AKSAzure 验证模块

注释

如果计划在生产环境中运行此部署,建议查看 适用于 Azure 验证模块的 AKS 生产模式模块。 此模块附带了最佳做法建议。

先决条件

设置环境变量

  • 设置本指南中需要使用的环境变量:

    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"
          }
        }
    

部署基础结构

  1. 若要部署基础结构,请运行 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。 在大多数情况下,重试可解决问题。

  2. 运行以下命令,将 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