Kubernetes

Rede pública, DNS externo e operador autônomo do Couchbase

Por que expor o banco de dados do Couchbase na rede pública?

Abaixo estão alguns exemplos:

  • Replicação entre data centers (XDCR) para alta disponibilidade e recuperação de desastres

  • Acesso do SDK do cliente ao cluster do Couchbase

  • Plataformas de banco de dados como serviço (DBaaS)

*Nota - Todos esses casos de uso compartilham um objetivo comum; eles permitem que os clientes acessem a instância do banco de dados sem precisar estabelecer uma VPN para uma instância do Kubernetes. Eles também exigem comunicação segura protegida por TLS, que às vezes é difícil de obter com a arquitetura típica do Kubernetes.

Como resolvemos a questão da rede pública usando o DNS externo do Kubernetes?

Ao implantar aplicativos no Kubernetes, você geralmente usa recursos do Kubernetes, como Service e Ingress, para expor aplicativos fora do cluster do Kubernetes no domínio desejado. Isso envolve muita configuração manual dos recursos do Kubernetes e também dos registros de DNS no seu provedor, o que pode ser um processo demorado e errôneo. Isso logo pode se tornar um obstáculo à medida que seu aplicativo cresce em complexidade e, também, quando o IP externo muda, é necessário atualizar os registros DNS de acordo.

Para resolver isso, a Equipe da rede sig de Kubernetes criou o DNS externo para gerenciar registros de DNS externos de forma autônoma em um cluster do Kubernetes. Depois que você implanta o External DNS, ele funciona em segundo plano e quase não requer configuração adicional. Ele cria registros de DNS em provedores de DNS externos ao Kubernetes, de modo que os recursos do Kubernetes possam ser descobertos por meio dos provedores de DNS externos, e permite controlar os registros de DNS dinamicamente de forma independente do provedor de DNS. Sempre que descobrir que um serviço ou Ingress está sendo criado ou atualizado, o controlador de DNS externo atualizará os registros instantaneamente.

Ao implantar o banco de dados Couchbase usando a rede pública com estratégia de DNS externo para sua arquitetura de rede, os nós do cluster do Couchbase são expostos usando serviços de balanceador de carga que têm endereços IP públicos alocados a eles. O controlador de DNS externo será responsável por gerenciar o DNS dinâmico (DDNS) em um provedor baseado em nuvem para fornecer endereçamento estável e uma base para o TLS.

Agora, vamos ver isso em ação!

Agora, vamos percorrer as etapas para implantar o cluster do Couchbase usando o Autonomous Operator 2.0 no EKS e acessar o cluster do Couchbase por meio de uma rede pública gerenciada pelo DNS externo. Veja abaixo uma visão geral rápida da arquitetura da nossa implantação.

Public Networking with Couchbase Autonomous Operator using Kubernetes External DNS

Rede pública com operador autônomo do Couchbase usando DNS externo do Kubernetes

Pré-requisitos

Antes de começarmos, há alguns pré-requisitos importantes abaixo.

  1. Instalação e configuração kubectl em seu computador local - o kubectl é uma interface de linha de comando para executar comandos em clusters do Kubernetes. 
  2. Instale a versão mais recente CLI DO AWS - A CLI da AWS é uma ferramenta unificada que permite interagir com os serviços da AWS usando comandos em seu shell de linha de comando. Neste caso, usaremos a CLI da AWS para nos comunicarmos de forma segura com o cluster do Kubernetes em execução na AWS.
  3. Implante o cluster EKS. O Grupo EKS pode ser implantado usando o Console AWS ou eksctl. Neste artigo, estaremos implantando o cluster EKS no us-east-1 com 3 nós de trabalho em três zonas de disponibilidade, conforme mencionado abaixo.
$ eksctl create cluster \
--name cb-op2-edns \
--region us-east-1 \
--zones us-east-1a,us-east-1b,us-east-1c \
--nodegroup-name eks-workers \
--node-type m4.xlarge \
--nodes 3 \
--nodes-min 3 \
--nodes-max 6 \
--node-ami auto

4. Você precisará de um domínio DNS público. O domínio pode ser adquirido de um registrador, como GoDaddy, AWS Route 53, Namecheapetc. Para este artigo, estou usando meu próprio domínio registrado (GoDaddy) balajiacloud.guru e eu sugeriria que você obtivesse o seu antes de continuar.

5. Por fim, você precisará de um provedor de DNS externo. Durante o ciclo de vida de um cluster do Couchbase, os nós podem ser adicionados e removidos para dimensionamento do cluster, atualizações ou recuperação de falhas. Em cada instância, novos nomes DNS precisam ser criados para quaisquer novos pods do Couchbase que forem criados ou nomes DNS removidos de pods que forem excluídos. O provedor de DDNS expõe uma API REST que permite que o controlador de DNS externo no Kubernetes sincronize a aparência do cluster do Couchbase com o DNS público. 

