对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

多 Kubernetes 集群快速入门

使用快速入门,使用 节点集群、GKE (Google Kubernetes 引擎) 和 Istio 服务网格跨三个 Kubernetes 节点集群部署 MongoDB 副本集。

开始之前:

注意

以下过程将多 Kubernetes集群MongoDB 部署的范围限定为名为 mongodb的单个命名空间。您可以配置多 Kubernetes集群MongoDB 部署,以监视多个命名空间或所有命名空间中的资源。

观看此视频教程,演示如何创建多 Kubernetes 集群 MongoDB 部署。

时长:12 分钟

跨多个 Kubernetes 集群部署 MongoDB 副本集

在使用快速入门创建多 Kubernetes集群MongoDB 部署之前,请完成以下任务:

在继续之前,确保您满足一般先决条件。 要学习;了解更多信息,请参阅一般先决条件。

设置环境变量,其中包含集群名称以及部署集群的可用 GKE 区域,如下示例所示:

export MDB_GKE_PROJECT={GKE project name} export MDB_CENTRAL_CLUSTER_ZONE="us-west1-a" export MDB_CLUSTER_1_ZONE="us-west1-b" export MDB_CLUSTER_2_ZONE="us-east1-b" export MDB_CLUSTER_3_ZONE="us-central1-a" export MDB_CENTRAL_CLUSTER_FULL_NAME="gke_${MDB_GKE_PROJECT}_${MDB_CENTRAL_CLUSTER_ZONE}_${MDB_CENTRAL_CLUSTER}" export MDB_CLUSTER_1_FULL_NAME="gke_${MDB_GKE_PROJECT}_${MDB_CLUSTER_1_ZONE}_${MDB_CLUSTER_1}"export MDB_CLUSTER_2_FULL_NAME="gke_${MDB_GKE_PROJECT}_${MDB_CLUSTER_2_ZONE}_${MDB_CLUSTER_2}"export MDB_CLUSTER_3_FULL_NAME="gke_${MDB_GKE_PROJECT}_${MDB_CLUSTER_3_ZONE}_${MDB_CLUSTER_3}"

设置 GKE (Google Kubernetes Engine) 集群:

1

如果尚未执行此操作,请创建一个Google Cloud Platform项目,对项目启用计费功能,启用Artifact 注册表和 GKE API,然后按照Google Cloud Platform文档中的 Google Kubernetes Engine 快速入门中的相关步骤启动 Cloud Shell 。

2

创建一个中央集群 和一个或多个成员集群,并指定 GKE 区域、节点数和实例类型,如下例所示:

gcloud container clusters create $MDB_CENTRAL_CLUSTER \ --zone=$MDB_CENTRAL_CLUSTER_ZONE \ --num-nodes=5 \ --machine-type "e2-standard-2"
gcloud container clusters create $MDB_CLUSTER_1 \ --zone=$MDB_CLUSTER_1_ZONE \ --num-nodes=5 \ --machine-type "e2-standard-2"
gcloud container clusters create $MDB_CLUSTER_2 \ --zone=$MDB_CLUSTER_2_ZONE \ --num-nodes=5 \ --machine-type "e2-standard-2"
gcloud container clusters create $MDB_CLUSTER_3 \ --zone=$MDB_CLUSTER_3_ZONE \ --num-nodes=5 \ --machine-type "e2-standard-2"

获取中央 Kubernetes 集群和成员 Kubernetes 集群的用户身份验证档案并保存档案。 稍后,您将使用这些档案在这些集群上运行kubectl命令。

运行以下命令:

gcloud container clusters get-credentials $MDB_CENTRAL_CLUSTER \ --zone=$MDB_CENTRAL_CLUSTER_ZONE gcloud container clusters get-credentials $MDB_CLUSTER_1 \ --zone=$MDB_CLUSTER_1_ZONE gcloud container clusters get-credentials $MDB_CLUSTER_2 \ --zone=$MDB_CLUSTER_2_ZONE gcloud container clusters get-credentials $MDB_CLUSTER_3 \ --zone=$MDB_CLUSTER_3_ZONE

