K8s – Step by Step (Teil 1)

In diesem und den folgenden Posts wird ein einfacher Einstieg „auf Reiseflughöhe“ in einen eigenen Kubernetes-Cluster und weiteren Themen, wie Ansible, Image Registry und Helm Chartmuseum, Container, CI/CD usw. zum „Nachbauen“ dokumentiert.

Motivation

Warum einen „eigenen“ Kubernetes-Cluster aufbauen, wenn es doch so einfach gehen kann:

Imho, weil:

  • Wenn Du etwas verstehen willst, dann mach es „from scratch“
  • Das „heimische RZ“ bietet meist ausreichende Hardware für ein einfaches Setup
  • Aufbau von zusätzlichem Wissen, welches rund um ein selbst zusammengestelltes, automatisiertes Setup aufgebaut werden kann
  • Macht Laune 🙂

Vorwissen

Auch wenn die folgenden Schritte auch als „Abtipp“ bzw. „Kopier ich mal aus GitHub“ funktionieren, ist Grundlagen-Wissen mehr als sinnvoll/hilfreich:

Genutzte Installationsquellen

https://github.com/kubernetes-sigs/kubesprayGitHub
https://github.com/git67/k8s-step-by-stepGitHub
CentOS-8 – AppStreamCentOS Linux Repository
CentOS-8 – BaseCentOS Linux Repository
Docker CE StableCentOS Linux Repository
Extra Packages for Enterprise Linux 8 EPELEPEL Linux Repository
Extra Packages for Enterprise Linux Modular 8EPEL Linux Repository
CentOS-8 – ExtrasCentOS Linux Repository
kubernetesGoogle Linux Repository

Umgebung/Sizing

Die folgende Grafik veranschaulicht das geplante Setup als funktionale Architekturübersicht.

Das Setup wird auf Virtualbox basierenden VM’s ausgeführt, grundsätzlich ist die Anleitung auch auf andere Plattformen übertragbar.

