
Kubernetes aka k8s
est un système open source pour automatiser le déploiement, la mise à l'échelle et la gestion des applications conteneurisées. Dans cet article, je vais vous montrer comment configurer un cluster Kubernetes et déployer un cluster Elasticsearch sur AWS sur celui-ci. Ces paramètres fonctionnent également sur GCE et Azure .
Configuration de Kubernetes sur AWS
Pour commencer, obtenez un accès administratif aux services AWS suivants: S3, EC2, Route53, IAM et VPC .
1. Installation: je vais montrer l'installation de la CLI pour Linux. Si vous avez un système d'exploitation différent, suivez les liens ci-dessous pour les instructions d'installation de votre système d'exploitation.
Tout d'abord, définissez l' AWS CLI pour accéder à AWS via la CLI. Si vous avez déjà Python et pip, exécutez la commande:
pip install awscli --upgrade --user
Ensuite, nous utilisons Kops , un outil en ligne de commande qui nous guide Ă travers la configuration du cluster de production K8S.
Installez les binaires Kops directement depuis 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/
Enfin, nous utilisons kubectl - CLI pour gérer le cluster K8S (si vous avez utilisé docker, cela est similaire à la docker CLI). La dernière version est installée par la commande:
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
Remarque: vous pouvez démarrer le cluster Kubernetes et suivre les instructions de cet article sur une machine domestique avec minikube .
2.Créez des utilisateurs IAM: pour créer des clusters dans AWS, nous allons créer un utilisateur IAM distinct pour kops
. Pour kops
besoin d'un compte API. Créez un utilisateur et configurez un compte via l'interface utilisateur de la console AWS . L'utilisateur kops
aura besoin de l'autorisation IAM suivante:
- AmazonEC2FullAccess
- AmazonRoute53FullAccess
- AmazonS3FullAccess
- IAMFullAccess
- AmazonVPCFullAccess