根据是否要使用TLS证书加密多 Kubernetes 集群 MongoDB 部署中的副本集连接,选择相应的标签页。

您可以在此TLS-Encrypted Connections标签页中执行以下操作步骤:

  • 部署MongoDBMultiCluster资源

  • 为MongoDBMultiCluster资源续订 TLS 证书

这些过程在副本集的MongoDB主机之间以及客户端应用程序与MongoDB部署之间建立TLS加密连接。

在开始之前,您必须拥有有效的TLS加密证书。

1

运行kubectl命令以创建用于存储MongoDBMultiCluster资源证书的新密钥:

kubectl --context $MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace=<metadata.namespace> \ create secret tls <prefix>-<metadata.name>-cert \ --cert=<resource-tls-cert> \ --key=<resource-tls-key>

注意

您必须在密钥前面加上 <prefix>-<metadata.name> 作为前缀。

示例,如果调用部署my-deployment 并将前缀设置为mdb ,则必须命名用于客户端 TLS 通信 的 TLSmdb-my-deployment-cert 秘钥。此外,您必须命名用于内部集群身份验证(如果已启用)mdb-my-deployment-clusterfile 的 TLS 密钥。

2

运行 kubectl 命令,将您的 CA 与您的 MongoDBMultiCluster 资源关联。为 MongoDBMultiCluster 资源指定必须始终命名为 ca-pem 的 CA 证书文件:

kubectl --context $MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace=<metadata.namespace> \ create configmap custom-ca -from-file=ca-pem=<your-custom-ca-file>
3

默认情况下,Kubernetes 操作符的作用域为mongodb命名空间。当您运行以下命令时, kubectl mongodb插件:

  • 创建一个中央集群、三个成员集群,并在每个集群中创建一个标记为 命名空间 的 mongodb。

  • 创建一个硬编码名称为mongodb-kubernetes-operator-member-list的默认 ConfigMap,其中包含所有成员集群。 您无法更改 ConfigMap 的名称。

  • 创建在成员集群中运行数据库工作负载所需的服务帐户和角色。

运行kubectl mongodb插件:

kubectl mongodb multicluster setup \ --central-cluster="${MDB_CENTRAL_CLUSTER_FULL_NAME}" \ --member-clusters="${MDB_CLUSTER_1_FULL_NAME},${MDB_CLUSTER_2_FULL_NAME},${MDB_CLUSTER_3_FULL_NAME}" \ --member-cluster-namespace="mongodb" \ --central-cluster-namespace="mongodb" \ --create-service-account-secrets \ --install-database-roles=true
4

如果您使用的是 Istio,请在中央集群上运行以下命令,并指定部署中每个成员集群的上下文。要在 Istio 中启用sidecar 注入,以下命令将 istio-injection=enabled 标签添加到每个成员集群上的 mongodb 命名空间。如果使用其他服务网格,请将其配置为处理创建的命名空间中的网络流量。

kubectl label \ --context=$MDB_CLUSTER_1_FULL_NAME \ namespace mongodb \ istio-injection=enabled
kubectl label \ --context=$MDB_CLUSTER_2_FULL_NAME \ namespace mongodb \ istio-injection=enabled
kubectl label \ --context=$MDB_CLUSTER_3_FULL_NAME \ namespace mongodb \ istio-injection=enabled
5

如果尚未执行此操作,请运行以下命令,以便在默认命名空间中的中央集群上运行所有kubectl命令。

kubectl config use-context $MDB_CENTRAL_CLUSTER_FULL_NAMEkubectl config set-context $(kubectl config current-context) \ --namespace=mongodb
6