Die Sizing ist für einfache funktionale Test nicht repräsentativ und kann an die eigenen Bedürfnisse bzw. die vorhandene HW angepasst werden. Um relevante Use-Cases zu verproben, habe ich mich für ein relativ opulent ausgestattetes Setup entschieden. Kleinere Ausbaustufen wie z.B. Minikube (https://kubernetes.io/de/docs/setup/minikube/) oder eine kleinere Anzahl an Nodes ist natürlich auch möglich. Die im Weiteren genutzten IP-Adressen/Hostnamen/FQDN sind nur exemplarisch und können die jeweiligen Gegebenheiten angepasst werden.

Die geplante Installation erstellt einen Multi-Node Cluster mit folgenden Eigenschaften:

  • k8s-Release 1.19.x
  • 3 Master Nodes
    • Control Plane Cluster
  • 3 Worker Nodes
    • Laufzeitnodes für Pods
  • Container-Runtime: docker bzw. crio
    • https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/
    • https://cri-o.io/
  • etcd
    • Key/Value Store für die Cluster-Konfiguration und Abbildung des Raft Consensus Algorithm
      • https://raft.github.io/
  • calico CNI-Plugin
    • https://www.projectcalico.org/

Was fehlt noch bzw. wird in den nächsten Teilen bearbeitet:

  • Loadbalancing API-Server
    • http://www.haproxy.org/
  • Private Container-Image Registry
    • https://goharbor.io/
  • Helm
    • https://helm.sh/

Anbei eine Übersicht über die geplante Ziel-Architektur:

    • 7 VM
    • 2 Netze
    • Internetzugang

Hostname / FQDNOS / Package GroupCPU/MEMNutzung Hinweis
infra / infra.hs.localCentOS 7.8 / Minimal Install2/8– Administration
– DNS
– Image Registry
– Helmchart Museum
– Ansible Control Node
/var/lib/docker als separates LV mit XFS (min. 20GB)
k8s-m1 / k8s-m1.hs.local
CentOS 8.2 / Minimal Install2/8– Kubernetes Master Node/var/lib/docker als separates LV mit XFS (min. 10GB)
k8s-m2 / k8s-m2.hs.local

CentOS 8.2 / Minimal Install2/8– Kubernetes Master Node/var/lib/docker als separates LV mit XFS (min. 10GB)
k8s-m3 / k8s-m3.hs.localCentOS 8.2 / Minimal Install2/8– Kubernetes Master Node/var/lib/docker als separates LV mit XFS (min. 10GB)
k8s-n1 / k8s-n1.hs.localCentOS 8.2 / Minimal Install2/16– Kubernetes Node
/var/lib/docker als separates LV mit XFS (min. 10GB)
k8s-n2 / k8s-n2.hs.localCentOS 8.2 / Minimal Install2/16– Kubernetes Node
/var/lib/docker als separates LV mit XFS (min. 10GB)
k8s-n3 / k8s-n3.hs.localCentOS 8.2 / Minimal Install2/16– Kubernetes Node
/var/lib/docker als separates LV mit XFS (min. 10GB)

Ablauf Aufbau des Kubernetes Cluster in 3 Schritten

  • Weiter mit den Reitern …

Setup und Vorbereitung des Infrastruktursystemes (FQDN: infra.hs.local)

Da das Infrastruktursystem in weiteren Ausbaustufen der Umgebung ein exponierte Rolle spielen wird bzw. die Installation einen hohen Automatisationsgrad haben sollte, ist etwas Vorbereitung und Aufwand durchaus gerechtfertigt.

Was wird benötigt bzw. sollte konfiguriert vorhanden sein:

  • DNS
    • Namensauflösung aller involvierten System
  • Installation diverser Packages für spätere Nutzung
  • Ansible/Ansible-User
    • Wird für die optionale Vorbereitung der Clusternodes verwendet
    • Wird für die Installation des Clueter via kubespray benötigt

Check

  • Überprüfung der Konfiguration des DNS
    • Namensauflösung aller involvierter Hosts (hier exemplarisch mit Domain hs.local)
root@infra:~ > dig  @infra.hs.local hs.local axfr | egrep "infra|k8s"

…

infra.hs.local.         86400   IN      A       192.168.56.30

k8s-m1.hs.local.        86400   IN      A       192.168.56.51

k8s-m2.hs.local.        86400   IN      A       192.168.56.52

k8s-m3.hs.local.        86400   IN      A       192.168.56.53

k8s-n1.hs.local.        86400   IN      A       192.168.56.61

k8s-n2.hs.local.        86400   IN      A       192.168.56.62

k8s-n3.hs.local.        86400   IN      A       192.168.56.63

…
  • Vorbereitung Ansible Control Node


root@infra:~ > yum install -y epel-release && \
               yum install -y git ansible python-pip python-devel openssl-devel gcc libffi-devel bash-completion && \
               pip install --upgrade pip

root@infra:~ >  adduser -m ansible && \
                echo 'ansible ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/ansible

root@infra:~ > ansible --version
ansible 2.9.6
...

root@infra:~ > su - ansible

ansible@infra:~ > ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ''
  • Installation kubectl
    • Für die spätere Kommunikation/Administration des k8s-Cluster wird der benötige API-Client „kubectl“ installiert
      • https://kubernetes.io/de/docs/tasks/tools/install-kubectl/
root@infra:~ >cat < /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF root@infra:~ > yum install -y kubectl

root@infra:~ > kubectl version -o json
{
  "clientVersion": {
  "major": "1",
  "minor": "19",
  "gitVersion": "v1.19.4",
  "gitCommit": "d360454c9bcd1634cf4cc52d1867af5491dc9c5f",
  "gitTreeState": "clean",
  "buildDate": "2020-11-11T13:17:17Z",
  "goVersion": "go1.15.2",
  "compiler": "gc",
  "platform": "linux/amd64"
  }
}