Aqui está a lista de todos os documentos e conhecidos DNS externo para a plataforma Kubernetes. Neste artigo, usaremos Cloudflare como nosso provedor de DNS externo. Se você planeja usar a Cloudflare como seu provedor de DNS externo, precisará criar uma conta na Cloudflare e adicionar o domínio DNS à conta.

Couchbase Autonomous Operator using Kubernetes External DNS

Criação de certificados TLS

O Operador garante que você configure seus clusters do Couchbase com segurança. Se o Operator detectar que um cluster está sendo exposto na Internet pública, ele aplicará a criptografia TLS. 

Antes de gerarmos certificados TLS, precisamos determinar em qual domínio DNS o cluster do Couchbase estará. Podemos usar nosso balajiacloud.guru diretamente, mas, nesse caso, ele só poderá ser usado por um único cluster do Couchbase. Portanto, usaremos um subdomínio chamado cbdemo.balajiacloud.guru como um namespace exclusivo para o nosso cluster. Em geral, um nome DNS curinga (*.cbdemo.balajiacloud.guru) tratará todos os nomes DNS públicos gerados pelo Operador. Isso precisa ser adicionado ao certificado do cluster do Couchbase.

Usaremos o EasyRSA para criar os certificados TLS. O EasyRSA do OpenVPN torna a operação de uma infraestrutura de chave pública (PKI) relativamente simples e é o método recomendado para começar a funcionar rapidamente.

1. Vamos criar um diretório chamado tls e clonar o repositório do EasyRSA.

$ git clone https://github.com/OpenVPN/easy-rsa
Cloning into 'easy-rsa'...
remote: Enumerating objects: 26, done.
remote: Counting objects: 100% (26/26), done.
remote: Compressing objects: 100% (20/20), done.
remote: Total 1979 (delta 9), reused 19 (delta 6), pack-reused 1953
Receiving objects: 100% (1979/1979), 5.75 MiB | 1.92 MiB/s, done.
Resolving deltas: 100% (859/859), done.

2. Inicialize e crie o certificado/chave da CA. Você será solicitado a fornecer uma senha de chave privada e o nome comum (CN) da CA, algo como Couchbase CA é suficiente. O certificado CA estará disponível como pki/ca.crt.

$ cd easy-rsa/easyrsa3
$ ./easyrsa init-pki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /Users/balajinarayanan/k8s/couchbase/operator/tls/easy-rsa/easyrsa3/pki

$ ./easyrsa build-ca
Using SSL: openssl LibreSSL 2.8.3

Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Generating RSA private key, 2048 bit long modulus
..........................................+++
................................................................+++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:Couchbase CA

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/Users/balajinarayanan/k8s/couchbase/operator/tls/easy-rsa/easyrsa3/pki/ca.crt

3. Crie o certificado do servidor de cluster do Couchbase.

Você precisa criar um certificado curinga de servidor e uma chave a ser usada nos pods do Couchbase Server. Neste artigo, usaremos o comando abaixo para gerar um certificado para o cluster do Couchbase cbopedns no demonstração e usando o namespace cbdemo.balajiacloud.guru subdomínio.

$ ./easyrsa --subject-alt-name="DNS:*.cbopedns,DNS:*.cbopedns.demo,DNS:*.cbopedns.demo.svc,DNS:*.demo.svc,DNS:cbopedns-srv,DNS:cbopedns-srv.demo,DNS:cbopedns-srv.demo.svc,DNS:localhost,DNS:*.cbopedns.cbdemo.balajiacloud.guru,DNS:*.cbdemo.balajiacloud.guru" build-server-full couchbase-server nopass
Using SSL: openssl LibreSSL 2.8.3
Generating a 2048 bit RSA private key
..............................+++
.......................................................+++
writing new private key to '/Users/balajinarayanan/k8s/couchbase/operator/tls/easy-rsa/easyrsa3/pki/easy-rsa-10086.2Q0Q2S/tmp.emWXHL'
-----
Using configuration from /Users/balajinarayanan/k8s/couchbase/operator/tls/easy-rsa/easyrsa3/pki/easy-rsa-10086.2Q0Q2S/tmp.Phz9Az
Enter pass phrase for /Users/balajinarayanan/k8s/couchbase/operator/tls/easy-rsa/easyrsa3/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'couchbase-server'
Certificate is to be certified until Aug  5 17:44:19 2022 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Observação: as chaves protegidas por senha não são compatíveis com o Couchbase Server ou com o Operator.

O par chave/certificado pode ser encontrado em pki/private/couchbase-server.keypki/issued/couchbase-server.crt e usado como pkey.key e chain.pemrespectivamente, no spec.networking.tls.static.serverSecret parâmetro de agrupamento.

4. Formatação da chave privada - Devido a uma limitação Com o tratamento de chaves privadas do Couchbase Server, as chaves do servidor precisam ser formatadas como PKCS#1.

