使用快速入门,使用 GKE (Google Kubernetes Engine) 和 Istio 服务网格跨三个Kubernetes成员集群部署MongoDB副本集。
开始之前:
完成先决条件
注意
以下过程将多 Kubernetes集群MongoDB 部署的范围限定为名为 mongodb 的单个命名空间。您可以配置多 Kubernetes集群MongoDB 部署,以监视多个命名空间或所有命名空间中的资源。
喜欢通过观看视频来学习?
观看此视频教程,演示如何创建多 Kubernetes 集群 MongoDB 部署。
时长:12 分钟
先决条件
在使用快速入门创建多 Kubernetes集群MongoDB 部署之前,请完成以下任务:
查看一般先决条件
在继续之前,确保您满足一般先决条件。 要学习;了解更多信息,请参阅一般先决条件。
设置环境变量和 GKE 区域
设置环境变量,其中包含集群名称以及部署集群的可用 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 集群
设置 GKE (Google Kubernetes Engine) 集群:
设置您的 Google Cloud Platform 帐户。
如果尚未执行此操作,请创建一个Google Cloud Platform项目,对项目启用计费功能,启用Artifact 注册表和 GKE API,然后按照Google Cloud Platform文档中的 Google Kubernetes Engine 快速入门中的相关步骤启动 Cloud Shell 。
创建中央集群和成员集群。
创建一个中央集群 和一个或多个成员集群,并指定 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
部署 MongoDBMultiCluster 资源
根据是否要使用 TLS 证书加密多 Kubernetes集群MongoDB部署中的副本集连接,选择相应的标签页。
您可以在此TLS-Encrypted Connections标签页中执行以下操作步骤:
部署
MongoDBMultiCluster资源为
MongoDBMultiCluster资源续订 TLS 证书
这些过程在副本集的MongoDB主机之间以及客户端应用程序与MongoDB部署之间建立TLS加密连接。
在开始之前,您必须拥有有效的TLS加密证书。
为您的 MongoDBMultiCluster资源的 TLS 证书创建密钥。
运行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。
运行 kubectl mongodb 插件。
默认情况下,Kubernetes 操作符的作用域为mongodb命名空间。当您运行以下命令时, kubectl 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
可选:在每个成员集群中设置 Istio 注入 Webhook。
如果您使用的是 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
在中央集群中部署Kubernetes Operator 的MongoDB控制器。
使用 Helm 或 kubectl 在 mongodb命名空间中的中央集群中部署Kubernetes Operator 的MongoDB控制器。
将MongoDB Helm Charts for Kubernetes存储库添加到 Helm。
helm repo add mongodb https://mongodb.github.io/helm-charts 使用适用于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
应用Kubernetes Operator 自定义资源。
kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/1.1.0/public/crds.yaml 下载Kubernetes Operator YAML 模板。
curl https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/1.1.0/public/mongodb-kubernetes-multi-cluster.yaml -o operator.yaml 可选:自定义Kubernetes Operator YAML 模板。
要学习;了解可选的Kubernetes Operator 安装设置,请参阅Kubernetes Operator kubectl 和 oc 的MongoDB控制器安装设置。
应用Kubernetes Operator YAML文件。
kubectl apply -f operator.yaml 验证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 资源。
创建与 Ops Manager 一起使用的密钥并创建 ConfigMap。
创建密钥,以便Kubernetes Operator 可以在Ops Manager项目中创建和更新对象。要学习;了解更多信息,请参阅为Kubernetes Operator 创建档案。
创建 ConfigMap,将Kubernetes Operator 链接到MongoDB Ops Manager项目。要学习;了解更多信息,请参阅使用 ConfigMap 为每个MongoDB部署创建一个项目。
部署 MongoDBMultiCluster资源。
设置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 密钥,并将其分发到成员集群。
验证MongoDBMultiCluster 资源是否正在运行。
对于成员集群,运行以下命令验证 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 在中央集群中,运行以下命令以验证
MongoDBMultiCluster资源是否处于运行状态:kubectl --context=$MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace mongodb \ get mdbmc multi-replica-set -o yaml -w
为 MongoDBMultiCluster 资源续订 TLS 证书
使用以下过程定期续订 TLS 证书。
更新MongoDBMultiCluster资源的密钥。
运行此 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部署之间的连接。
运行 kubectl mongodb 插件。
默认情况下,Kubernetes 操作符的作用域为mongodb命名空间。当您运行以下命令时, kubectl 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
可选:在每个成员集群中设置 Istio 注入 Webhook。
如果您使用的是 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
在中央集群中部署Kubernetes Operator 的MongoDB控制器。
使用 Helm 或 kubectl 在 mongodb命名空间中的中央集群中部署Kubernetes Operator 的MongoDB控制器。
将MongoDB Helm Charts for Kubernetes存储库添加到 Helm。
helm repo add mongodb https://mongodb.github.io/helm-charts 使用适用于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
应用Kubernetes Operator 自定义资源。
kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/1.1.0/public/crds.yaml 下载Kubernetes Operator YAML 模板。
curl https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/1.1.0/public/mongodb-kubernetes-multi-cluster.yaml -o operator.yaml 可选:自定义Kubernetes Operator YAML 模板。
要学习;了解可选的Kubernetes Operator 安装设置,请参阅Kubernetes Operator kubectl 和 oc 的MongoDB控制器安装设置。
应用Kubernetes Operator YAML文件。
kubectl apply -f operator.yaml 验证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 资源。
创建与 Ops Manager 一起使用的密钥并创建 ConfigMap。
创建密钥,以便Kubernetes Operator 可以在Ops Manager项目中创建和更新对象。要学习;了解更多信息,请参阅为Kubernetes Operator 创建档案。
创建 ConfigMap,将Kubernetes Operator 链接到MongoDB Ops Manager项目。要学习;了解更多信息,请参阅使用 ConfigMap 为每个MongoDB部署创建一个项目。
部署 MongoDBMultiCluster资源。
设置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 密钥,并将其分发到成员集群。
验证MongoDBMultiCluster 资源是否正在运行。
对于成员集群,运行以下命令验证 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 在中央集群中,运行以下命令以验证
MongoDBMultiCluster资源是否处于运行状态:kubectl --context=$MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace mongodb \ get mdbmc multi-replica-set -o yaml -w
后续步骤
跨三个 Kubernetes 集群部署 MongoDB 副本集后,您可以添加数据库用户,以便连接到 MongoDB database。请参阅托管数据库用户。