Implementaci贸n de Elasticsearch en AWS con Kubernetes en 10 pasos


Kubernetes, tambi茅n conocido como k8s es un sistema de c贸digo abierto para automatizar la implementaci贸n, el escalado y la administraci贸n de aplicaciones en contenedores. En este art铆culo, le mostrar茅 c贸mo configurar un cl煤ster de Kubernetes e implementar un cl煤ster Elasticsearch en AWS en 茅l. Esta configuraci贸n tambi茅n funciona en GCE y Azure .


Configurar Kubernetes en AWS


Para comenzar, obtenga acceso administrativo a los siguientes servicios de AWS: S3, EC2, Route53, IAM y VPC .


1. Instalaci贸n: mostrar茅 la instalaci贸n de la CLI para Linux. Si tiene un sistema operativo diferente, siga los enlaces a continuaci贸n para obtener instrucciones de instalaci贸n para su sistema operativo.


Primero, configure la AWS CLI para acceder a AWS a trav茅s de la CLI. Si ya tiene Python y pip, ejecute el comando:


 pip install awscli --upgrade --user 

Luego usamos Kops , una herramienta de l铆nea de comandos que nos lleva a trav茅s de la configuraci贸n del cl煤ster de nivel de producci贸n K8S.
Instale los binarios de Kops directamente desde 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/ 

Finalmente, usamos el kubectl - CLI para administrar el cl煤ster K8S (si us贸 docker, esto es similar a la CLI de docker ). La 煤ltima versi贸n se instala mediante el 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: puede iniciar el cl煤ster de Kubernetes y seguir las instrucciones de este art铆culo en una m谩quina dom茅stica con minikube .


2.Cree usuarios de IAM: para crear cl煤steres en AWS, crearemos un usuario de IAM separado para kops . Para kops necesitas una cuenta API. Cree un usuario y configure una cuenta a trav茅s de la interfaz de usuario de la consola de AWS . El usuario kops necesitar谩 el siguiente permiso de IAM:


  • AmazonEC2FullAccess
  • AmazonRoute53FullAccess
  • AmazonS3FullAccess
  • IAMFullAccess
  • AmazonVPCFullAccess


Alternativamente, puede hacer lo mismo desde la CLI aplicando los siguientes 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 

Tenga en cuenta las AccessKeyID SecretAccessKey y AccessKeyID en kops .


Configure la AWS CLI para usar su cuenta con aws configure .


Aseg煤rese de que el usuario que cre贸 est茅 en la aws iam list-users .


Exportamos la cuenta de AWS como las siguientes variables de entorno para que la CLI kops pueda usarlas.


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

Si est谩 utilizando Kops 1.6.2 o posterior, la configuraci贸n de un DNS es opcional. Puedes crear un grupo de chismes. El 煤nico requisito: el nombre del cl煤ster debe terminar en .k8s.local .

Configuraci贸n de DNS


Si ya ha alojado su dominio a trav茅s de AWS y planea usarlo, no necesita hacer nada. Otra opci贸n: si desea utilizar un subdominio de su dominio, cree una segunda zona de alojamiento p煤blico para este subdominio. En este manual, trabajaremos con una zona de alojamiento privada. Establezca la zona bajo cualquier nombre. Use este nombre para crear grupos de Kubernetes. Lea m谩s sobre c贸mo configurar DNS aqu铆 .


3. Crear un dep贸sito S3: para guardar el estado y la apariencia de nuestro cl煤ster K8S, debe crear un dep贸sito S3 separado para kops . Este dep贸sito se convertir谩 en una fuente de datos confiables para el cl煤ster de configuraci贸n.


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

Nota: si pone su cubo en funcionamiento en un 谩rea que no sea us-east-1 , adem谩s de establecer - region cambie al 谩rea deseada y agregue LocationConstraint a la misma 谩rea. A continuaci贸n se muestra el comando de construcci贸n de dep贸sito en la regi贸n 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 el almacenamiento para las versiones de cubo S3 para la recuperaci贸n, use el siguiente comando:


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

4. Creando el primer cluster de Kubernetes: 隆 Entonces, est谩s listo para crear tu primer cluster! Primero, configure las variables de entorno para simplificar el proceso. Si omiti贸 la configuraci贸n de DNS (despu茅s del paso 2), agregue .k8s.local al valor NAME .


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

No olvide hacer un seguimiento de qu茅 zonas regionales est谩n disponibles para usted. En este ejemplo, implementaremos un cl煤ster en la regi贸n us-east-2 .


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

Si est谩 utilizando una zona de alojamiento p煤blico, cree un cl煤ster con el siguiente comando:


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

Si usa una zona de alojamiento privado, haga lo siguiente:


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

Este comando le proporcionar谩 el registro de configuraci贸n del cl煤ster K8S. El cl煤ster tarda en iniciarse, ya que crea nuevas m谩quinas EC2 para los nodos maestros 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! El cl煤ster K8s ya deber铆a estar funcionando.


5. Verificaci贸n de cl煤ster: todas las instancias creadas por kops est谩n en ASG (Grupos de Auto Scaling) . En caso de falla, las instancias ASG son verificadas y reconstruidas autom谩ticamente.


Para cambiar la configuraci贸n del cl煤ster, ejecute el siguiente comando:


 kops edit cluster ${NAME} 

Cada vez que cambie la configuraci贸n del cl煤ster, deber谩 crear un cl煤ster ejecutando el siguiente comando:


 kops update cluster ${NAME} --yes 

