Implantando o Elasticsearch na AWS com o Kubernetes em 10 etapas


O Kubernetes aka k8s é um sistema de código aberto para automatizar a implantação, dimensionamento e gerenciamento de aplicativos em contêiner. Neste artigo, mostrarei como configurar um cluster Kubernetes e implantar um cluster Elasticsearch na AWS nele. Essas configurações também funcionam no GCE e no Azure .


Configurando o Kubernetes na AWS


Para começar, obtenha acesso administrativo aos seguintes serviços da AWS: S3, EC2, Route53, IAM e VPC .


1. Instalação: mostrarei a instalação da CLI para Linux. Se você tiver um sistema operacional diferente, siga os links abaixo para obter instruções de instalação do seu sistema operacional.


Primeiro, defina a CLI da AWS para acessar a AWS por meio da CLI. Se você já possui Python e pip, execute o comando:


 pip install awscli --upgrade --user 

Em seguida, usamos o Kops , uma ferramenta de linha de comando que nos conduz pela configuração do cluster no nível de produção K8S.
Instale os binários do Kops diretamente do github.


 wget -O kops https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64 chmod +x ./kops sudo mv ./kops /usr/local/bin/ 

Por fim, usamos o kubectl - CLI para gerenciar o cluster K8S (se você usou o docker, isso é semelhante ao CLI do docker ). A versão mais recente é instalada pelo comando:


 wget -O kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl chmod +x ./kubectl sudo mv ./kubectl /usr/local/bin/kubectl 

Nota: você pode iniciar o cluster Kubernetes e seguir as instruções neste artigo em uma máquina doméstica com o minikube .


2.Crie usuários do IAM: para criar clusters na AWS, criaremos um usuário do IAM separado para o kops . Para o kops precisa de uma conta da API. Crie um usuário e configure uma conta por meio da interface do usuário do console da AWS . O usuário do kops precisará da seguinte permissão do IAM:


  • AmazonEC2FullAccess
  • AmazonRoute53FullAccess
  • AmazonS3FullAccess
  • IAMFullAccess
  • AmazonVPCFullAccess


Como alternativa, você pode fazer o mesmo na CLI aplicando os seguintes comandos:


 aws iam create-group --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/IAMFullAccess --group-name kops aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonVPCFullAccess --group-name kops aws iam create-user --user-name kops aws iam add-user-to-group --user-name kops --group-name kops aws iam create-access-key --user-name kops 

Observe as AccessKeyID e AccessKeyID no kops .


Configure a CLI da AWS para usar sua conta com o aws configure .


Verifique se o usuário que você criou está na aws iam list-users .


Exportamos a conta da AWS como as seguintes variáveis ​​de ambiente para que o CLI kops possa usá-las.


 export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key) 

Se você estiver usando o Kops 1.6.2 ou posterior, a configuração de um DNS é opcional. Você pode criar um cluster de fofocas. O único requisito: o nome do cluster deve terminar em .k8s.local .

Configuração de DNS


Se você já hospedou seu domínio pela AWS e planeja usá-lo, nada precisa ser feito. Outra opção: se você deseja usar um subdomínio do seu domínio, crie uma segunda zona de hospedagem pública para esse subdomínio. Neste manual, trabalharemos com uma zona de hospedagem privada. Defina a zona com qualquer nome. Use esse nome para criar clusters do Kubernetes. Leia mais sobre como configurar o DNS aqui .


3. Criando um depósito S3: para salvar o estado e a aparência do nosso cluster K8S, você precisa criar um depósito S3 separado para kops . Esse bucket se tornará uma fonte de dados confiáveis ​​para o cluster de configuração.


 aws s3api create-bucket \ --bucket <your-unique-bucket-name> \ --region us-east-1 

Nota: se você colocar seu balde em operação em uma área diferente de us-east-1 , além de definir - region alterne para a área desejada e adicione LocationConstraint à mesma área. A seguir, mostra o comando de construção de bucket na região us-west-1 .


 aws s3api create-bucket \ --bucket <your-unique-bucket-name> \ --region us-west-1 \ --create-bucket-configuration LocationConstraint=us-west-1 

