Einrichten eines lokalen Kubernetes Multi-Node Clusters

DevOps

In den ersten beiden Beiträgen der Blogreihe über Kubernetes ging es um die Einführung in Container, Docker und Kubernetes. In diesem Blogbeitrag geht es nun etwas weniger theoretisch und mehr praktisch zu. Es wird schrittweise ein lokales Kubernetes Cluster mit drei Knoten aufgesetzt. Exemplarisch wird hier nur die Installation unter Windows aufgezeigt. Eine Anleitung für Linux ist in diesem Github-Repository zu finden.

Systemvoraussetzungen

Unter Windows muss Hyper-V aktiviert und Docker Desktop for Windows installiert sein. Bei der Installation von Docker muss darauf geachtet werden, dass Linux containers ausgewählt sind. Docker muss nach der Installation gestartet werden.

Minikube vs kind

Das Tool Minikube bietet die Möglichkeit lokal eine Kubernetes Umgebung auszuführen. Eine Beschränkung hierbei ist, dass nur ein Knoten ausgeführt werden kann. Mithilfe der Open Source Software kind wird diese Beschränkung aufgehoben. Die Knoten werden basierend auf kubeadm erstellt. In einer Konfigurationsdatei, die beim Erstellen eines Clusters übergeben wird, kann die Anzahl an Master- und Arbeitsknoten angegeben werden. Die Einstellungen für Docker Desktop können in der Anleitung von kind unter Settings for Docker Desktop entnommen werden.

kind installieren und einrichten

Unter Windows kann kind entweder mit choco oder curl installiert werden. Zu Beginn muss ein Verzeichnis erstellt werden, in der die kind.exe abgelegt wird (bei der Installation mit curl). In diesem Beispiel erstellen wir ein Verzeichnis mit dem Namen kind unter:

 

C:\Users\Username\kind

 

Bei der Installation mit curl muss dieser Pfad angegeben werden, um die kind.exe dort abzulegen.

 

curl.exe -Lo kind-windows-amd64.exe github.com/kubernetes-sigs/kind/releases/download/v0.7.0/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe C:\Users\Username\kind\kind.exe

 

Befindet man sich nun im Verzeichnis, in das die kind.exe gespeichert wurde, kann mit dem Befehl (Kommandozeile als Administrator starten)

 

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";$pwd", "User")

 

die Umgebungsvariable angelegt werden, um das Kommandozeilen-Tool von kind global verwenden zu können. Testweise kann nun kind in der Powershell (oder Kommandozeile) eingegeben werden, um die Funktionalität des Kommandozeilen-Tools zu testen. Die Ausgabe in der Konsole sollte der unten stehenden stark ähneln.

 

kind creates and manages local Kubernetes clusters using Docker container nodes

 

Usage:
  kind [command]

 

Available Commands:
  build       Build one of [base-image, node-image]
  completion  Output shell completion code for the specified shell (bash or zsh)
  create      Creates one of [cluster]
  delete      Deletes one of [cluster]
  export      Exports one of [kubeconfig, logs]
  get         Gets one of [clusters, nodes, kubeconfig]
  help        Help about any command
  load        Loads images into nodes
  version     Prints the kind CLI version

 

Flags:
  -h, --help              help for kind
      --loglevel string   DEPRECATED: see -v instead
  -q, --quiet             silence all stderr output
  -v, --verbosity int32   info log verbosity
      --version           version for kind

Multi-Node Cluster erstellen

Möchte man nun ein Multi-node Cluster erstellen, benötigt man eine Konfigurationsdatei, in der die gewünschte Anzahl an Master- und Arbeitsknoten deklariert ist. Exemplarisch erstellen wir eine mit dem Namen kind-example-config.yaml und legen diese auch im Verzeichnis mit der kind.exe ab. Generell kann die Datei in jedem beliebigen Verzeichnis abgelegt werden.

 

kind-example-config.yaml

 

## Three node (two workers) k8s-cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker

 

