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

多 Kubernetes 集群快速入门

使用快速入门,使用 GKE (Google Kubernetes Engine) 和 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 通信的 TLS 密钥命名为 mdb-my-deployment-cert。此外,您必须将用于内部集群身份验证(如果已启用)的 TLS 密钥命名为 mdb-my-deployment-clusterfile。

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. 将MongoDB Helm Charts for Kubernetes存储库添加到 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. 创建 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 Operator 将您在前面步骤中创建的带有 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。请参阅托管数据库用户。