Bereitstellen von Elasticsearch unter AWS mit Kubernetes in 10 Schritten


Kubernetes aka k8s ist ein Open Source-System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung von Containeranwendungen. In diesem Artikel werde ich Ihnen zeigen, wie Sie einen Kubernetes-Cluster einrichten und einen Elasticsearch-Cluster für AWS bereitstellen. Diese Einstellungen funktionieren auch in GCE und Azure .


Kubernetes unter AWS konfigurieren


Erhalten Sie zunächst Administratorzugriff auf die folgenden AWS-Services: S3, EC2, Route53, IAM und VPC .


1. Installation: Ich werde die Installation der CLI für Linux zeigen. Wenn Sie ein anderes Betriebssystem haben, folgen Sie den nachstehenden Links, um Installationsanweisungen für Ihr Betriebssystem zu erhalten.


Stellen Sie zunächst die AWS-CLI so ein , dass über die CLI auf AWS zugegriffen wird. Wenn Sie bereits Python und Pip haben, führen Sie den folgenden Befehl aus:


 pip install awscli --upgrade --user 

Anschließend verwenden wir Kops , ein Befehlszeilentool, das uns durch die Einrichtung des K8S-Clusters auf Produktionsebene führt.
Installieren Sie die Kops- Binärdateien direkt von 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/ 

Schließlich verwenden wir die kubectl- CLI, um den K8S-Cluster zu verwalten (wenn Sie Docker verwendet haben, ähnelt dies der Docker- CLI). Die neueste Version wird mit dem folgenden Befehl installiert:


 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 

Hinweis: Sie können den Kubernetes-Cluster starten und den Anweisungen in diesem Artikel auf einem Heimcomputer mit Minikube folgen .


2.Erstellen von IAM-Benutzern: Um Cluster in AWS zu erstellen, erstellen wir einen separaten IAM-Benutzer für kops . Für kops benötigen kops ein API-Konto. Erstellen Sie einen Benutzer und konfigurieren Sie ein Konto über die Benutzeroberfläche der AWS-Konsole . Der kops Benutzer benötigt die folgende IAM-Berechtigung:


  • AmazonEC2FullAccess
  • AmazonRoute53FullAccess
  • AmazonS3FullAccess
  • IAMFullAccess
  • AmazonVPCFullAccess


Alternativ können Sie dasselbe über die CLI tun, indem Sie die folgenden Befehle anwenden:


 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 

Beachten Sie die SecretAccessKey und AccessKeyID in kops .


Konfigurieren Sie die AWS-CLI so, dass Ihr Konto mit aws configure .


Stellen Sie sicher, dass sich der von Ihnen erstellte Benutzer in der aws iam list-users .


Wir exportieren das AWS-Konto als die folgenden Umgebungsvariablen, damit die CLI- kops sie verwenden können.


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

Wenn Sie Kops 1.6.2 oder höher verwenden, ist das Einrichten eines DNS optional. Sie können einen Klatschcluster erstellen. Einzige Voraussetzung: Der Clustername muss mit .k8s.local .

DNS-Setup


Wenn Sie Ihre Domain bereits über AWS gehostet haben und planen, sie zu verwenden, müssen Sie nichts tun. Eine weitere Option: Wenn Sie eine Subdomain Ihrer Domain verwenden möchten, erstellen Sie eine zweite öffentliche Hostingzone für diese Subdomain. In diesem Handbuch arbeiten wir mit einer privaten Hosting-Zone. Stellen Sie die Zone unter einem beliebigen Namen ein. Verwenden Sie diesen Namen, um Kubernetes-Cluster zu erstellen. Weitere Informationen zum Einrichten von DNS finden Sie hier .


3. Erstellen eines S3- Buckets: Um den Status und das Erscheinungsbild unseres K8S-Clusters zu speichern, müssen Sie einen separaten S3-Bucket für kops . Dieser Bucket wird zu einer Quelle zuverlässiger Daten für den Konfigurationscluster.


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

Hinweis: Wenn Sie Ihren Eimer in einem anderen Bereich als us-east-1 in Betrieb nehmen - region wechseln Sie zusätzlich zur Einstellung - region zum gewünschten Bereich und fügen Sie LocationConstraint zum selben Bereich hinzu. Das Folgende zeigt den Befehl zum Erstellen von Buckets in der Region us-west-1 .


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

