从外部 Kubernetes 连接到多集群资源
在此页面上
以下过程介绍如何从 Kubernetes 集群外部连接到 Kubernetes 中部署的 MongoDBMultiCluster
资源。
先决条件
兼容的 MongoDB 版本
运行 MongoDB 4.2.3 或更高版本的数据库允许您在 Kubernetes 集群外部访问这些数据库。
Considerations
配置就绪探针覆盖
如果您创建的自定义服务需要从外部访问 Kubernetes Operator 部署的 MongoDB 自定义资源并在 Kubernetes 中使用就绪探针(readiness probe),请将 Kubernetes 中的 publishNotReadyAddresses
设置为 true
。
publishNotReadyAddresses
设置指示与该服务的端点交互的代理应忽略该服务的 就绪 状态。将 publishNotReadyAddresses
设置为 true
会覆盖为托管服务的 Pod 配置的就绪探针的行为。
默认情况下,publishNotReadyAddresses
设置为false
。在这种情况下,当 Kubernetes Operator 中托管 MongoDB 自定义资源的 Pod 失去与 Cloud Manager 或 Ops Manager 的连接时,为这些 Pod 配置的就绪探针将失败。但是,如果将 publishNotReadyAddresses
设置为 true
:
Kubernetes 不会关闭就绪探针失效的服务。
Kubernetes 将所有端点都视为准备就绪,即使托管这些端点服务的 Pod 的探测表明它们尚未准备就绪。
MongoDB 自定义资源仍可用于读写操作。
步骤
要使用 Kubernetes 集群外部的MongoDBMultiCluster
资源连接到由 Kubernetes 操作符部署的副本集:
部署多 Kubernetes 集群副本集。
使用 TLS 保护多 Kubernetes 集群。
为以下内容提供值:
中的自定义 CA
spec.security.tls.ca
证书。
为 MongoDB Pod 创建外部服务。
要从外部资源连接到多 Kubernetes 集群部署,请配置spec.externalAccess 设置:
externalAccess: {}
此设置指示 Kubernetes Operator 创建外部 LoadBalancer 为多 Kubernetes 集群部署中的 MongoDB Pod 提供服务。外部服务为外部连接提供入口点。 添加此不带值的设置会创建具有以下默认值的外部服务:
字段 | 值 | 说明 |
---|---|---|
Name | <pod-name>-svc-external | 外部服务的名称。您无法更改此值。 |
Type | LoadBalancer | 创建外部 LoadBalancer 服务。 |
Port | <Port Number> | mongod 的端口。 |
publishNotReadyAddress | true | 指定 DNS 记录 即使 Pod 尚未准备就绪,也会创建。对于任何数据库 Pod,请勿设置为 false 。 |
(可选)如果您需要向服务添加值或覆盖默认值,请指定:
特定于您的云提供商的注解,位于spec.externalAccess.externalService.annotations
例如,以下设置覆盖外部服务的默认值,以配置多 Kubernetes 集群部署以创建 NodePort 服务 公开 MongoDB Pod:
externalAccess: externalService: annotations: # cloud-specific annotations for the service spec: type: NodePort # default is LoadBalancer port: 27017 # you can specify other spec overrides if necessary
提示
要了解更多信息,请参阅 Kubernetes 文档中的注释和 ServiceSpec。
可选:为集群成员配置外部服务。
如果您需要为特定集群成员配置设置,例如当您在不同的云提供商上托管成员时,您可以覆盖全局spec.externalAccess 特定成员的设置,方法是使用spec.clusterSpecList.externalAccess.externalService 设置。
要向服务添加值或覆盖集群成员的默认值,请指定:
特定于集群成员的云提供商的注解,位于spec.clusterSpecList.externalAccess.externalService.annotations 中。
特定于集群成员的覆盖项,位于spec.clusterSpecList.externalAccess.externalService.spec 中。
例如,以下文件将配置多Kubernetes 集群MongoDB 部署,以创建负载均衡器服务,从而为Kubernetes MongoDBGKE (GoogleKubernetes Engine) 中部署的集群成员公开多 集群 部署 和Amazon Web Services EKS。
注意
以下示例未配置覆盖项,因此外部服务使用默认值从spec.externalAccess设置。
clusterSpecList: - clusterName: gke-cluster-0.mongokubernetes.com members: 2 externalAccess: externalService: annotations: "cloud.google.com/l4-rbs": "enabled" - clusterName: eks-cluster-1.mongokubernetes.com members: 2 externalAccess: externalService: annotations: "service.beta.kubernetes.io/aws-load-balancer-type": "external", "service.beta.kubernetes.io/aws-load-balancer-nlb-target-type": "instance", "service.beta.kubernetes.io/aws-load-balancer-scheme": "internet-facing"
将主题备用名称添加到 TLS 证书。
将每个外部DNS名称添加到证书SAN 。
验证外部服务。
在每个集群中,运行以下命令,验证 Kubernetes 操作符是否为您的部署创建了外部服务。
kubectl get services
该命令将返回类似于以下输出的服务列表。 对于集群中的每个数据库 Pod,Kubernetes 操作符都会创建一个名为 <pod-name>-<cluster-idx>-<pod-idx>-svc-external 的外部服务。此服务是根据您在外部服务规范中提供的值和覆盖项进行配置的。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE <my-replica-set>-0-0-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s
根据您的集群配置或云提供商,LoadBalancer 服务的 IP 地址是外部可访问的 IP 地址或 FQDN。您可以使用 IP 地址或 FQDN 路由来自外部域的流量。
更新副本集资源YAML文件。
将spec.connectivity.replicaSetHorizons
中的主机名和端口设置为您在上一步中创建的外部服务值。
确认您指定了正确的外部主机名。 外部主机名应与 Kubernetes Worker 节点的DNS名称匹配。 这些节点可以是 Kubernetes 集群中的任何节点。 如果 Pod 在其他节点上运行,Kubernetes 节点将使用内部路由。
apiVersion: mongodb.com/v1 kind: MongoDBMultiCluster metadata: name: multi-cluster-replica-set namespace: mongodb spec: clusterSpecList: - clusterName: e2e.cluster1.example.com members: 1 - clusterName: e2e.cluster2.example.com members: 1 - clusterName: e2e.cluster3.example.com members: 1 connectivity: replicaSetHorizons: - sample-horizon: web1.example.com:30907 - sample-horizon: web2.example.com:30907 - sample-horizon: web3.example.com:30907 credentials: my-credentials duplicateServiceObjects: false opsManager: configMapRef: name: my-project persistent: true security: certsSecretPrefix: clustercert tls: ca: ca-issuer type: ReplicaSet version: 6.0.0-ent"
测试与副本集的连接。
在开发环境中,对于副本集中的每个主机,运行以下命令:
mongosh --host <my-replica-set>/web1.example.com \ --port 30907 --ssl \ --sslAllowInvalidCertificates
注意
请勿在生产中使用--sslAllowInvalidCertificates
标志。
在生产中,为副本集中的每个主机指定TLS证书和CA ,以安全地连接到客户端工具或应用程序:
mongosh --host <my-replica-set>/web1.example.com \ --port 30907 \ --tls \ --tlsCertificateKeyFile server.pem \ --tlsCAFile ca-pem
如果连接成功,您应该会看到:
Enterprise <my-replica-set> [primary]