Primeiro, vamos copiar os arquivos .key e .pem para o diretório tls para facilitar o acesso.

$ cp easy-rsa/easyrsa3/pki/private/couchbase-server.key pkey.key

$ cp easy-rsa/easyrsa3/pki/issued/couchbase-server.crt chain.pem

$ cp easy-rsa/easyrsa3/pki/ca.crt ca.crt

Agora, vamos formatar as chaves do servidor.

$ openssl rsa -in pkey.key -out pkey.key.der -outform DER
writing RSA key
$ openssl rsa -in pkey.key.der -inform DER -out pkey.key -outform PEM
writing RSA key

Usaremos essas chaves para criar o segredo do servidor do cluster do Couchbase.

Implantar o Couchbase Autonomous Operator 2.0 (mais recente)

O Couchbase Autonomous Operator for Kubernetes permite a portabilidade da nuvem e automatiza as práticas recomendadas operacionais para implantar e gerenciar o Couchbase.

O operador é composto de dois componentes: um controlador de admissão dinâmica (DAC) por cluster e um operador por espaço de nome. Consulte o arquitetura da operadora para obter informações adicionais sobre o que é necessário e considerações de segurança.

1. Faça o download do pacote Operator

Você pode fazer o download da versão mais recente Operador autônomo do Couchbase e descompacte-o no computador local. O pacote Operator contém arquivos de configuração YAML e ferramentas de linha de comando que você usará para instalar o Operator.

2. Instale a definição de recursos personalizados (CRD)

A primeira etapa da instalação do Operator é instalar as definições de recursos personalizados (CRD) que descrevem os tipos de recursos do Couchbase. Isso pode ser feito executando o comando abaixo no diretório do pacote Operator:

$ kubectl create -f crd.yaml

customresourcedefinition.apiextensions.k8s.io/couchbasebuckets.couchbase.com created
customresourcedefinition.apiextensions.k8s.io/couchbaseephemeralbuckets.couchbase.com created
customresourcedefinition.apiextensions.k8s.io/couchbasememcachedbuckets.couchbase.com created
customresourcedefinition.apiextensions.k8s.io/couchbasereplications.couchbase.com created
customresourcedefinition.apiextensions.k8s.io/couchbaseusers.couchbase.com created
customresourcedefinition.apiextensions.k8s.io/couchbasegroups.couchbase.com created
customresourcedefinition.apiextensions.k8s.io/couchbaserolebindings.couchbase.com created
customresourcedefinition.apiextensions.k8s.io/couchbaseclusters.couchbase.com created
customresourcedefinition.apiextensions.k8s.io/couchbasebackups.couchbase.com created
customresourcedefinition.apiextensions.k8s.io/couchbasebackuprestores.couchbase.com created

3. Instale o Dynamic Admission Controller (DAC)

O DAC permite que os recursos personalizados sejam modificados e interrogados antes que um recurso seja aceito e comprometido com etcd. A execução do DAC nos permite adicionar padrões sensatos às configurações do cluster do Couchbase, minimizando assim o tamanho das especificações. Ele também nos permite manter a compatibilidade com versões anteriores quando novos atributos são adicionados e precisam ser preenchidos. Isso torna a experiência de uso dos recursos do Couchbase semelhante à dos tipos de recursos nativos.

Agora, vamos instalar o Dynamic Admission Controller.

Abra uma janela do Terminal e vá para o diretório onde você descompactou o pacote Operator e cd para a pasta bin. Execute o seguinte comando para instalar o DAC no diretório padrão namespace.

$ ./cbopcfg --no-operator --namespace default | kubectl create -n default -f -

serviceaccount/couchbase-operator-admission created
clusterrole.rbac.authorization.k8s.io/couchbase-operator-admission created
clusterrolebinding.rbac.authorization.k8s.io/couchbase-operator-admission created
secret/couchbase-operator-admission created
deployment.apps/couchbase-operator-admission created
service/couchbase-operator-admission created
mutatingwebhookconfiguration.admissionregistration.k8s.io/couchbase-operator-admission created
validatingwebhookconfiguration.admissionregistration.k8s.io/couchbase-operator-admission created

Confirme se o controlador de admissão foi implantado com êxito.

$ kubectl get deployments

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
couchbase-operator-admission   1/1     1            1           70s

4. Criar um espaço de nome

Os namespaces são uma forma de alocar recursos de cluster, além de definir políticas de rede e segurança entre vários aplicativos. Criaremos um namespace exclusivo chamado demonstração para implantar o Operator e, posteriormente, usará o namespace de demonstração para implantar o cluster do Couchbase.

Execute o seguinte comando para criar o namespace.

$ kubectl create namespace demo

namespace/demo created

Confirme se o Namespace foi criado com sucesso.

$ kubectl get namespaces

