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

多 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_NAME
kubectl 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. Create a secret so that the Kubernetes Operator can create and update objects in your Ops Manager project. To learn more, see Create Credentials for the 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 - <<EOF
apiVersion: mongodb.com/v1
kind: MongoDBMultiCluster
metadata:
name: multi-replica-set
spec:
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: 3
EOF

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。请参阅托管数据库用户。