Setup eines Kubernetes-Clusters mit Kops

Freund und Helfer

Vor allem für Testinstallationen von Kubernetes gibt es einige Lösungen wie Kubeadm und Minikube. Für das Setup eines Kubernetes-Clusters in Cloud-Umgebungen hat sich Kops als Mittel der Wahl bewährt. Wir beschreiben seine Fähigkeiten und geben eine Anleitung für den praktischen Einsatz.
Immer größere Datenmengen bei gleichzeitig steigenden Anforderungen an die Sicherheit sowie Zugriffsmöglichkeiten stellen Administratoren vor neue ... (mehr)

Ende letzten Jahres zeichnete sich ab, dass Kubernetes das Rennen um die populärste Container-Orchestrierungslösung gewinnt. Nachdem Docker bereits erklärt hatte, künftig Kubernetes ins eigene Produkt zu integrieren, stellte schließlich auch Amazon als letzter großer Cloud-Anbieter eigene Dienste mit Kubernetes vor (derzeit noch als Preview) – Google als Kubernetes-Erfinder bietet schon lange den Dienst in seiner Cloud an. Per Kubernetes lassen sich aus Containern bestehende Anwendungen auf einem Cluster installieren, aktualisieren und verwalten, weitgehend unabhängig von der darunterliegenden Hardware- oder Cloud-Plattform.

Spezialisiert auf AWS

Wer die neuen Amazon-Dienste nicht nutzen möchte, kann mit verschiedenen Tools einen eigenen Kubernetes-Cluster auf Bare Metal oder in einer Cloud installieren. Auf AWS spezialisiert ist Kops, ein Programm, das die Installation und das Management eines oder mehrerer konfigurierbarer Kubernetes-Cluster in Amazons Cloud übernimmt. Dazu verwendet Kops soweit möglich die von AWS angebotenen Mittel, etwa Autoscaling Groups und Launch Configurations, die dafür sorgen, dass die konfigurierte Anzahl an Mastern und Nodes laufen.

Die Kommunikation zwischen den Kubernetes-Komponenten läuft in einer Amazon VPC (Virtual Private Cloud) ab, die mit den entsprechenden Security Groups abgesichert wird. Der DNS-Service für den Cluster findet in Amazon Route 53 statt. Der Clou an Kops ist, dass Sie sich um die meisten dieser Details nicht kümmern müssen. Alternativ zu AWS unterstützt Kops auch die Google Cloud Engine (GCE) und vSphere, beides aber nur in Alpha-Qualität.

Mit Kops einen Kubernetes-Cluster zu installieren, setzt voraus, dass die AWS-Commandline-Tools installiert sind, was Sie etwa so erledigen:

$ sudo -H pip install awscli

Damit sollte das Commandline-Tool "aws" zur Verfügung stehen, das die meisten existierenden AWS-Dienste managen kann – abgesehen beispielsweise vom Kubernetes-Dienst, der zum Redaktionsschluss noch nicht in das Tool integriert war. Damit Sie es verwenden können, legen Sie in der AWS Console am besten einen neuen Benutzer an und erzeugen einen Access Key für ihn (Bild 1), den Sie mit »aws configure« in der Konfigurationsdatei "~/.aws/credentials" speichern. Das Kops-Tool installieren Sie so:

$ 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/
Bild 1: AWS empfiehlt, für den API-Zugriff einen eigenen Benutzer anzulegen, der "Programmatic access" benötigt, um an einen Access Key und einen Secret Key zu kommen.

Um mit dem installierten Kubernetes-Cluster zu interagieren, brauchen Sie noch Kubectl, das ebenfalls in wenigen Schritten heruntergeladen ist:

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.9.0/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl

Nun legen Sie mit einem IAM-Account, der Administratorrechte besitzt, ein weiteres Zugangskonto namens "kops" an und vergeben ihm relativ weitgehende Rechte: AmazonEC2FullAccess, AmazonRoute53FullAccess, AmazonS3FullAccess, IAMFullAccess und AmazonVPCFullAccess. Dies können Sie in der AWS-Management-Console machen oder mit dem eben installierten AWS-Tool, wie Listing 1 zeigt. Die im letzten Schritt ausgegebenen Schlüssel tragen Sie anschließend mit »aws configure« als aktuelle Auth-Konfiguration ein.

Listing 1: Kops-User in AWS anlegen



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

DNS-Konfiguration

Im Allgemeinen setzt Kubernetes wie auch Kops ein funktionierendes DNS voraus. Dazu gibt es mehrere Möglichkeiten. Ab Version 1.6.2 benötigt Kops nicht mehr unbedingt eine vollständige DNS-Konfiguration, sondern kann auch sogenanntes Gossip-DNS verwenden, also ein Setup, in dem sich die beteiligten Nodes gegenseitig die Namen einflüstern.

Die weiteren Optionen sind meistens damit verbunden, eine Domain beim AWS-DNS-Service Route53 registriert zu haben. Wir gehen hier einen alternativen Weg, der die Domain beim Registrar belässt, aber eine Subdomain an Route53 delegiert. Der folgende Aufruf registriert die Subdomain "aws.zetacloud.de" beim Amazon-Dienst:

$ ID=$(uuidgen) && aws route53 create-hosted-zone --name aws.zetacloud.de --caller-reference $ID | jq .DelegationSet.NameServers
[
    "ns-2027.awsdns-61.co.uk",
    "ns-1068.awsdns-05.org",
    "ns-863.awsdns-43.net",
    "ns-173.awsdns-21.com"
]