NAME              STATUS   AGE
default           Active   37m
demo              Active   39s
kube-node-lease   Active   37m
kube-public       Active   37m
kube-system       Active   37m

5. Configurar o TLS

Os segredos são especificados no recurso CouchbaseCluster, e você perceberá isso no YAML de definição do cluster enquanto implantamos o cluster do Couchbase.

Segredo do servidor

Os segredos do servidor precisam ser montados como um volume dentro do pod do Couchbase Server com nomes específicos. A cadeia de certificados deve ter o nome chain.pem e a chave privada como pkey.key. Execute o comando abaixo para criar o segredo do servidor Couchbase.

$ kubectl create secret generic couchbase-server-tls -n demo --from-file tls/chain.pem --from-file tls/pkey.key

secret/couchbase-server-tls created
Segredo do operador

Os segredos do cliente Operator são lidos diretamente da API. Ele espera que apenas um único valor esteja presente; ca.crt é a CA de nível superior que é usada para autenticar todas as cadeias de certificados de servidores TLS. Execute o comando abaixo para criar o segredo do operador.

$ kubectl create secret generic couchbase-operator-tls -n demo --from-file tls/ca.crt

secret/couchbase-operator-tls created

6. Instalar o operador do Couchbase

Agora, vamos implementar o Operator no demonstração executando o seguinte comando, na pasta bin do diretório do pacote Operator.

$ ./cbopcfg --no-admission --namespace demo | kubectl create -n demo -f -

serviceaccount/couchbase-operator created
role.rbac.authorization.k8s.io/couchbase-operator created
rolebinding.rbac.authorization.k8s.io/couchbase-operator created
deployment.apps/couchbase-operator created
service/couchbase-operator created

A execução do comando acima faz o download da imagem do Operator Docker e cria um arquivo implantaçãoque gerencia uma única instância do Operator. O pod do Operator é executado como implantação para que o Kubernetes possa reinicializar em caso de falha.

Depois de executar o kubectl create geralmente leva menos de um minuto para o Kubernetes implantar o Operator e para que ele esteja pronto para ser executado.

Verificar o status da implantação do operador

Você pode usar o seguinte comando para verificar o status da implantação:

$ kubectl get deployments -n demo

NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
couchbase-operator   1/1     1            1           97s

Se você executar esse comando imediatamente após a implantação do Operator, a saída terá o formato DISPONÍVEL No entanto, o campo AVAILABLE indica que o pod ainda não está pronto, pois seu valor é 0 e não 1.

Execute o seguinte comando para verificar se o pod do Operator foi iniciado com êxito. Se o Operator estiver em funcionamento, o comando retornará uma saída em que o PRONTO shows de campo 1/1como, por exemplo:

$ kubectl get pods -l app=couchbase-operator -n demo

NAME                                  READY   STATUS    RESTARTS   AGE
couchbase-operator-7f799565f8-c29ts   1/1     Running   0          2m47s

Você também pode verificar os registros para confirmar que o Operator está ativo e em execução, executando o comando abaixo.

$ kubectl logs -f couchbase-operator-7f799565f8-c29ts -n demo

{"level":"info","ts":1588493860.1096337,"logger":"main","msg":"couchbase-operator","version":"2.0.0 (build 317)","revision":"release"}
{"level":"info","ts":1588493860.1100397,"logger":"leader","msg":"Trying to become the leader."}
{"level":"info","ts":1588493860.1653795,"logger":"leader","msg":"No pre-existing lock was found."}
{"level":"info","ts":1588493860.1700613,"logger":"leader","msg":"Became the leader."}
{"level":"info","ts":1588493860.2087,"logger":"kubebuilder.controller","msg":"Starting EventSource","controller":"couchbase-controller","source":"kind source: /, Kind="}
{"level":"info","ts":1588493860.3104734,"logger":"kubebuilder.controller","msg":"Starting Controller","controller":"couchbase-controller"}
{"level":"info","ts":1588493860.4107096,"logger":"kubebuilder.controller","msg":"Starting workers","controller":"couchbase-controller","worker count":4}

Implantar o DNS externo

Supondo que você já tenha concluído as etapas acima para implantar o Operator em um namespace, o demonstração a próxima coisa que você precisa instalar é o controlador de DNS externo. Ele deve ser instalado antes do cluster do Couchbase, pois o Operator aguardará a propagação do DNS antes de criar os pods do Couchbase Server. Isso ocorre porque os clientes devem ser capazes de alcançar os pods do Couchbase Server para atender ao tráfego e evitar erros de aplicativos.

1. Crie uma conta de serviço para o controlador de DNS externo no namespace em que você está instalando o Operator.

$ kubectl --namespace demo create serviceaccount external-dns

serviceaccount/external-dns created

2. O controlador de DNS externo requer uma função para que possa pesquisar recursos e procurar registros de DNS para replicar no provedor de DDNS. 