Para configurar o armazenamento para versões do bucket do S3 para recuperação, use o seguinte comando:


 aws s3api put-bucket-versioning \ --bucket <your-unique-bucket-name> \ --versioning-configuration Status=Enabled 

4. Criando o primeiro cluster Kubernetes: Então, você está pronto para criar seu primeiro cluster! Primeiro, configure as variáveis ​​de ambiente para simplificar o processo. Se você ignorou a configuração do DNS (após a etapa 2), adicione .k8s.local ao valor NAME .


 export NAME=myfirstcluster.example.com export KOPS_STATE_STORE=s3://your-bucket-name 

Não se esqueça de acompanhar quais zonas regionais estão disponíveis para você. Neste exemplo, implantaremos um cluster na região us-east-2 .


 aws ec2 describe-availability-zones --region us-east-2 

Se você estiver usando uma zona de hospedagem pública, crie um cluster usando o seguinte comando:


 kops create cluster \ --zones us-east-2c \ --node-count 3 \ ${NAME} 

Se você usa uma zona de hospedagem privada, faça:


 kops create cluster \ --zones us-east-2c \ --node-count 3 \ --dns private ${NAME} 

Este comando fornecerá o log de configuração do cluster K8S. Leva tempo para o cluster iniciar, pois cria novas máquinas EC2 para nós principais do minion.


 [ec2-user@ip-172-31-35-145 test]$ kops create cluster \ > --dns private \ > --zones us-east-2c \ > --node-count 3 \ > ${NAME} --yes I0306 09:45:29.636834 20628 create_cluster.go:439] Inferred --cloud=aws from zone "us-east-2c" I0306 09:45:29.637030 20628 create_cluster.go:971] Using SSH public key: /home/ec2-user/.ssh/id_rsa.pub I0306 09:45:29.850021 20628 subnets.go:184] Assigned CIDR 172.20.32.0/19 to subnet us-east-2c I0306 09:45:31.118837 20628 dns.go:92] Private DNS: skipping DNS validation I0306 09:45:46.986963 20628 executor.go:91] Tasks: 73 done / 73 total; 0 can run I0306 09:45:46.987101 20628 dns.go:153] Pre-creating DNS records I0306 09:45:47.668392 20628 update_cluster.go:248] Exporting kubecfg for cluster kops has set your kubectl context to k8s.appbase Cluster is starting. It should be ready in a few minutes. 

Voila! O cluster K8s já deve estar funcionando.


5. Verificação de cluster: todas as instâncias criadas pelo kops estão no ASG (Auto Scaling Groups) . Em caso de falha, as instâncias ASG são verificadas e reconstruídas automaticamente.


Para alterar a configuração do cluster, execute o seguinte comando:


 kops edit cluster ${NAME} 

Cada vez que você altera a configuração do cluster, será necessário criar um cluster executando o seguinte comando:


 kops update cluster ${NAME} --yes 

Você verá algo assim.


 [ec2-user@ip-172-31-35-145 examples]$ kops update cluster --yes Using cluster from kubectl context: k8s.appbase I0216 05:09:06.074467 2158 dns.go:92] Private DNS: skipping DNS validation I0216 05:09:07.699380 2158 executor.go:91] Tasks: 73 done / 73 total; 0 can run I0216 05:09:07.699486 2158 dns.go:153] Pre-creating DNS records I0216 05:09:07.961703 2158 update_cluster.go:248] Exporting kubecfg for cluster kops has set your kubectl context to k8s.appbase Cluster changes have been applied to the cloud. 

Verifique o cluster.


 kops validate cluster 

