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:
- https://aws.amazon.com/de/eks/
- https://cloud.google.com/kubernetes-engine
- https://azure.microsoft.com/de-de/services/kubernetes-service/
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/kubespray | GitHub |
https://github.com/git67/k8s-step-by-step | GitHub |
CentOS-8 – AppStream | CentOS Linux Repository |
CentOS-8 – Base | CentOS Linux Repository |
Docker CE Stable | CentOS Linux Repository |
Extra Packages for Enterprise Linux 8 EPEL | EPEL Linux Repository |
Extra Packages for Enterprise Linux Modular 8 | EPEL Linux Repository |
CentOS-8 – Extras | CentOS Linux Repository |
kubernetes | Google Linux Repository |
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/
- Key/Value Store für die Cluster-Konfiguration und Abbildung des Raft Consensus Algorithm
- 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 / FQDN | OS / Package Group | CPU/MEM | Nutzung | Hinweis |
---|---|---|---|---|
infra / infra.hs.local | CentOS 7.8 / Minimal Install | 2/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 Install | 2/8 | – Kubernetes Master Node | /var/lib/docker als separates LV mit XFS (min. 10GB) |
k8s-m2 / k8s-m2.hs.local | CentOS 8.2 / Minimal Install | 2/8 | – Kubernetes Master Node | /var/lib/docker als separates LV mit XFS (min. 10GB) |
k8s-m3 / k8s-m3.hs.local | CentOS 8.2 / Minimal Install | 2/8 | – Kubernetes Master Node | /var/lib/docker als separates LV mit XFS (min. 10GB) |
k8s-n1 / k8s-n1.hs.local | CentOS 8.2 / Minimal Install | 2/16 | – Kubernetes Node | /var/lib/docker als separates LV mit XFS (min. 10GB) |
k8s-n2 / k8s-n2.hs.local | CentOS 8.2 / Minimal Install | 2/16 | – Kubernetes Node | /var/lib/docker als separates LV mit XFS (min. 10GB) |
k8s-n3 / k8s-n3.hs.local | CentOS 8.2 / Minimal Install | 2/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/
- Für die spätere Kommunikation/Administration des k8s-Cluster wird der benötige API-Client „kubectl“ installiert
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"
}
}