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

在本文中,我们将创建用于在 Azure Kubernetes 服务 (AKS) 上运行 MongoDB 群集所需的基础结构资源。

先决条件

设置环境变量

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

random=$(echo $RANDOM | tr '[0-9]' '[a-z]')
export MY_LOCATION=chinanorth3
export MY_RESOURCE_GROUP_NAME=myResourceGroup-rg-$(echo $MY_LOCATION)
export MY_ACR_REGISTRY=mydnsrandomname$(echo $random)
export MY_IDENTITY_NAME=ua-identity-123
export MY_KEYVAULT_NAME=vault-$(echo $random)-kv
export MY_CLUSTER_NAME=cluster-aks
export SERVICE_ACCOUNT_NAME=mongodb
export SERVICE_ACCOUNT_NAMESPACE=mongodb
export AKS_MONGODB_NAMESPACE=mongodb
export AKS_MONGODB_SECRETS_NAME=cluster-aks-mongodb-secrets
export AKS_MONGODB_CLUSTER_NAME=cluster-aks-mongodb
export AKS_MONGODB_SECRETS_ENCRYPTION_KEY=cluster-aks-mongodb-secrets-mongodb-encryption-key
export AKS_AZURE_SECRETS_NAME=cluster-aks-azure-secrets
export AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_NAME=mongodbsa$(echo $random)
export AKS_MONGODB_BACKUP_STORAGE_CONTAINER_NAME=backups

创建资源组

使用 az group create 命令创建资源组:

az group create --name $MY_RESOURCE_GROUP_NAME --location $MY_LOCATION --output table

示例输出:

Location       Name
-------------  --------------------------------
chinanorth3  myResourceGroup-rg-chinanorth3   

创建标识以访问 Azure Key Vault 中的机密

在此步骤中,我们创建一个用户分配的托管标识,外部机密操作员使用该标识访问存储在 Azure Key Vault 中的 MongoDB 密码。

使用 az identity create 命令创建用户分配的托管标识:

az identity create --name $MY_IDENTITY_NAME --resource-group $MY_RESOURCE_GROUP_NAME --output table
export MY_IDENTITY_NAME_ID=$(az identity show --name $MY_IDENTITY_NAME -g $MY_RESOURCE_GROUP_NAME --query id -o tsv)
export MY_IDENTITY_NAME_PRINCIPAL_ID=$(az identity show --name $MY_IDENTITY_NAME -g $MY_RESOURCE_GROUP_NAME --query principalId -o tsv)
export MY_IDENTITY_NAME_CLIENT_ID=$(az identity show --name $MY_IDENTITY_NAME -g $MY_RESOURCE_GROUP_NAME --query clientId -o tsv)

示例输出:

ClientId                              Location       Name             PrincipalId                           ResourceGroup                     TenantId
------------------------------------  -------------  ---------------  ------------------------------------  --------------------------------  ------------------------------------
7708017b-dc75-4e65-84a6-f35c99ef5558  chinanorth3  ua-identity-123  5b213098-1e45-4ed7-9a23-7fda7597f298  myResourceGroup-rg-chinanorth3  07fa200c-6006-411f-bb29-a43bdf1a2bcc

创建 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
export KEYVAULTID=$(az keyvault show --name $MY_KEYVAULT_NAME --query "id" --output tsv)
export KEYVAULTURL=$(az keyvault show --name $MY_KEYVAULT_NAME --query "properties.vaultUri" --output tsv)

示例输出:

Location       Name            ResourceGroup
-------------  --------------  --------------------------------
chinanorth3  vault-cjcfc-kv  myResourceGroup-rg-chinanorth3

创建 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 -o tsv)

示例输出:

NAME                  RESOURCE GROUP                    LOCATION       SKU      LOGIN SERVER                     CREATION DATE         ADMIN ENABLED
--------------------  --------------------------------  -------------  -------  -------------------------------  --------------------  ---------------
mydnsrandomnamecjcfc  myResourceGroup-rg-chinanorth3    chinanorth3    Premium  mydnsrandomnamecjcfc.azurecr.cn  2024-07-01T12:18:34Z  True

创建 Azure 存储帐户

使用 az acr create 命令创建 Azure 存储帐户来存储 MongoDB 备份:

az storage account create --name $AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_NAME --resource-group $MY_RESOURCE_GROUP_NAME --location $MY_LOCATION --sku Standard_ZRS --output table
az storage container create --name $AKS_MONGODB_BACKUP_STORAGE_CONTAINER_NAME --account-name $AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_NAME --output table
export AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_KEY=$(az storage account keys list --account-name $AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_NAME --query "[0].value" -o tsv)
az keyvault secret set --vault-name $MY_KEYVAULT_NAME --name AZURE-STORAGE-ACCOUNT-KEY --value $AKS_MONGODB_BACKUP_STORAGE_ACCOUNT_KEY