Verifique se o cluster está funcionando.


 Using cluster from kubectl context: k8s.appbase Validating cluster k8s.appbase INSTANCE GROUPS NAME ROLE MACHINETYPE MIN MAX SUBNETS master-us-east-2c Master t2.large 1 1 us-east-2c nodes Node t2.medium 3 3 us-east-2c NODE STATUS NAME ROLE READY ip-172-20-44-33.us-east-2.compute.internal master True ip-172-20-52-48.us-east-2.compute.internal node True ip-172-20-62-30.us-east-2.compute.internal node True ip-172-20-64-53.us-east-2.compute.internal node True Your cluster k8s.appbase is ready 

Confira seus novos k8s!


Com uma simples chamada para a API do Kubernetes, você pode verificar se a API está online e escutando. Use o kubectl para verificar os nós.


 kubectl get nodes 

Isso fornecerá informações sobre seus nós e seu status atual.


 [ec2-user@ip-172-31-35-145 elasticsearch]$ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-172-20-44-33.us-east-2.compute.internal Ready master 1m v1.8.6 ip-172-20-52-48.us-east-2.compute.internal Ready node 3m v1.8.6 ip-172-20-62-30.us-east-2.compute.internal Ready node 2m v1.8.6 ip-172-20-64-53.us-east-2.compute.internal Ready node 4m v1.8.6 

Uma sub Kubernetes é uma abstração que representa um grupo de um ou mais contêineres de aplicativos (como o Docker) e vários recursos compartilhados para esses contêineres. Sob desdobra-se no nó. Se você precisar dimensionar o aplicativo, adicione nós ao K8S implantado.


Para descobrir os pods disponíveis:


 kubectl get pods 

Este comando listará as lareiras disponíveis no cluster.


 [ec2-user@ip-172-31-35-145 ~]$ kubectl get pods NAME READY STATUS RESTARTS AGE es-5967f5d99c-5vcpb 1/1 Running 0 3h es-5967f5d99c-cqk88 1/1 Running 0 3h es-5967f5d99c-lp789 1/1 Running 0 3h 

Implantação do Elasticsearch no cluster K8S



Se você não conhece o Kubernetes, recomendo o treinamento on-line do k8s .


No momento, criamos no cluster K8S: o nó principal e dois nós do agente. A função do nó principal é transferir comandos de implementação para aplicativos em execução nos pods dos agentes do nó.


As implementações de aplicativos K8S são declarativas e são configuradas por meio de arquivos JSON / YAML. Escolha um controlador com base no tipo de aplicativo ou sistema que você está implantando. Como o Elasticsearch é um aplicativo com estado, usaremos o controlador StatefulSet.


6. Implantação através do StatefulSet. StatefulSet gerencia pods com base na especificação de contêineres idênticos. Ele gerencia a implantação e o dimensionamento do conjunto de fornos e garante a ordem e a exclusividade desses fornos. O controlador StatefulSet também facilita a associação do aplicativo ao volume persistente, o que é importante para o Elasticsearch.


Crie um arquivo chamado es-stateful set. yaml . Ele conterá a especificação Elasticsearch. Sinta-se livre para alterar a configuração. Veja a lista de variáveis ​​de ambiente que podem ser passadas para sua imagem do Elasticsearch aqui .


7. Serviços: Service Kubernetes - uma abstração que define um conjunto lógico de e o acesso a eles. Isso ajuda o aplicativo de contêiner a identificar outro aplicativo de contêiner ou sua própria instância em uma lareira diferente.



LoadBalancer é um tipo especial de serviço que fornece pods para redes externas e distribui a carga. Nós o usaremos para criar um endereço IP externo através do qual qualquer pessoa possa entrar em contato com o cluster Elasticsearch. Usaremos este serviço para nós ES como uma maneira de descobrir um ao outro.


Crie um arquivo chamado es-svc.yaml . Edite-o e especifique o serviço do balanceador de carga.


 apiVersion: v1 #API Version of the resource kind: Service #Type of resource metadata: #Contains metadata of this resource. name: elasticsearch #Name of this resource labels: #Additional identifier to put on pods component: elasticsearch #puts component = elasticsearch spec: #Specifications of this resource type: LoadBalancer #type of service selector: #will distribute load on pods which component: elasticsearch #have label `component = elasticsearch` ports: #Port on which LoadBalancer will listen - name: http #Name given to port port: 9200 #Port number protocol: TCP #Protocol supported - name: transport #Name given to port port: 9300 #Port number protocol: TCP #Protocol supported 