Verwenden Sie den folgenden Befehl, um den Speicher für S3-Bucket-Versionen für die Wiederherstellung zu konfigurieren:


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

4. Erstellen des ersten Kubernetes-Clusters: Jetzt können Sie Ihren ersten Cluster erstellen! Richten Sie zunächst die Umgebungsvariablen ein, um den Prozess zu vereinfachen. Wenn Sie die DNS-Konfiguration übersprungen haben (nach Schritt 2), fügen .k8s.local dem NAME Wert .k8s.local hinzu.


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

Vergessen Sie nicht zu verfolgen, welche regionalen Zonen Ihnen zur Verfügung stehen. In diesem Beispiel werden wir einen Cluster in der Region us-east-2 bereitstellen.


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

Wenn Sie eine öffentliche Hostingzone verwenden, erstellen Sie einen Cluster mit dem folgenden Befehl:


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

Wenn Sie eine private Hosting-Zone verwenden, gehen Sie wie folgt vor:


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

Mit diesem Befehl erhalten Sie das K8S-Cluster-Konfigurationsprotokoll. Der Start des Clusters dauert einige Zeit, da neue EC2-Maschinen für Minion-Masterknoten erstellt werden.


 [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! Der K8s-Cluster sollte bereits funktionieren.


5. Clusterprüfung: Alle von kops erstellten kops befinden sich in ASG (Auto Scaling Groups) . Im Fehlerfall werden die ASG-Instanzen überprüft und automatisch neu erstellt.


Führen Sie den folgenden Befehl aus, um die Clusterkonfiguration zu ändern:


 kops edit cluster ${NAME} 

Jedes Mal, wenn Sie die Clusterkonfiguration ändern, müssen Sie einen Cluster erstellen, indem Sie den folgenden Befehl ausführen:


 kops update cluster ${NAME} --yes 

Sie werden so etwas sehen.


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

Überprüfen Sie den Cluster.


 kops validate cluster 

Stellen Sie sicher, dass der Cluster aktiv ist.


 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 

Schauen Sie sich Ihre neuen k8s an!


Mit einem einfachen Aufruf der Kubernetes-API können Sie überprüfen, ob die API online ist und abhört. Verwenden Sie kubectl , um die Knoten zu überprüfen.


 kubectl get nodes 

Dadurch erhalten Sie Informationen zu Ihren Knoten und deren aktuellem Status.


 [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 

Ein Kubernetes-Sub ist eine Abstraktion, die eine Gruppe von einem oder mehreren Anwendungscontainern (z. B. Docker) und mehreren gemeinsam genutzten Ressourcen für diese Container darstellt. Unter entfaltet sich auf dem Knoten. Wenn Sie die Anwendung skalieren müssen, fügen Sie dem bereitgestellten K8S Knoten hinzu.


So informieren Sie sich über die verfügbaren Pods:


 kubectl get pods 

Dieser Befehl listet die verfügbaren Herde im Cluster auf.


 [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 

Elasticsearch-Bereitstellung in K8S-Cluster



Wenn Sie mit Kubernetes nicht vertraut sind, empfehle ich das Online-Training von k8 .


Im Moment haben wir im K8S-Cluster erstellt: den Hauptknoten und zwei Agentenknoten. Die Rolle des Hauptknotens besteht darin, Bereitstellungsbefehle an Anwendungen zu übertragen, die in den Pods der Knotenagenten ausgeführt werden.


K8S-Anwendungsbereitstellungen sind deklarativ und werden über JSON / YAML-Dateien konfiguriert. Wählen Sie einen Controller basierend auf dem Typ der Anwendung oder des Systems, das Sie bereitstellen. Da Elasticsearch eine Stateful-Anwendung ist, verwenden wir den StatefulSet-Controller.


6. Bereitstellung über StatefulSet. StatefulSet verwaltet Pods basierend auf der Spezifikation identischer Container. Es verwaltet die Bereitstellung und Skalierung des Herdsatzes und stellt die Reihenfolge und Einzigartigkeit dieser Herde sicher. Der StatefulSet- Controller erleichtert auch das Zuordnen der Anwendung zu einem dauerhaften Volume, was für Elasticsearch wichtig ist.


Erstellen Sie eine Datei mit dem Namen es-stateful set. yaml . Es enthält die Elasticsearch-Spezifikation. Sie können die Konfiguration jederzeit ändern. Eine Liste der Umgebungsvariablen, die an Ihr Elasticsearch-Image übergeben werden können, finden Sie hier .


7. Services: Service Kubernetes - eine Abstraktion, die einen logischen Satz von und den Zugriff darauf definiert. Auf diese Weise kann die Containeranwendung eine andere Containeranwendung oder eine eigene Instanz in einem anderen Herd identifizieren.



LoadBalancer ist eine spezielle Art von Dienst, der Pods für externe Netzwerke bereitstellt und die Last verteilt. Wir werden es verwenden, um eine externe IP-Adresse zu erstellen, über die jeder den Elasticsearch-Cluster kontaktieren kann. Wir werden diesen Service für ES-Knoten verwenden, um uns gegenseitig zu entdecken.


Erstellen Sie eine Datei mit dem Namen es-svc.yaml . Bearbeiten Sie es und geben Sie den Load Balancer-Dienst an.


 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. Erstellen einer Anwendung: Das ist alles, was wir brauchen. Stellen Sie unseren Elasticsearch-Cluster mit den folgenden Befehlen auf K8S bereit.


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

'Erstellen' ist ein universeller Befehl zum Erstellen einer Ressource in K8S.


Unser Elasticsearch-Cluster mit 3 Knoten (erinnern Sie sich an replicas = 3 in der StatefulSet-Konfiguration?) Wird sofort gestartet.


Wir können die Elasticsearch-Pods mit diesem Befehl überprüfen:


 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. Testen des Elasticsearch-Clusters: Überprüfen Sie, ob Elasticsearch richtig konfiguriert ist und funktioniert. Rufen Sie die externe IP-Adresse ab, um eine Verbindung zu Elasticsearch herzustellen. Es befindet sich im von uns erstellten LoadBalancer- Dienst. Verwenden Sie den folgenden Befehl, um den LoadBalancer zu beschreiben:


 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]$ 

Beachten Sie den Wert von LoadBalancer Ingress . Öffnen Sie einen Browser mit einer URI und der Suffixnummer des externen Elasticsearch-Ports: 9200 . Sie werden dies sehen:



Sie können die Funktionalität von Elasticsearch-Knoten überprüfen, indem Sie 9200/_cluster /health?pretty hinzufügen: 9200/_cluster /health?pretty zur externen IP-Adresse.



10. Kubernetes-Heilungstests: StatefulSets kann die angegebene Anzahl von Replikaten speichern. Auf diese Weise startet StatefulSet ein neues Sub, wenn ein Sub fällt.


Wir werden es testen, indem wir einen Fehler simulieren (Löschen aller Pods, auf denen unsere ES-Instanzen ausgeführt werden), um festzustellen, ob unser ES-Cluster automatisch mit intakten Daten sichern kann.



Da StatefulSet jeweils einen Herd ausführt, dauert es einige Zeit, alle Container wiederherzustellen.


Wir sehen, dass uns nach der Wiederherstellung der Herde im Zustand vor dem ES-Ausfall ein indizierter Datensatz zur Verfügung steht.


Empfohlene nächste Schritte


Bevor Sie diese Einstellungen in der Produktion verwenden, beachten Sie bitte:


  1. Konfigurieren Sie Backups. Hilft bei der Wiederherstellung verlorener Daten. Dieser Prozess ist am besten automatisiert.
  2. Autorisierungs-Setup. Wir möchten den Elasticsearch-Cluster schützen. Das Einrichten der Basisauthentifizierung oder -autorisierung basierend auf einem Medientoken bietet Sicherheit.
  3. TLS-Zertifikate. Konfigurieren Sie LetsEncrypt / andere TLS-Anbieter von Zertifikaten für die Zuordnung persönlicher Domänen für unseren ES-Cluster und schützen Sie alle an ihn gesendeten Anforderungen.

Der Artikel handelt zwar nicht davon, weiß aber: Kubernetes kann das alles.


Original: Stellen Sie Elasticsearch mit Kubernetes unter AWS in 10 Schritten bereit

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


All Articles