$ kubectl --namespace demo create -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: external-dns
rules:
- apiGroups: [""]
  resources: ["services","endpoints","pods"]
  verbs: ["get","watch","list"]
- apiGroups: ["extensions"]
  resources: ["ingresses"]
  verbs: ["get","watch","list"]
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get","watch","list"]
EOF

clusterrole.rbac.authorization.k8s.io/external-dns created

3. Agora, vincule a função de DNS externo à conta de serviço.

$ kubectl --namespace demo create -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: external-dns
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: external-dns
subjects:
- kind: ServiceAccount
  name: external-dns
  namespace: demo
EOF

clusterrolebinding.rbac.authorization.k8s.io/external-dns created

4. A última etapa é a implementação do DNS externo. Não se esqueça de atualizar os valores abaixo específicos para sua implementação.

    • O spec.template.spec.serviceAccountName garante que os pods de DNS externo estejam sendo executados como a conta de serviço que configuramos. Isso concede ao controlador permissão para pesquisar recursos e procurar solicitações de DDNS.
    • O -filtro de domínio O argumento diz ao External DNS para considerar apenas as entradas de DDNS que estão associadas às entradas de DNS relacionadas ao nosso balajiacloud.guru domínio.
    • O -txt-owner-id informa ao External DNS para rotular os registros de gerenciamento TXT com uma cadeia de caracteres exclusiva da instância do External DNS. O External DNS usa registros TXT para registrar metadados, especialmente informações de propriedade associadas aos registros DNS que está gerenciando. Se o registro balajiacloud.guru for usado por várias instâncias do DNS externo sem especificar nenhuma propriedade, elas entrarão em conflito umas com as outras.
    • O CF_API_KEY é usada pelo provedor da Cloudflare para autenticação na API da Cloudflare.
    • O CF_API_EMAIL é usada pelo provedor da Cloudflare para identificar a conta a ser usada na API da Cloudflare.

Você pode obter o CF_API_KEY na página de visão geral da conta do Cloudfare. Clique no link "Get your API token" (Obtenha seu token de API), conforme mostrado abaixo, e veja o Chave de API global.

External DNS provider

Implantar o DNS externo

Por fim, instale a implementação do DNS externo executando o comando abaixo.

$ kubectl --namespace demo create -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: external-dns
spec:
  selector:
    matchLabels:
      app: external-dns
  template:
    metadata:
      labels:
        app: external-dns
    spec:
      serviceAccountName: external-dns
      containers:
      - name: external-dns
        image: registry.opensource.zalan.do/teapot/external-dns:latest
        args:
        - --source=service
        - --domain-filter=balajiacloud.guru
        - --provider=cloudflare
        - --txt-owner-id=cbop-edns-demo
        env:
          - name: CF_API_KEY
            value: YOUR_CF_API_KEY
          - name: CF_API_EMAIL
            value: YOUR_CF_API_EMAIL
EOF

deployment.apps/external-dns created
Verifique o status da implantação do DNS externo

Você pode usar o seguinte comando para verificar o status da implantação:

$ kubectl get deployments -n demo

NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
couchbase-operator   1/1     1            1           10m
external-dns         1/1     1            1           21s

Execute o seguinte comando para verificar se o external-dns foi iniciado com êxito. Se o external-dns estiver funcionando, o comando retornará uma saída em que o CORRIDA shows de campo 1/1como, por exemplo:

$ kubectl get pods -n demo

NAME                                  READY   STATUS    RESTARTS   AGE
couchbase-operator-7f799565f8-c29ts   1/1     Running   0          11m
external-dns-6f74575d54-fp2wh         1/1     Running   0          59s

Você também pode verificar os registros para confirmar se o external-dns está em funcionamento.

$ kubectl logs -f external-dns-6f74575d54-fp2wh -n demo

