创建用于在 Azure Kubernetes 服务 (AKS) 上运行 MongoDB 群集的基础结构
在本文中,我们将创建用于在 Azure Kubernetes 服务 (AKS) 上运行 MongoDB 群集所需的基础结构资源。
先决条件
- 查看在 AKS 上部署 MongoDB 群集的概述。
- Azure 订阅。 如果没有订阅,请创建一个试用帐户。
- Azure CLI 版本 2.61.0。 若要安装或升级,请参阅安装 Azure CLI。
- Helm 3 或更高版本。 若要安装,请参阅安装 Helm。
kubectl
。- 已在本地计算机上安装 Docker。 若要安装,请参阅安装 Docker。
设置环境变量
设置本指南中需要使用的环境变量:
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 密码的权限。
使用
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
使用
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)
使用
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