Docs 菜单
Docs 主页
/
MongoDB Enterprise Kubernetes Operator
/

多 Kubernetes 集群快速入门

在此页面上

  • 喜欢通过观看视频来学习?
  • 先决条件
  • 查看一般先决条件
  • 设置环境变量和 GKE 区域
  • 设置 GKE 集群
  • 获取中央集群和成员集群的用户身份验证档案
  • 部署 MongoDBMultiCluster 资源
  • 后续步骤

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

开始之前:

  • 了解多 Kubernetes 集群部署

  • 查看多 Kubernetes 集群服务和工具列表

  • 完成先决条件

注意

以下过程将多 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,然后按照shell GoogleKubernetes Engine 快速入门 中的相关步骤启动 Cloud 在Google Cloud Platform 文档中。

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 密钥。此外,您必须将用于内部集群身份验证(如果已启用)的TLS密钥命名为mdb-my-deployment-clusterfile

2

运行kubectl命令将CA链接到MongoDBMultiCluster资源。 为MongoDBMultiCluster资源指定必须始终命名为ca-pemCA证书文件:

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-enterprise-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,请在中央集群上运行以下命令,并指定部署中每个成员集群的上下文。 启用 sidecar 注入 在 Istio 中,以下命令将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 或kubectlmongodb命名空间中的中央集群中部署 MongoDB Enterprise Kubernetes Operator。

  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-enterprise-operator-multi-cluster \
    mongodb/enterprise-operator \
    --namespace mongodb \
    --set namespace=mongodb \
    --version <mongodb-kubernetes-operator-version> \
    --set operator.name=mongodb-enterprise-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-enterprise-kubernetes/master/crds.yaml
  2. 下载Kubernetes Operator YAML 模板。

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

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

  4. 应用Kubernetes Operator YAML文件。

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

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

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

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

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

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

    重要

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

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

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

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: 6.0.0-ent
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 -

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

1

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

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

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

如果您使用的是 Istio,请在中央集群上运行以下命令,并指定部署中每个成员集群的上下文。 启用 sidecar 注入 在 Istio 中,以下命令将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
3

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

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

使用 Helm 或kubectlmongodb命名空间中的中央集群中部署 MongoDB Enterprise Kubernetes Operator。

  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-enterprise-operator-multi-cluster \
    mongodb/enterprise-operator \
    --namespace mongodb \
    --set namespace=mongodb \
    --version <mongodb-kubernetes-operator-version> \
    --set operator.name=mongodb-enterprise-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-enterprise-kubernetes/master/crds.yaml
  2. 下载Kubernetes Operator YAML 模板。

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

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

  4. 应用Kubernetes Operator YAML文件。

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

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

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

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

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

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

    重要

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

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

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

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: 6.0.0-ent
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密钥,并将其分发到成员集群。

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

后退

先决条件