time="2020-05-03T08:27:44Z" level=info msg="config: {Master: KubeConfig: RequestTimeout:30s IstioIngressGatewayServices:[] ContourLoadBalancerService:heptio-contour/contour SkipperRouteGroupVersion:zalando.org/v1 Sources:[service] Namespace: AnnotationFilter: FQDNTemplate: CombineFQDNAndAnnotation:false IgnoreHostnameAnnotation:false Compatibility: PublishInternal:false PublishHostIP:false AlwaysPublishNotReadyAddresses:false ConnectorSourceServer:localhost:8080 Provider:cloudflare GoogleProject: GoogleBatchChangeSize:1000 GoogleBatchChangeInterval:1s DomainFilter:[balajiacloud.guru] ExcludeDomains:[] ZoneIDFilter:[] AlibabaCloudConfigFile:/etc/kubernetes/alibaba-cloud.json AlibabaCloudZoneType: AWSZoneType: AWSZoneTagFilter:[] AWSAssumeRole: AWSBatchChangeSize:1000 AWSBatchChangeInterval:1s AWSEvaluateTargetHealth:true AWSAPIRetries:3 AWSPreferCNAME:false AzureConfigFile:/etc/kubernetes/azure.json AzureResourceGroup: AzureSubscriptionID: AzureUserAssignedIdentityClientID: CloudflareProxied:false CloudflareZonesPerPage:50 CoreDNSPrefix:/skydns/ RcodezeroTXTEncrypt:false AkamaiServiceConsumerDomain: AkamaiClientToken: AkamaiClientSecret: AkamaiAccessToken: InfobloxGridHost: InfobloxWapiPort:443 InfobloxWapiUsername:admin InfobloxWapiPassword: InfobloxWapiVersion:2.3.1 InfobloxSSLVerify:true InfobloxView: InfobloxMaxResults:0 DynCustomerName: DynUsername: DynPassword: DynMinTTLSeconds:0 OCIConfigFile:/etc/kubernetes/oci.yaml InMemoryZones:[] OVHEndpoint:ovh-eu PDNSServer:https://localhost:8081 PDNSAPIKey: PDNSTLSEnabled:false TLSCA: TLSClientCert: TLSClientCertKey: Policy:sync Registry:txt TXTOwnerID:cbop-edns-demo TXTPrefix: Interval:1m0s Once:false DryRun:false UpdateEvents:false LogFormat:text MetricsAddress::7979 LogLevel:info TXTCacheInterval:0s ExoscaleEndpoint:https://api.exoscale.ch/dns ExoscaleAPIKey: ExoscaleAPISecret: CRDSourceAPIVersion:externaldns.k8s.io/v1alpha1 CRDSourceKind:DNSEndpoint ServiceTypeFilter:[] CFAPIEndpoint: CFUsername: CFPassword: RFC2136Host: RFC2136Port:0 RFC2136Zone: RFC2136Insecure:false RFC2136TSIGKeyName: RFC2136TSIGSecret: RFC2136TSIGSecretAlg: RFC2136TAXFR:false RFC2136MinTTL:0s NS1Endpoint: NS1IgnoreSSL:false TransIPAccountName: TransIPPrivateKeyFile:}"
time="2020-05-03T08:27:44Z" level=info msg="Instantiating new Kubernetes client"
time="2020-05-03T08:27:44Z" level=info msg="Using inCluster-config based on serviceaccount-token"
time="2020-05-03T08:27:44Z" level=info msg="Created Kubernetes client https://10.100.0.1:443"

Agora, implementamos com êxito o DNS externo.

Implantar o cluster do Couchbase

Agora que implantamos o operador autônomo do Couchbase e o DNS externo no EKS, vamos implantar o cluster do Couchbase.

Implantaremos o cluster do Couchbase com 3 nós de dados em 3 zonas de disponibilidade com os parâmetros mínimos de configuração necessários. Consulte a seção Configurar a rede pública para as opções de configuração necessárias. 

Criar o segredo para o console de administração do Couchbase

Vamos criar uma credencial secreta que será usada pelo console administrativo da Web durante o login. Quando você cria o segredo abaixo em seu cluster do Kubernetes, o segredo define o nome de usuário como Administrador e a senha para senha.

$ kubectl --namespace demo create -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: cb-example-auth
type: Opaque
data:
  username: QWRtaW5pc3RyYXRvcg== # Administrator
  password: cGFzc3dvcmQ=         # password
EOF

secret/cbopedns-auth created

Implantar a definição do cluster do Couchbase

Usaremos o padrão Classe de armazenamento que obtemos com o EKS, vamos verificar executando o seguinte comando. Você pode criar uma classe de armazenamento que atenda a seus requisitos.

$ kubectl get sc

NAME            PROVISIONER             AGE
gp2 (default)   kubernetes.io/aws-ebs   67m

Para implantar um cluster do Couchbase Server usando o Operator, tudo o que você precisa fazer é criar uma definição de cluster do Couchbase que descreva como você deseja que o cluster seja (por exemplo, o número de nós, tipos de serviços, recursos do sistema etc.) e, em seguida, enviar essa definição de cluster para o Kubernetes. 

O pacote Operator contém um exemplo de arquivo de definição do CouchbaseCluster (couchbase-cluster.yaml).

A definição de cluster abaixo implantará o cluster do Couchbase com 3 pods de dados em 3 zonas diferentes usando volumes persistentes. Verifique a Recurso de cluster do Couchbase para obter a lista completa da configuração do cluster.

$ kubectl --namespace demo create -f - <<EOF
apiVersion: couchbase.com/v2
kind: CouchbaseBucket
metadata:
  name: default
---
apiVersion: couchbase.com/v2
kind: CouchbaseCluster
metadata:
  name: cbopedns