In dieser Konfigurationsdatei sind ein Master- und zwei Arbeitsknoten deklariert. In der Dokumentation von kind sind weitere Beispiele für Konfigurationsdateien. Mit dem Befehl

 

kind create cluster --config "C:\Users\Username\kind\kind-example-config.yaml-path"

 

wird auf Basis der übergeben Konfigurationsdatei das entsprechende Kubernetes Cluster erstellt.

Kubernetes Dashboard

Mit Kubernetes Dashboard besteht die Möglichkeit sein Kubernetes Cluster über eine Weboberfläche zu verwalten (Erstellen, Löschen, Bearbeiten und Überwachen von Kubernetes Ressourcen und Objekten). Mit dem Befehl

 

kubectl apply -f raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

 

werden die dafür benötigten Ressourcen und Objekte erstellt. Für den Zugriff im Browser muss noch der entsprechende Proxy Service gestartet werden.

 

kubectl proxy

 

Das Kubernetes Dashboard kann über folgende URL aufgerufen werden:

 

localhost/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

 

Für den Zugriff wird nun ein Access-Token benötigt, der über folgenden Befehl extrahiert werden kann:

 

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

 

Die Ausgabe mit dem Access-Token (den letzten der Ausgabe verwenden) ähnelt stark der Folgenden:

 

Name:         kubernetes-dashboard-token-jdxjs
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: kubernetes-dashboard
              kubernetes.io/service-account.uid: aceae174-dd49-4193-aa6d-2947e04e2170

 

Type:  kubernetes.io/service-account-token

 

Data
====
ca.crt:     1025 bytes
namespace:  20 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6InpRV1h1dmpYM25YdUNQeFF6N2hWUkZiQlFmdEw1RDY5M01WQlQ2aGx4dlUifQOA

 

Sobald man die Checkbox mit dem Namen Token ausgewählt und den token: eingefügt hat, kann man auf das Kubernetes Dashboard zugreifen.

Fallstrick Berechtigungen

Auf den ersten Blick wird aber direkt ein Problem ersichtlich. Man hat keinen Zugriff auf Ressourcen des Kubernetes Clusters. In diesem Cluster wird die Sicherheit mit RBAC - Rollenbasierter Zugriffssteuerung realisiert. Es gibt Rollen, die bestimmte Berechtigungen auf Ressourcen haben und Dienstkonten (jeder Pod hat ein Dienstkonto), denen eine oder mehrere Rollen zugewiesen sind. In diesem Blogbeitrag liegt der Fokus aber nicht auf RBAC und die Sicherheitsaspekte von Kubernetes.

Dashboard Benutzer Berechtigungen erteilen

Die Rolle, mit der Zugriff auf das Kubernetes Dashboard möglich ist, trägt den Namen kubernetes-dashboard. In diesem Beispiel weisen wir dieser Rolle alle Berechtigungen (lesen, schreiben, löschen und bearbeiten) für alle Ressourcen und Objekte des Kubernetes Clusters zu (Achtung: dies sollte in Produktivumgebungen natürlich in jedem Fall vermieden werden!). Mit dem Befehl

 

kubectl edit clusterroles kubernetes-dashboard

 

kann die Konfigurationsdatei für diese Rolle bearbeitet werden. Es muss der folgende Teil der Konfigurationsdatei mit dem hier angegebenen ersetzt werden.

 

- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'

 

Wenn die Datei gespeichert und geschlossen ist, sollten alle Ressourcen und Objekte im Browser sichtbar und zu bearbeiten sein.

Yannic Nevado Autor

Yannic Nevado ist ein Datenbank-Consultant bei der Proventa AG. Seine Schwerpunkte liegen beim Open Source und EDB Postgres. Er arbeitet mit Kunden daran neue Datenbanksysteme einzuführen. Des Weiteren unterstützt er Migrationen von Oracle und DB2  zu Postgres. DevOps mit Containern und Kubernetes gehören außerdem zu seinem Alltag. Gerne teilt er sein neu erlangtes Wissen bei der Postgres User Group Frankfurt weiter.

Tags