8. Criando um aplicativo: é tudo o que precisamos. Implante nosso cluster Elasticsearch no K8S usando os seguintes comandos.


 kubectl create -f es-statefulset.yaml kubectl create -f es-svc.yaml 

'Criar' é um comando universal para criar qualquer recurso no K8S.


Nosso cluster Elasticsearch de 3 nós (lembre-se de replicas = 3 na configuração StatefulSet?) Será iniciado instantaneamente.


Podemos verificar os pods do Elasticsearch com este comando:


 kubectl get pods 

 [ec2-user@ip-172-31-35-145 test]$ kubectl get pods,svc,deployment NAME READY STATUS RESTARTS AGE es-0 1/1 Running 0 23m es-1 1/1 Running 0 17m es-2 1/1 Running 0 23m 

9. Testando o cluster Elasticsearch: verifique se o Elasticsearch está configurado corretamente e funcionando. Obtenha o endereço IP externo para conectar-se ao Elasticsearch. Ele estará localizado no serviço LoadBalancer que criamos. Use o seguinte comando para descrever o LoadBalancer :


 kubectl describe service elasticsearch 

 [ec2-user@ip-172-31-35-145 examples]$ kubectl describe service elasticsearch Name: elasticsearch Namespace: default Labels: component=elasticsearch Annotations: <none> Selector: component=elasticsearch Type: LoadBalancer IP: 100.70.114.146 LoadBalancer Ingress: http://a4d0c157d212811e898430af47d23da1-952261901.us-east-2.elb.amazonaws.com Port: http 9200/TCP TargetPort: 9200/TCP NodePort: http 31358/TCP Endpoints: 100.96.4.28:9200 Port: transport 9300/TCP TargetPort: 9300/TCP NodePort: transport 31767/TCP Endpoints: 100.96.4.28:9300 Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal EnsuringLoadBalancer 1m service-controller Ensuring load balancer Normal EnsuredLoadBalancer 1m service-controller Ensured load balancer [ec2-user@ip-172-31-35-145 examples]$ 

Observe o valor do LoadBalancer Ingress . Abra um navegador com um número de URI e sufixo da porta externa do Elasticsearch: 9200 . Você verá isso:



Você pode verificar a funcionalidade dos nós do 9200/_cluster /health?pretty adicionando: 9200/_cluster /health?pretty ao endereço IP externo.



10. Teste de recuperação do Kubernetes: StatefulSets tem a capacidade de armazenar o número especificado de réplicas. Dessa forma, se um sub cair, StatefulSet iniciará um novo sub.


Vamos testá-lo simulando uma falha (excluindo todos os pods nos quais nossas instâncias de ES estão em execução) para ver se nosso cluster de ES pode fazer backup automaticamente com dados intactos.



Como o StatefulSet executa uma lareira por vez, leva tempo para restaurar todos os contêineres.


Vemos que, após a recuperação das lareiras, um registro indexado está disponível para nós no estado anterior à falha do ES.


Próximas etapas recomendadas


Antes de usar essas configurações na produção, observe:


  1. Configure backups. Ajuda a recuperar dados perdidos. Esse processo é melhor automatizado.
  2. Configuração de autorização. Queremos proteger o cluster do Elasticsearch. A configuração da autenticação ou autorização básica com base em um token de mídia fornecerá segurança.
  3. Certificados TLS. Configure LetsEncrypt / outros provedores TLS de certificados de mapeamento de domínio pessoal para o cluster ES e proteja todas as solicitações enviadas a ele.

Embora o artigo não seja sobre isso, saiba: o Kubernetes pode fazer tudo isso.


Original: implante o Elasticsearch com Kubernetes na AWS em 10 etapas

Source: https://habr.com/ru/post/pt416643/


All Articles