spec:
  image: couchbase/server:6.5.0
  networking:
    tls:
      static:
        serverSecret: couchbase-server-tls
        operatorSecret: couchbase-operator-tls
    exposeAdminConsole: true
    adminConsoleServiceType: LoadBalancer
    exposedFeatures:
      - xdcr
      - client
    exposedFeatureServiceType: LoadBalancer
    dns:
      domain: cbdemo.balajiacloud.guru
  disableBucketManagement: false
  cluster:
    clusterName: cbopedns
    dataServiceMemoryQuota: 2048Mi
  security:
    adminSecret: cbopedns-auth
  servers:
    - name: data-east-1a
      size: 1
      services:
        - data
      serverGroups:
        - us-east-1a
      pod:
        volumeMounts:
          default: pvc-default    # /opt/couchbase/var/lib/couchbase
          data: pvc-data    # /mnt/data
    - name: data-east-1b
      size: 1
      services:
        - data
      serverGroups:
        - us-east-1b
      pod:
        volumeMounts:
          default: pvc-default
          data: pvc-data
    - name: data-east-1c
      size: 1
      services:
        - data
      serverGroups:
        - us-east-1c
      pod:
        volumeMounts:
          default: pvc-default
          data: pvc-data
  volumeClaimTemplates:
    - metadata:
        name: pvc-default
      spec:
        storageClassName: gp2
        resources:
          requests:
            storage: 1Gi
    - metadata:
        name: pvc-data
      spec:
        storageClassName: gp2
        resources:
          requests:
            storage: 5Gi
EOF

couchbasebucket.couchbase.com/default created
couchbasecluster.couchbase.com/cbopedns created

Após receber a configuração, o Operador começa automaticamente a criar o cluster. O tempo necessário para criar o cluster depende da configuração. Você pode acompanhar o progresso da criação do cluster usando a função status do cluster.

Verificação da implantação

Para verificar o progresso, execute o comando abaixo, que observará (argumento -w) o progresso da criação dos pods. Se tudo correr bem, teremos três pods do cluster do Couchbase hospedando os serviços de acordo com a definição do cluster do Couchbase.

kubectl get pods --namespace demo -w

cbopedns-0000                         1/1     Running   0          9m15s
cbopedns-0001                         1/1     Running   0          8m34s
cbopedns-0002                         1/1     Running   0          8m
couchbase-operator-7f799565f8-c29ts   1/1     Running   1          36m
external-dns-6f74575d54-fp2wh         1/1     Running   0          26m

Se, por algum motivo, houver uma exceção, você poderá encontrar os detalhes da exceção no arquivo de log do couchbase-operator. Para exibir as últimas 20 linhas do registro, copie o nome do pod do Operator e execute o comando abaixo, substituindo o nome do pod do Operator pelo nome do seu ambiente.

$ kubectl logs couchbase-operator-7f799565f8-c29ts -n demo --tail 20

{"level":"info","ts":1588495709.7896624,"logger":"cluster","msg":"Watching new cluster","cluster":"demo/cbopedns"}
{"level":"info","ts":1588495709.7898946,"logger":"cluster","msg":"Janitor starting","cluster":"demo/cbopedns"}
{"level":"info","ts":1588495709.7987065,"logger":"cluster","msg":"Couchbase client starting","cluster":"demo/cbopedns"}
{"level":"info","ts":1588495709.818881,"logger":"cluster","msg":"Cluster already exists, the operator will now manage it","cluster":"demo/cbopedns"}
{"level":"info","ts":1588495709.8903878,"logger":"cluster","msg":"Running","cluster":"demo/cbopedns"}
{"level":"info","ts":1588495710.0405645,"logger":"couchbaseutil","msg":"Cluster status","cluster":"demo/cbopedns","balance":"unbalanced","rebalancing":false}
{"level":"info","ts":1588495710.0406282,"logger":"couchbaseutil","msg":"Node status","cluster":"demo/cbopedns","name":"cbopedns-0000","version":"6.5.0","class":"data-east-1a","managed":true,"status":"active"}
{"level":"info","ts":1588495710.0406532,"logger":"couchbaseutil","msg":"Node status","cluster":"demo/cbopedns","name":"cbopedns-0001","version":"6.5.0","class":"data-east-1b","managed":true,"status":"pending_add"}
{"level":"info","ts":1588495710.040662,"logger":"couchbaseutil","msg":"Node status","cluster":"demo/cbopedns","name":"cbopedns-0002","version":"6.5.0","class":"data-east-1c","managed":true,"status":"pending_add"}
{"level":"info","ts":1588495710.0406775,"logger":"scheduler","msg":"Scheduler status","cluster":"demo/cbopedns","name":"cbopedns-0000","class":"data-east-1a","group":"us-east-1a"}
{"level":"info","ts":1588495710.0406868,"logger":"scheduler","msg":"Scheduler status","cluster":"demo/cbopedns","name":"cbopedns-0001","class":"data-east-1b","group":"us-east-1b"}
{"level":"info","ts":1588495710.040695,"logger":"scheduler","msg":"Scheduler status","cluster":"demo/cbopedns","name":"cbopedns-0002","class":"data-east-1c","group":"us-east-1c"}
{"level":"info","ts":1588495755.230221,"logger":"couchbaseutil","msg":"Rebalancing","cluster":"demo/cbopedns","progress":0}
{"level":"info","ts":1588495759.2380211,"logger":"cluster","msg":"Rebalance completed successfully","cluster":"demo/cbopedns"}
{"level":"info","ts":1588495759.286947,"logger":"cluster","msg":"Reconcile completed","cluster":"demo/cbopedns"}