Alternativement, vous pouvez faire la mĂŞme chose Ă partir de la CLI en appliquant les commandes suivantes:
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
Notez les AccessKeyID
SecretAccessKey
et AccessKeyID
dans kops
.
Configurez l'AWS CLI pour utiliser votre compte avec aws configure
.
Assurez-vous que l'utilisateur que vous avez créé figure dans la aws iam list-users
.
Nous exportons le compte AWS en tant que variables d'environnement suivantes afin que les kops
CLI puissent les utiliser.
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 vous utilisez Kops 1.6.2 ou une version ultérieure, la configuration d'un DNS est facultative. Vous pouvez créer un cluster de potins. Seule condition: le nom du cluster doit se terminer par .k8s.local
.
Configuration DNS
Si vous avez déjà hébergé votre domaine via AWS et prévoyez de l'utiliser, rien ne doit être fait. Autre option: si vous souhaitez utiliser un sous-domaine de votre domaine, créez une deuxième zone d'hébergement publique pour ce sous-domaine. Dans ce manuel, nous travaillerons avec une zone d'hébergement privée. Définissez la zone sous n'importe quel nom. Utilisez ce nom pour créer des clusters Kubernetes. En savoir plus sur la configuration du DNS ici .
3. Création d'un compartiment S3: pour enregistrer l'état et l'apparence de notre cluster K8S, vous devez créer un compartiment S3 distinct pour les kops
. Ce compartiment deviendra une source de données fiables pour le cluster de configuration.
aws s3api create-bucket \ --bucket <your-unique-bucket-name> \ --region us-east-1
Remarque: si vous mettez votre compartiment en service dans une zone autre que us-east-1
, en plus de définir - region
passez à la zone souhaitée et ajoutez LocationConstraint
à la même zone. Ce qui suit montre la commande de construction de compartiment dans la région us-west-1
.
aws s3api create-bucket \ --bucket <your-unique-bucket-name> \ --region us-west-1 \ --create-bucket-configuration LocationConstraint=us-west-1
Pour configurer le stockage des versions de compartiment S3 pour la récupération, utilisez la commande suivante:
aws s3api put-bucket-versioning \ --bucket <your-unique-bucket-name> \ --versioning-configuration Status=Enabled
4. Création du premier cluster Kubernetes: vous êtes donc prêt à créer votre premier cluster! Tout d'abord, configurez les variables d'environnement pour simplifier le processus. Si vous avez ignoré la configuration DNS (après l'étape 2), ajoutez .k8s.local
Ă la valeur NAME
.
export NAME=myfirstcluster.example.com export KOPS_STATE_STORE=s3://your-bucket-name
N'oubliez pas de garder une trace des zones régionales à votre disposition. Dans cet exemple, nous déploierons un cluster dans la région us-east-2 .
aws ec2 describe-availability-zones --region us-east-2
Si vous utilisez une zone d'hébergement publique, créez un cluster à l'aide de la commande suivante:
kops create cluster \ --zones us-east-2c \ --node-count 3 \ ${NAME}
Si vous utilisez une zone d'hébergement privée, procédez comme suit:
kops create cluster \ --zones us-east-2c \ --node-count 3 \ --dns private ${NAME}
Cette commande vous fournira le journal de configuration du cluster K8S. Le démarrage du cluster prend du temps, car il crée de nouvelles machines EC2 pour les nœuds maîtres des sbires.
[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! Le cluster K8s devrait déjà fonctionner.
5. Vérification du cluster: toutes les instances créées par kops
sont en ASG (Auto Scaling Groups) . En cas d'échec, les instances ASG sont vérifiées et reconstruites automatiquement.
Pour modifier la configuration du cluster, exécutez la commande suivante:
kops edit cluster ${NAME}
Chaque fois que vous modifiez la configuration du cluster, vous devrez créer un cluster en exécutant la commande suivante:
kops update cluster ${NAME} --yes
Vous verrez quelque chose comme ça.
[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.
Vérifiez le cluster.
kops validate cluster
Assurez-vous que le cluster est opérationnel.
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
Découvrez vos nouveaux k8!
Avec un simple appel à l'API Kubernetes, vous pouvez vérifier si l'API est en ligne et à l'écoute. Utilisez kubectl
pour vérifier les nœuds.
kubectl get nodes
Cela donnera des informations sur vos nœuds et leur état actuel.
[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 sous-marin Kubernetes est une abstraction qui représente un groupe d'un ou plusieurs conteneurs d'applications (tels que Docker) et plusieurs ressources partagées pour ces conteneurs. Sous se déroule sur le nœud. Si vous devez faire évoluer l'application, ajoutez des nœuds au K8S déployé.
Pour en savoir plus sur les modules disponibles:
kubectl get pods
Cette commande répertorie les foyers disponibles dans le 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
Déploiement d'Elasticsearch dans le cluster K8S

Si vous n'ĂŞtes pas familier avec Kubernetes, je recommande la formation en ligne k8s .
Pour le moment, nous avons créé dans le cluster K8S: le nœud principal et deux nœuds d'agent. Le rôle du nœud principal est de transférer des commandes de déploiement vers des applications s'exécutant dans les pods des agents de nœud.
Les déploiements d'applications K8S sont déclaratifs et sont configurés via des fichiers JSON / YAML. Choisissez un contrôleur en fonction du type d'application ou du système que vous déployez. Elasticsearch étant une application avec état, nous utiliserons le contrôleur StatefulSet.
6. Déploiement via StatefulSet. StatefulSet gère les pods en fonction de la spécification de conteneurs identiques. Il gère le déploiement et la mise à l'échelle de l'ensemble de foyers et assure l'ordre et l'unicité de ces foyers. Le contrôleur StatefulSet facilite également l'association de l'application à un volume persistant, ce qui est important pour Elasticsearch.
Créez un fichier appelé es-stateful set. yaml
. Il contiendra la spécification Elasticsearch. N'hésitez pas à modifier la configuration. Pour une liste des variables d'environnement qui peuvent être transmises à votre image Elasticsearch, voir ici .
7. Services: Service
Kubernetes - une abstraction qui définit un ensemble logique de
et y accède. Cela permet à l'application conteneur d'identifier une autre application conteneur ou sa propre instance dans un autre foyer.

LoadBalancer
est un type de service spécial qui fournit des pods aux réseaux externes et distribue la charge. Nous l'utiliserons pour créer une adresse IP externe à travers laquelle n'importe qui pourra contacter le cluster Elasticsearch. Nous utiliserons ce service pour les nœuds ES comme un moyen de se découvrir.
Créez un fichier appelé es-svc.yaml
. Modifiez-le et spécifiez le service d'équilibrage de charge.
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. Créer une application: c'est tout ce dont nous avons besoin. Déployez notre cluster Elasticsearch sur K8S à l'aide des commandes suivantes.
kubectl create -f es-statefulset.yaml kubectl create -f es-svc.yaml
'Créer' est une commande universelle pour créer n'importe quelle ressource dans K8S.
Notre cluster Elasticsearch à 3 nœuds (vous vous souvenez des replicas = 3
dans la configuration StatefulSet?) Sera lancé instantanément.
Nous pouvons vérifier les pods Elasticsearch avec cette commande:
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. Test du cluster Elasticsearch: vérifiez si Elasticsearch est correctement configuré et fonctionne. Obtenez l'adresse IP externe pour vous connecter à Elasticsearch. Il sera situé dans le service LoadBalancer que nous avons créé. Utilisez la commande suivante pour décrire le 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]$
Notez la valeur de LoadBalancer Ingress
. Ouvrez un navigateur avec un URI et un numéro de suffixe du port externe Elasticsearch: 9200
. Vous verrez ceci:

Vous pouvez vérifier la fonctionnalité des nœuds Elasticsearch en ajoutant: 9200/_cluster /health?pretty
Ă l'adresse IP externe.

10. Kubernetes Healing Testing: StatefulSets a la capacité de stocker le nombre spécifié de répliques. De cette façon, si un sous tombe, StatefulSet démarre un nouveau sous.
Nous allons le tester en simulant un échec (en supprimant tous les pods sur lesquels nos instances ES s'exécutent) pour voir si notre cluster ES peut automatiquement sauvegarder avec des données intactes.

Étant donné que StatefulSet exécute un foyer à la fois, il faut du temps pour restaurer tous les conteneurs.
On voit qu'après la récupération des foyers, un dossier indexé est à notre disposition en l'état avant la panne ES.
Prochaines étapes recommandées
Avant d'utiliser ces paramètres en production, veuillez noter:
- Configurez les sauvegardes. Aide à récupérer les données perdues. Ce processus est mieux automatisé.
- Configuration des autorisations. Nous voulons protéger le cluster Elasticsearch. La configuration d'une authentification ou d'une autorisation de base basée sur un jeton de média assurera la sécurité.
- Certificats TLS. Configurez LetsEncrypt / autres fournisseurs TLS de certificats de mappage de domaine personnel pour notre cluster ES et protégez toutes les demandes qui lui sont envoyées.
Bien que l'article ne traite pas de cela, mais sachez: Kubernetes peut faire tout cela.
Original: déployez Elasticsearch avec Kubernetes sur AWS en 10 étapes