Cluster fragmentado de vários clusters sem malha de serviço
Recomendamos implantar uma interface de serviço para facilitar a conectividade entre recursos em um sistema de cluster fragmentado de vários clusters; no entanto, se preferir implementar um sistema de cluster fragmentado com vários clusters sem uma rede de serviços, siga este guia para configurar a rede necessária entre os recursos de vários clusters.
As implementações de cluster fragmentado em vários clusters Kubernetes sem uma malha de serviço exigem que cada processo seja exposto externamente e configurado para se identificar pelo nome de host disponível externamente. Se a rede de cada nome de host estiver configurada corretamente (ou seja, o tráfego ao se conectar a qualquer nome de host é roteado para um processo/pod específico), todos os outros processos e clientes do MongoDB poderão se conectar a todos os processos no cluster. Embora os clientes se conectem apenas aos processos mongos, é necessário expor outros componentes porque, no sistema de cluster fragmentado, todos os processos devem ser capazes de se conectar a todos os outros processos no cluster fragmentado.
Procedimento
Configure os namespaces em cada cluster Kubernetes.
Recomendamos que você use o plugin-in
kubectl mongodb
para executar a configuração necessária (ou seja, RBACs, contas de serviço e o segredo do Kubernetes para o operador Kubernetes que contém credenciais para outros clusters Kubernetes) automaticamente em todos os clusters. Consulte Cluster fragmentado de vários clusters para saber mais.
Instale e configure o Operador Kubernetes.
Você pode seguir esse procedimento paralelo no guia de implantação do Multi-Cluster Ops Manager.
Implementar recurso MongoDB .
Conforme o exemplo a seguir, configure type
e topology
como type=ShardedCluster
e topology=MultiCluster
.
apiVersion: mongodb.com/v1 kind: MongoDB metadata: annotations: mongodb.com/v1.architecture: non-static name: mdb-sharded namespace: ls spec: shardCount: 1 topology: MultiCluster type: ShardedCluster version: 8.0.4 credentials: my-credentials opsManager: configMapRef: name: my-project persistent: true security: authentication: agents: mode: X509 enabled: true internalCluster: X509 modes: - X509 certsSecretPrefix: prefix tls: ca: issuer-ca enabled: true externalAccess: {} configSrv: clusterSpecList: - clusterName: kind-e2e-cluster-1 externalAccess: externalDomain: kind-e2e-cluster-1.interconnected externalService: {} members: 1 - clusterName: kind-e2e-cluster-2 externalAccess: externalDomain: kind-e2e-cluster-2.interconnected externalService: {} members: 1 - clusterName: kind-e2e-cluster-3 externalAccess: externalDomain: kind-e2e-cluster-3.interconnected externalService: {} members: 1 mongos: clusterSpecList: - clusterName: kind-e2e-cluster-1 externalAccess: externalDomain: kind-e2e-cluster-1.interconnected externalService: {} members: 1 - clusterName: kind-e2e-cluster-2 externalAccess: externalDomain: kind-e2e-cluster-2.interconnected externalService: {} members: 1 - clusterName: kind-e2e-cluster-3 externalAccess: externalDomain: kind-e2e-cluster-3.interconnected externalService: {} members: 1 shard: clusterSpecList: - clusterName: kind-e2e-cluster-1 externalAccess: externalDomain: kind-e2e-cluster-1.interconnected externalService: {} members: 1 - clusterName: kind-e2e-cluster-2 externalAccess: externalDomain: kind-e2e-cluster-2.interconnected externalService: {} members: 1 - clusterName: kind-e2e-cluster-3 externalAccess: externalDomain: kind-e2e-cluster-3.interconnected externalService: {} members: 1
Detalhes e considerações de exemplo
O exemplo acima não está pronto para produção. Observe os seguintes detalhes e considerações:
O domínio no exemplo (
kind-e2e-cluster-3.interconnected
) é artificial e deve ser substituído pelo domínio acessível externamente adequado.A configuração usa TLS (não é possível expor externamente processos do MongoDB com segurança sem TLS) e autenticação x509. Isso pode ser configurado arbitrariamente de acordo com as necessidades. Consulte Criptografia e Autenticação apropriadas para saber mais.
Os certificados TLS em cluster fragmentado devem ser emitidos para os seguintes componentes:
Cada conjunto de réplicas de shard
Conjunto de réplicas do servidor de configuração
mongos
Cada certificado TLS (
-cert
segredos do tipo TLS, fornecidos manualmente ou emitidos por cert-manager) deve ser fornecido no cluster Kubernetes onde o Operador Kubernetes está em execução. A partir daí, o Operador Kubernetes replica automaticamente os recursos necessários (segredos-cert-pem
gerados) para os outros clusters Kubernetes.Cada certificado TLS para cada componente deve conter todos os nomes de host de todos os processos do conjunto de réplicas desse componente. Por exemplo, o certificado emitido para o primeiro shard (índice 0) deve ter no campo SANs do cert os seguintes nomes de host (para cada cluster em que é implantado; o nome do pod segue a convenção
mdb-sharded-<shardIdx>-<clusterIdx>-<podIdxInThisCluster>
).mdb-sharded-0-0-0.kind-e2e-cluster-1.interconnected
mdb-sharded-0-1-0.kind-e2e-cluster-2.interconnected
mdb-sharded-0-2-0.kind-e2e-cluster-3.interconnected
Para referência, todos os processos do cluster fragmentado implementado com o exemplo fornecido são configurados com os seguintes nomes de host:
mdb-sharded-0-0-0.kind-e2e-cluster-1.interconnected (shard-0) mdb-sharded-0-1-0.kind-e2e-cluster-2.interconnected (shard-0) mdb-sharded-0-2-0.kind-e2e-cluster-3.interconnected (shard-0) mdb-sharded-config-0-0.kind-e2e-cluster-1.interconnected (cs) mdb-sharded-config-1-0.kind-e2e-cluster-2.interconnected (cs) mdb-sharded-config-2-0.kind-e2e-cluster-3.interconnected (cs) mdb-sharded-mongos-0-0.kind-e2e-cluster-1.interconnected (mongos) mdb-sharded-mongos-1-0.kind-e2e-cluster-2.interconnected (mongos) mdb-sharded-mongos-2-0.kind-e2e-cluster-3.interconnected (mongos) Cada
externalService:
é definido com um objeto padrão{}
.Isso significa que o Kubernetes Operator cria os serviços externos (serviços criados para cada pod que devem ser usados para rotear o tráfego externo) com os valores padrão:
type: LoadBalancer
ports: 27017
,27018
para fins de backup
Dependendo da configuração do cluster e do controlador do balanceador de carga no cluster Kubernetes, o uso do tipo LoadBalancer para serviços externos fará com que o provisionamento de recursos do balanceador de carga para cada um dos processos nos clusters fragmentados. Isso pode levar ao grande número de recursos do LoadBalancer alocados. Na implantação mínima (1 mongos, conjunto de réplica do servidor de configuração do 3nó, 1 fragmento do 3conjunto de réplicas do nó) isso cria 7 serviços LoadBalancer.
Para minimizar o número de recursos LoadBalancer criados, recomendamos que você configure o acesso externo com serviços ClusterIP, conforme mostrado no exemplo a seguir:
- clusterName: kind-e2e-cluster-3 externalAccess: externalDomain: kind-e2e-cluster-3.interconnected externalService: type: ClusterIP Com cada processo (pod) tendo um serviço externo ClusterIP associado, é necessário criar um componente proxy de " ponto de entrada" externo para o cluster Kubernetes, que pode ser qualquer proxy (por exemplo HAProxy, Nginx) que suporta roteamento de passagem TLS.
O componente proxy deve ser distribuído em cada cluster do Kubernetes e exposto externamente em um nome de host definido para os componentes em cada cluster:
No exemplo acima, cada componente (mongos, servidor de configuração, shards) definido para
kind-e2e-cluster-3
utiliza externalDomain:externalDomain: kind-e2e-cluster-3.interconnected
Isto significa que o componente proxy deve ser configurado para receber todas as conexões para
*.kind-e2e-cluster-3.interconnected
.Cada conexão deve ser um nome de host seguindo a convenção de nomenclatura
<pod-name>.<externalDomain>
, por exemplo:Pod de fragmento:
mdb-sharded-0-2-0.kind-e2e-cluster-2.interconnected (mdb-sharded-<shardIdx>-<clusterIdx>-<podIdx>
O componente de proxy deve ser configurado de forma que qualquer tráfego (em portas
27017
ou27018
) seja proxy (em um nível TCP, sem criptografar novamente o tráfego) para o respectivo serviço externo.Por exemplo, para
mdb-sharded-0-2-0-svc-external
uma regra genérica pode ser usada ao configurar o envio como<pod-name>.kind-e2e-cluster-2.interconnected
encaminhado para<pod-name>-mdb-sharded-0-2-0-svc-external
.
Observe que o
externalDomain
utilizado no exemplo é artificial. Ele deve ser substituído por um nome de domínio adequado.O operador implementa todos os processos nos clusters Kubernetes junto com todos os serviços externos necessários.
Cada serviço externo em cada cluster deve receber tráfego externo nos domínios externos definidos. Até que a rede esteja totalmente configurada, o cluster não está configurado corretamente, porque, para que o replicaset seja configurado, os processos mongod precisam ser capazes de se conectar uns aos outros para fins de replicação.
Ao usar domínios externos, toda a rede (para replicação e conectividade do MongoDB Agent com o MongoDB ) é roteada por padrão por meio de domínio externo, o que pode não ser eficiente. Uma das maneiras de melhorá-lo é configurar a rede ou a resolução DNS dentro do cluster para que os nomes de host externos dos Pods distribuídos nos mesmos clusters Kubernetes sejam resolvidos para o endereço IP local do cluster dos serviços externos.