使用 Helm 或 kubectl 在 mongodb命名空间中的中央集群中部署Kubernetes Operator 的MongoDB控制器。

  1. 将适用于 Kubernetes 的 MongoDB Helm Charts 存储库添加到 Helm。

    helm repo add mongodb https://mongodb.github.io/helm-charts
  2. 使用适用于Kubernetes的MongoDB Helm Charts来部署Kubernetes Operator。

    helm upgrade \ --install \ mongodb-kubernetes-operator-multi-cluster \ mongodb/mongodb-kubernetes \ --namespace mongodb \ --set namespace=mongodb \ --version <mongodb-kubernetes-operator-version> \ --set operator.name=mongodb-kubernetes-operator-multi-cluster \ --set operator.createOperatorServiceAccount=false \ --set operator.createResourcesServiceAccountsAndRoles=false \ --set "multiCluster.clusters={$MDB_CLUSTER_1_FULL_NAME,$MDB_CLUSTER_2_FULL_NAME,$MDB_CLUSTER_3_FULL_NAME}" \ --set multiCluster.performFailover=false
7
  1. 创建密钥,以便Kubernetes Operator 可以在MongoDB Ops Manager项目中创建和更新对象。 要了解更多信息,请参阅为 Kubernetes Operator 创建档案。

  2. 创建 ConfigMap,将Kubernetes Operator 链接到MongoDB Ops Manager项目。要学习;了解更多信息,请参阅使用 ConfigMap 为每个MongoDB部署创建一个项目。

8
9

设置 spec.credentials、spec.opsManager.configMapRef.name 和 安全设置,并部署MongoDBMultiCluster资源。在以下代码示例中,duplicateServiceObjects 设立为true ,以启用Istio 中的 DNS 代理。

注意

为了通过 Istio 服务网格启用跨集群 DNS 解析,本教程为每个 Kubernetes Pod 创建具有单个 ClusterIP 地址的服务对象。

kubectl apply -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBMultiClustermetadata: name: multi-replica-setspec: version: 8.0.0 type: ReplicaSet persistent: false duplicateServiceObjects: true credentials: my-credentials opsManager: configMapRef: name: my-project security: certsSecretPrefix: <prefix> tls: ca: custom-ca clusterSpecList: - clusterName: ${MDB_CLUSTER_1_FULL_NAME} members: 3 - clusterName: ${MDB_CLUSTER_2_FULL_NAME} members: 2 - clusterName: ${MDB_CLUSTER_3_FULL_NAME} members: 3EOF

Kubernetes 操作符将您在前面步骤中创建的带有CA的 ConfigMap 复制到每个成员集群,生成连接的PEM密钥,并将其分发到成员集群。

10
  1. 对于成员集群,运行以下命令验证 MongoDB Pod 是否处于运行状态:

    kubectl get pods \ --context=$MDB_CLUSTER_1_FULL_NAME \ --namespace mongodb
    kubectl get pods \ --context=$MDB_CLUSTER_2_FULL_NAME \ --namespace mongodb
    kubectl get pods \ --context=$MDB_CLUSTER_3_FULL_NAME \ --namespace mongodb
  2. 在中央集群中,运行以下命令以验证MongoDBMultiCluster资源是否处于运行状态:

    kubectl --context=$MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace mongodb \ get mdbmc multi-replica-set -o yaml -w

使用以下过程定期续订TLS证书。

1

运行此 kubectl 命令以更新存储 密钥 MongoDBMultiCluster资源证书的现有密钥:

kubectl --context $MDB_CENTRAL_CLUSTER_FULL_NAME \--namespace=<metadata.namespace> \create secret tls <prefix>-<metadata.name>-cert \--cert=<resource-tls-cert> \--key=<resource-tls-key> \--dry-run=client \-o yaml |kubectl apply -f -

跨三个 Kubernetes 集群部署 MongoDB 副本集后,您可以添加数据库用户,以便连接到 MongoDB database。请参阅托管数据库用户。