示例输出:

AccessTier    AllowBlobPublicAccess    AllowCrossTenantReplication    CreationTime                      EnableHttpsTrafficOnly    Kind       Location       MinimumTlsVersion    Name            PrimaryLocation    ProvisioningState    ResourceGroup
StatusOfPrimary
------------  -----------------------  -----------------------------  --------------------------------  ------------------------  ---------  -------------  -------------------  --------------  -----------------  -------------------  --------------------------------  -----------------
Hot           False                    False                          2024-08-09T07:06:41.727230+00:00  True                      StorageV2  chinanorth3  TLS1_0               mongodbsabdibh    chinanorth3        Succeeded            myResourceGroup-rg-chinanorth3  available
Created
---------
True
Name                       Value
-------------------------  ----------------------------------------------------------------------------------------
AZURE-STORAGE-ACCOUNT-KEY  xxx4tE3xxxxxxxxxxxxxxxxxxxxxxxxxxxx...

创建 AKS 群集

在此步骤中,我们会创建启用了工作负载标识和 OIDC 颁发者的 AKS 群集。 工作负载标识为外部机密操作员服务帐户授予访问密钥保管库中存储的 MongoDB 密码的权限。

  1. 使用 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 \
    --zones 1 2 3 \
    --generate-ssh-keys \
    --output table
    

    示例输出:

    AzurePortalFqdn                                                                 CurrentKubernetesVersion    DisableLocalAccounts    DnsPrefix                           EnableRbac    Fqdn                                                                     KubernetesVersion    Location       MaxAgentPools    Name         NodeResourceGroup                                              ProvisioningState    ResourceGroup                     ResourceUid               SupportPlan
    ------------------------------------------------------------------------------  --------------------------  ----------------------  ----------------------------------  ------------  -----------------------------------------------------------------------  -------------------  -------------  ---------------  -----------  -------------------------------------------------------------  -------------------  --------------------------------  ------------------------  ------------------
    cluster-ak-myresourcegroup--83a15f-46qdeqrv.portal.hcp.chinanorth3.cx.prod.service.azk8s.cn  1.28.9                      False                   cluster-ak-myResourceGroup--83a15f  True          cluster-ak-myresourcegroup--83a15f-46qdeqrv.hcp.chinanorth3.cx.prod.service.azk8s.cn  1.28                 chinanorth3  100              cluster-aks  MC_myResourceGroup-rg-chinanorth3_cluster-aks_chinanorth3  Succeeded            myResourceGroup-rg-chinanorth3  66829edfd7793f0001b5b2fd  KubernetesOfficial
    
  2. 使用 az aks show 命令获取用于工作负载身份配置的 OIDC 颁发者 URL:

    export OIDC_URL=$(az aks show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --query oidcIssuerProfile.issuerUrl -o tsv)
    
  3. 使用 az role assignment create 命令将 AcrPull 角色分配给 kubelet 身份:

    export KUBELET_IDENTITY=$(az aks show -g $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME -o 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-07-01T12:23:20.749750+00:00  8247e9bb-bc6b-414f-98a6-4768dbb961ad  9686a88e-25bc-4b4c-b611-d1057a26acdc  0b40421c-343b-4986-b691-980d6154429e  ServicePrincipal  myResourceGroup-rg-chinanorth3  /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-chinanorth3/providers/Microsoft.ContainerRegistry/registries/mydnsrandomnamecjcfc  bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f  2024-07-01T12:23:20.749750+00:00
    

连接到 AKS 群集

使用 az aks get-credentials 命令将 kubectl 配置为连接到 AKS 群集:

az aks get-credentials --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --overwrite-existing --output table

将 Percona 映像上传到 Azure 容器注册表

在本部分中,请从 Docker Hub 下载 Percona 映像并将其上传到 Azure 容器注册表。 此步骤可确保映像在专用注册表中可用,并且可以在 AKS 群集中使用。 不建议在生产环境中使用公共映像。

从 Docker Hub 导入 Percona 映像,并使用以下 az acr import 命令将其上传到 Azure 容器注册表:

az acr import \
    --name $MY_ACR_REGISTRY \
    --source docker.io/percona/percona-server-mongodb:7.0.8-5  \
    --image percona-server-mongodb:7.0.8-5

az acr import \
    --name $MY_ACR_REGISTRY \
    --source docker.io/percona/pmm-client:2.41.2  \
    --image pmm-client:2.41.2

az acr import \
    --name $MY_ACR_REGISTRY \
    --source docker.io/percona/percona-backup-mongodb:2.4.1  \
    --image percona-backup-mongodb:2.4.1

az acr import \
    --name $MY_ACR_REGISTRY \
    --source docker.io/percona/percona-server-mongodb-operator:1.16.1  \
    --image percona-server-mongodb-operator:1.16.1

下一步