Vamos verificar os logs external-dns para ver se os registros DNS para os pods do Couchbase estão sendo criados.

$ kubectl logs -f external-dns-6f74575d54-fp2wh -n demo

time="2020-05-03T08:46:46Z" level=info msg="Changing record." action=CREATE record=cbopedns-0000.cbdemo.balajiacloud.guru targets=1 ttl=1 type=CNAME zone=c3b835b8ec89e43a2492b62d5d82cc86
time="2020-05-03T08:46:46Z" level=info msg="Changing record." action=CREATE record=cbopedns-0002.cbdemo.balajiacloud.guru targets=1 ttl=1 type=CNAME zone=c3b835b8ec89e43a2492b62d5d82cc86
time="2020-05-03T08:46:47Z" level=info msg="Changing record." action=CREATE record=cbopedns-0001.cbdemo.balajiacloud.guru targets=1 ttl=1 type=CNAME zone=c3b835b8ec89e43a2492b62d5d82cc86
time="2020-05-03T08:46:47Z" level=info msg="Changing record." action=CREATE record=cbopedns-0000.cbdemo.balajiacloud.guru targets=1 ttl=1 type=TXT zone=c3b835b8ec89e43a2492b62d5d82cc86
time="2020-05-03T08:46:47Z" level=info msg="Changing record." action=CREATE record=cbopedns-0002.cbdemo.balajiacloud.guru targets=1 ttl=1 type=TXT zone=c3b835b8ec89e43a2492b62d5d82cc86
time="2020-05-03T08:46:47Z" level=info msg="Changing record." action=CREATE record=cbopedns-0001.cbdemo.balajiacloud.guru targets=1 ttl=1 type=TXT zone=c3b835b8ec89e43a2492b62d5d82cc86

Nesse momento, você também pode verificar a página DNS fazendo login na sua conta Cloudfare conta. Você pode ver os registros CNAME e TXT adicionados pelo seu provedor de DNS externo.

External DNS provider

Acesso ao console da Web do Couchbase

Agora, você tem um cluster endereçável publicamente e pode começar a usá-lo. No ambiente EKS, o console da Web do Couchbase pode ser acessado por meio de um serviço LoadBalancer exposto de um pod específico. Você deve ser capaz de se conectar ao console do Couchbase usando o URL https://cbopedns-0000.cbdemo.balajiacloud.guru:18091/ (substitua o nome do pod e o domínio DNS com base no seu ambiente).

Consulte Acessar a interface do usuário do Couchbase Server para obter mais detalhes sobre como se conectar ao console do Couchbase. Além disso, você pode verificar Configurar SDKs de cliente para obter detalhes sobre como conectar o SDK do cliente ao cluster do Couchbase ao usar o endereçamento baseado em DNS com DNS externo.

Publicly addressable Couchbase cluster

Conclusão

Neste blog, vimos como o cluster do Couchbase pode ser endereçado publicamente usando o Couchbase Operator com o DNS externo do Kubernetes. Discutimos como a solução de DNS externo ajuda a gerenciar dinamicamente os registros de DNS externo de dentro de um cluster do Kubernetes. Neste artigo, usamos o Amazon EKS como nosso ambiente do Kubernetes, mas as mesmas etapas também serão aplicáveis se você estiver usando outros ambientes do Kubernetes, como AKS, GKE, OpenShift etc.

Recursos

 

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Balaji Narayanan, arquiteto de soluções, Couchbase

Balaji Narayanan is a Solutions Architect in the CoE team at Couchbase. He has deep expertise in Enterprise Application Design, Development, and Implementation using Java/Java EE technologies and Cloud platforms. He has extensive experience developing solutions architecture and designing solutions to implement Cloud architecture using AWS, Azure, GCP Cloud platforms. He has expertise in designing and evaluating architectural alternatives for private, public, and hybrid cloud models. He is a certified professional in AWS and Kubernetes. Prior to joining Couchbase, Balaji was engaged with Microsoft building IaaS and PaaS platforms for Azure Cloud-native services. He holds a Bachelor's degree in Information Technology from Anna University (India).

Um comentário

  1. Obrigado, Balaji. Isso é útil.

    É necessário registrar um novo domínio DNS público? Quero dizer, um domínio aws (por exemplo, ap-south-1.elb.amazonaws.com) não pode ser usado, talvez com um subdomínio?

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.