Ver谩s algo como esto.


 [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. 

Verifica el cl煤ster.


 kops validate cluster 

Aseg煤rese de que el cl煤ster est茅 en funcionamiento.


 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 

隆Mira tus nuevos k8!


Con una simple llamada a la API de Kubernetes, puede verificar si la API est谩 en l铆nea y escuchando. Use kubectl para verificar los nodos.


 kubectl get nodes 

Esto le dar谩 informaci贸n sobre sus nodos y su estado actual.


 [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 

Un sub Kubernetes es una abstracci贸n que representa un grupo de uno o m谩s contenedores de aplicaciones (como Docker) y varios recursos compartidos para estos contenedores. Under se despliega en el nodo. Si necesita escalar la aplicaci贸n, agregue nodos al K8S implementado.


Para conocer los pods disponibles:


 kubectl get pods 

Este comando enumerar谩 los hogares disponibles en el cl煤ster.


 [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 

Implementaci贸n de Elasticsearch en el cl煤ster K8S



Si no est谩 familiarizado con Kubernetes, le recomiendo la capacitaci贸n en l铆nea de k8s .


Por el momento, hemos creado en el cl煤ster K8S: el nodo principal y dos nodos de agente. La funci贸n del nodo principal es transferir los comandos de implementaci贸n a las aplicaciones que se ejecutan en los pods de los agentes de nodo.


Las implementaciones de aplicaciones K8S son declarativas y se configuran a trav茅s de archivos JSON / YAML. Elija un controlador basado en el tipo de aplicaci贸n o sistema que est谩 implementando. Como Elasticsearch es una aplicaci贸n con estado, utilizaremos el controlador StatefulSet.


6. Implementaci贸n a trav茅s de StatefulSet. StatefulSet gestiona pods seg煤n la especificaci贸n de contenedores id茅nticos. Gestiona el despliegue y la escala del conjunto de hogares y garantiza el orden y la unicidad de estos hogares. El controlador StatefulSet tambi茅n facilita la asociaci贸n de la aplicaci贸n con el volumen persistente, lo cual es importante para Elasticsearch.


Cree un archivo llamado es-stateful set. yaml . Contendr谩 la especificaci贸n Elasticsearch. Si茅ntase libre de cambiar la configuraci贸n. Para obtener una lista de variables de entorno que se pueden pasar a su imagen de Elasticsearch, consulte aqu铆 .


7. Servicios: Service Kubernetes: una abstracci贸n que define un conjunto l贸gico de y acceso a ellos. Esto ayuda a que la aplicaci贸n contenedor identifique otra aplicaci贸n contenedor o su propia instancia en un hogar diferente.



LoadBalancer es un tipo especial de servicio que proporciona pods a redes externas y distribuye la carga. Lo usaremos para crear una direcci贸n IP externa a trav茅s de la cual cualquiera puede contactar al cl煤ster Elasticsearch. Utilizaremos este servicio para los nodos ES como una forma de descubrirnos.


Cree un archivo llamado es-svc.yaml . Ed铆telo y especifique el servicio de equilibrador 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. Crear una aplicaci贸n: eso es todo lo que necesitamos. Implemente nuestro cl煤ster Elasticsearch en K8S utilizando los siguientes comandos.


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

'Crear' es un comando universal para crear cualquier recurso en K8S.


Nuestro cl煤ster Elasticsearch de 3 nodos (驴recuerda replicas = 3 en la configuraci贸n StatefulSet?) Se lanzar谩 instant谩neamente.


Podemos verificar los pods de Elasticsearch con 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. Prueba del cl煤ster Elasticsearch: verifique si Elasticsearch est谩 configurado correctamente y funciona. Obtenga la direcci贸n IP externa para conectarse a Elasticsearch. Se ubicar谩 en el servicio LoadBalancer que creamos. Use el siguiente comando para describir 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]$ 

Tenga en cuenta el valor de LoadBalancer Ingress . Abra un navegador con un URI y n煤mero de sufijo del puerto externo Elasticsearch: 9200 . Ver谩s esto:



Puede verificar la funcionalidad de los nodos 9200/_cluster /health?pretty agregando: 9200/_cluster /health?pretty a la direcci贸n IP externa.



10. Prueba de curaci贸n de Kubernetes: StatefulSets tiene la capacidad de almacenar el n煤mero especificado de r茅plicas. De esa manera, si un sub cae, StatefulSet comenzar谩 un nuevo sub.


Lo probaremos simulando una falla (eliminando todos los pods en los que se ejecutan nuestras instancias de ES) para ver si nuestro cl煤ster de ES puede realizar copias de seguridad autom谩ticamente con datos intactos.



Como StatefulSet ejecuta un hogar a la vez, lleva tiempo restaurar todos los contenedores.


Vemos que despu茅s de la recuperaci贸n de los hogares, un registro indexado est谩 disponible para nosotros en el estado anterior a la falla de ES.


Pr贸ximos pasos recomendados


Antes de usar esta configuraci贸n en producci贸n, tenga en cuenta:


  1. Configurar copias de seguridad. Ayuda a recuperar datos perdidos. Este proceso se automatiza mejor.
  2. Configuraci贸n de autorizaci贸n. Queremos proteger el cl煤ster Elasticsearch. Configurar la autenticaci贸n o autorizaci贸n b谩sica basada en un token de medios proporcionar谩 seguridad.
  3. Certificados TLS. Configure LetsEncrypt / otros proveedores TLS de certificados de mapeo de dominios personales para nuestro cl煤ster ES y proteja todas las solicitudes que se le env铆en.

Aunque el art铆culo no trata sobre eso, sepa: Kubernetes puede hacer todo esto.


Original: despliegue Elasticsearch con Kubernetes en AWS en 10 pasos

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


All Articles