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

多 Kubernetes 集群快速入门

使用快速入门,使用 GKE (Google Kubernetes Engine)Istio 服务网格跨三个Kubernetes成员集群部署MongoDB副本集。

开始之前:

注意

The following procedures scope your multi-Kubernetes cluster MongoDB deployment to a single namespace named mongodb. You can configure your multi-Kubernetes cluster MongoDB deployment to watch resources in multiple namespaces or all namespaces.

观看此视频教程,演示如何创建多 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> 作为前缀。

For example, if you call your deployment my-deployment and you set the prefix to mdb, you must name the TLS secret for the client TLS communications mdb-my-deployment-cert. Also, you must name the TLS secret for internal cluster authentication (if enabled) mdb-my-deployment-clusterfile.

2

Run the kubectl command to link your CA to your MongoDBMultiCluster resource. Specify the CA certificate file that you must always name ca-pem for the MongoDBMultiCluster resource:

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插件:

  • Creates one operator cluster, three member clusters, and a namespace labeled mongodb in each of the clusters.

  • 创建一个硬编码名称为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

If you're using Istio, run the following command on the operator cluster, specifying the context for each of the member clusters in the deployment. To enable sidecar injection in Istio, the following commands add the istio-injection=enabled labels to the mongodb namespaces on each member cluster. If you use another service mesh, configure it to handle network traffic in the created namespaces.

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 或 kubectlmongodb命名空间中的操作符集群中部署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
  1. 应用Kubernetes Operator 自定义资源。

    kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/master/public/crds.yaml
  2. 下载Kubernetes Operator YAML 模板。

    curl https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/master/public/mongodb-kubernetes-multi-cluster.yaml -o operator.yaml
  3. 可选:自定义Kubernetes Operator YAML 模板。

    要学习;了解可选的Kubernetes Operator 安装设置,请参阅Kubernetes Operator kubectl oc 的MongoDB控制器安装设置。

  4. 应用Kubernetes Operator YAML文件。

    kubectl apply -f operator.yaml
  5. 验证Kubernetes Operator 是否已部署。

    要验证 Kubernetes 操作符是否正确安装,请运行以下命令并验证输出:

    kubectl describe deployments mongodb-kubernetes-operator -n <metadata.namespace>
    oc describe deployments mongodb-kubernetes-operator -n <metadata.namespace>

    默认情况下,部署存在于mongodb命名空间中。 如果出现以下错误消息,请确保使用正确的命名空间:

    Error from server (NotFound): deployments.apps "mongodb-kubernetes-operator" not found

    要对 Kubernetes 操作符进行故障排除,请参阅查看 Kubernetes 操作符的日志和其他故障排除主题。

    重要

    如果需要删除 Kubernetes 操作符 或命名空间,则必须首先删除 MongoDB 资源。

7
  1. 创建密钥,以便Kubernetes Operator 可以在MongoDB Ops Manager项目中创建和更新对象。 要了解更多信息,请参阅为 Kubernetes Operator 创建档案。

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

8
9

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

注意

为了通过 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

Run this kubectl command to renew an existing secret that stores the certificates for the MongoDBMultiCluster resource:

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 -

此过程不会加密副本集MongoDB主机之间的连接,以及客户端应用程序与MongoDB部署之间的连接。

1

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

  • Creates one operator cluster, three member clusters, and a namespace labeled mongodb in each of the clusters.

  • 创建一个硬编码名称为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
2

If you're using Istio, run the following command on the operator cluster, specifying the context for each of the member clusters in the deployment. To enable sidecar injection in Istio, the following commands add the istio-injection=enabled labels to the mongodb namespaces on each member cluster. If you use another service mesh, configure it to handle network traffic in the created namespaces.

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
3

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

kubectl config use-context $MDB_CENTRAL_CLUSTER_FULL_NAME
kubectl config set-context $(kubectl config current-context) \
--namespace=mongodb
4

使用 Helm 或 kubectlmongodb命名空间中的操作符集群中部署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
  1. 应用Kubernetes Operator 自定义资源。

    kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/master/public/crds.yaml
  2. 下载Kubernetes Operator YAML 模板。

    curl https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/master/public/mongodb-kubernetes-multi-cluster.yaml -o operator.yaml
  3. 可选:自定义Kubernetes Operator YAML 模板。

    要学习;了解可选的Kubernetes Operator 安装设置,请参阅Kubernetes Operator kubectl oc 的MongoDB控制器安装设置。

  4. 应用Kubernetes Operator YAML文件。

    kubectl apply -f operator.yaml
  5. 验证Kubernetes Operator 是否已部署。

    要验证 Kubernetes 操作符是否正确安装,请运行以下命令并验证输出:

    kubectl describe deployments mongodb-kubernetes-operator -n <metadata.namespace>
    oc describe deployments mongodb-kubernetes-operator -n <metadata.namespace>

    默认情况下,部署存在于mongodb命名空间中。 如果出现以下错误消息,请确保使用正确的命名空间:

    Error from server (NotFound): deployments.apps "mongodb-kubernetes-operator" not found

    要对 Kubernetes 操作符进行故障排除,请参阅查看 Kubernetes 操作符的日志和其他故障排除主题。

    重要

    如果需要删除 Kubernetes 操作符 或命名空间,则必须首先删除 MongoDB 资源。

5
  1. 创建密钥,以便Kubernetes Operator 可以在MongoDB Ops Manager项目中创建和更新对象。 要了解更多信息,请参阅为 Kubernetes Operator 创建档案。

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

6
7

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

注意

为了通过 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密钥,并将其分发到成员集群。

8
  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

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