Wie die Ausgabe zeigt, gibt es für die Subdomain bei AWS nun vier Nameserver, die Sie bei Ihrem Registrar als NS-Records eintragen müssen. Sind Sie damit fertig, können Sie die Konfiguration beispielsweise mit »dig ns aws.zetacloud.de« testen, das die obigen Nameserver ausgeben sollte. Wie bei DNS üblich müssen Sie eventuell ein bisschen warten, bis die Änderungen sich verbreitet haben.

Jetzt fehlt noch ein S3-Bucket, in dem Kops seine Konfiguration speichert. Ihn legen Sie folgendermaßen an:

$ aws s3api create-bucket --bucket aws-zetacloud-de-state-store --region eu-central-1
{
    "Location": "http://aws-zetacloud-de-state-store.s3.amazonaws.com/"
}

S3-Buckets entfernen

Um den laufenden Cluster inklusive Konfiguration wieder zu entfernen, verwenden Sie "kops delete cluster kube.aws.zetacloud.de --yes". Der S3-Bucket bleibt damit allerdings erhalten. Sie löschen ihn mit einem einfachen Befehl – jedenfalls wenn er nicht wie empfohlen versioniert (und leer) ist:

$ aws s3api delete-bucket --bucket aws-zetacloud-de-state-store

Mit Versionierung müssen erst alle vorhandenen Versionen gelöscht werden, bevor sich der Bucket löschen lässt. Das AWS-CLI bietet dafür keine einfache Lösung, deshalb verwenden wir dafür die Python-API Boto3 , die für S3 eine Funktion bietet, die alle Versionen in einem Bucket löscht. Boto3 installieren Sie zum Beispiel mit "sudo -H pip install boto3". Alles in allem sieht der Code so aus:

import boto3
session = boto3.Session()
s3 = session.resource(service_name='s3')
bucket = s3.Bucket('aws-zetacloud-de-state-store')
bucket.object_versions.delete()
bucket.delete()

Die Kops-Dokumentation rät beim Einsatz anderer Regionen als "us-east-1" dazu, die Option "--create-bucket-configuration Location­Con­straint=eu-central-1" anzugeben. Die Kops-Entwickler empfehlen zudem, die Versionierung für den Bucket zu aktivieren, um im Fall eines Fehlers wieder zu einem funktionierenden Zustand zurückkehren zu können.

$ aws s3api put-bucket-versioning --bucket aws-zetacloud-de-state-store --versioning-configuration Status=Enabled

Sie können diesen Schritt auch überspringen und die Versionierung erst später aktivieren, was das Löschen des Buckets vereinfacht (siehe den Kasten "S3-Buckets entfernen"). Den Bucket übergeben Sie Kops mit dem Schalter "--state" oder Sie setzen die Umgebungsvariable "KOPS_STATE_STORE", die Kops automatisch verwendet (lassen Sie hierbei die oben ausgegebene Domain weg und stellen Sie den Service-Typ "s3" voran):

$ export KOPS_STATE_STORE=s3://aws-zetacloud-de-state-store

Um den Cluster anzulegen, müssen Sie eine (oder, im Fall von HA-Setups, mehrere) Availability-Zone auswählen, die Sie für Ihre Region so ermitteln:

$ aws ec2 describe-availability-zones --region eu-central-1

Der folgende Aufruf erzeugt eine einfache Cluster-Konfiguration für diese Availability-Zone, legt aber in der Amazon-Cloud noch nicht automatisch alle nötigen Ressourcen an:

$ kops create cluster --zones eu-central-1a --dns-zone=aws.zetacloud.de --name kube.aws.zetacloud.de

Um die Instanztypen auszuwählen, gibt es Kops die Schalter "--node-size" und "--master-size" für Kubernetes-Nodes respektive -Master. So wählt der folgende Aufruf für beide Zwecke den Instanztyp "t2.micro". Die Anzahl der Nodes setzt "--node-count".

$ kops create cluster --zones us-east-1a --node-size t2.micro --master-size t2.micro --name kube.aws.zetacloud.de --dns-zone=aws.zetacloud.de

Bisher hat Kops in der AWS-Cloud nicht viel gemacht, außer die Konfiguration in dem gewählten S3-Bucket zu speichern, zwei Volumes, ein Keypair und ein paar Security Groups anzulegen. Die Umsetzung der Konfiguration startet

$ kops update cluster kube.aws.zetacloud.de --yes

Hilfe bei der Fehlersuche geben Schalter wie "--logtostderr", das die Logging-Meldungen im Terminal ausgibt, sowie "-v", das gefolgt von einer Zahl den Verbosity-Level erhöht. Der Befehl gibt am Ende eine Art Erfolgs- oder Fehlermeldung inklusive einiger Tipps aus, die anzeigen, wie es nun weitergehen soll (Bild 2).

Bild 2: Nach dem Cluster-Setup heißt es warten, bis alle AWS-Instanzen gestartet und konfiguriert sind.

So wird beispielsweise geraten, mit »kops validate cluster« dem Zustand des Clusters abzufragen. Das ist ein guter Hinweis, aber er wird zum gegenwärtigen Zeitpunkt vermutlich nicht zum Erfolg führen. Kops muss zuerst die Cluster-Konfiguration in AWS umsetzen, dazu die entsprechenden Instanzen starten, Software aus dem Internet laden und DNS-Einträge konfigurieren. Das kann durchaus eine Viertelstunde dauern, haben Sie also etwas Geduld (Bild 3).

Bild 3: So sieht es aus, wenn der Kubernetes-Cluster betriebsbereit ist.

Ähnliche Artikel

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023