Version b1, 25.03.2023
[toc]
Das Ziel ist ein ein production fertiges zweieinhalb node Cluster, welches Requests von Extern an mehrere Applications weiterleitet.
Der ersten beiden Server sollten leistungsstark sein, auf diesen laufen die Applications. Der dritte Server dient lediglich dazu den High-Availability Status auch für das etcd Cluster zu erreichen, wozu man mindestens drei Nodes benötigt. Dieser kann auf einem leistungsschwachen PC, wie einem Raspberry Pi gehostet werden.
+----k3s-cluster-----+
+----------+ »»» | Primary Server |
Client »»» | Router | | |
+----------+ (»»») | Secondary Server |
| |
| etcd Server |
+--------------------+
+---------------------------------------Primary/Secondary-Node----------------------------------------+
| +--------------------------App-Namespace--------------------------+ |
»»» | Ingress Reverse Proxy »»» | External Webserver Service »»» Deployment »»» Pod(s) | |
| | | | |
| | ««« ConfigMap & Secrets ««« | |
| | | | |
| | Internal Database Service »»» StatefulSet »»» Pod(s) | |
| +-----------------------------------------------------------------+ |
| ... |
+-----------------------------------------------------------------------------------------------------+
...
- Eine schnelle interne M.2 Festplatte für das System (min. 1 TB)
- Ein RAID für die Application Daten (min. 2TB)
Es werden openSUSE MicroOS-Systeme in der Standard-Systemrolle installiert.
Festplatte | Partition | Filesystem | Größe |
---|---|---|---|
System M.2 SSD | / | btrfs | 100GB |
System M.2 SSD | /var | btrfs | max. |
Data RAID | /data | btrfs | min. 2 TB |
Zeitzone auf Germany, aber Hardware Clock auf UTC setzen.
Hostname setzen: Z.b. firmaxyz-prod-primary oder firmaxyz-k8s-a. Node muss erkennbar sein.
In Bootloader Options Timeout auf 3s setzen.
Firewall aktivieren, SSH Service aktivieren und SSH port öffnen.
Mit zypper lr -u
Repos auflisten und alle USB/CD/DVD Repos mit zypper rr
entfernen. Dieses bleibt nach der Installation manchmal übrig und es kann nicht mehr drauf zugegriffen werden, wenn das Installationsmedium entfernt wird.
System ggf. mit transactional-update dup
aktualisieren. Danach rebooten.
Cockpit und optional folgende Addons installieren:
- cockpit
- cockpit-kdump
- cockpit-networkmanager
- cockpit-pcp
- cockpit-storaged
- cockpit-tukit
- tuned
- tuned-profiles-atomic
Danach Rebooten:
# transactional-update pkg install cockpit cockpit-kdump cockpit-networkmanager cockpit-pcp cockpit-storaged cockpit-tukit tuned tuned-profiles-atomic
# reboot
Cockpit mit aktivieren und zur Firewall hinzufügen:
# systemctl enable --now cockpit.socket
# firewall-cmd --add-service=cockpit --permanent
# firewall-cmd --reload
Cockpit Addons sind auf tuned angewiesen, welches über systemd aktiviert werden muss:
# systemctl enable --now tuned.service
Um einen Metric-Logger nutzen zu können, muss er aktiviert werden:
# systemctl enable --now pmlogger.service
SSH ist standardmäßig so konfiguriert, dass man sich per Password anmelden kann. Das sollte man für einen sicheren Server ändern. Folgende Befehle müssen ausgeführt werden (in der Cockpit-Konsole, dann kann man copy&paste nutzen):
# sudo transactional-update shell
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /usr/etc/ssh/sshd_config
sed -i 's/#KbdInteractiveAuthentication yes/KbdInteractiveAuthentication no/' /usr/etc/ssh/sshd_config
exit
Anschließend das System neu starten.
Um sich nun über SSH einzuloggen, muss man über Cockpit den Public Key seines Rechners unter Accounts > root eintragen.
Folgende Pakete sollten für einfachere Administration nachinstalliert werden:
- nano
- tmux
- wget
# sudo transactional-update pkg install nano tmux wget
Auf der Data Partition (/data
) werden alle Application Daten (Persistent Volumes) und Application Konfigurationen (yamls) gespeichert. Die PersitentVolumes im Storage Ordner werden zwischen Nodes syncronisiert, um überall verfügbar zu sein. Die App Config wird zur Vereinfachung der Administration ebenfalls zwischen Nodes syncronisiert.
- /data/
- kubernetes/
- resource-config/
- namespaces/
- my-app/
- webserver.yaml
- Deployment
- Service
- PVC
- database.yaml
- StatefulSet
- Service
- PVC-0
- PVC-1
- webserver.yaml
- my-app/
- namespaces/
- storage/
- persistent-volume-xyz/
- resource-config/
- kubernetes/
Die Permissions der Data-Partition sollten auf 750 gesetzt werden.
Snapshots für die Data-Partition aktivieren (policycoreutils-python-utils
installieren, falls nicht vorhanden):
# semanage fcontext -a -t snapperd_data_t '/data/\.snapshots(/.*)?'
# snapper -c data create-config /data
# restorecon -R -v /data/.snapshots/
Die Anzahl der Snapshots, die gemacht werden sollen, um Daten zu sichern, kann man unter /etc/snapper/configs/
in den Konfigurationsdateien ändern.
- Configure Firewall
# Primary & Secondary Server firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --permanent --add-port=2376/tcp firewall-cmd --permanent --add-port=2379/tcp firewall-cmd --permanent --add-port=2380/tcp firewall-cmd --permanent --add-port=6443/tcp firewall-cmd --permanent --add-port=8472/udp firewall-cmd --permanent --add-port=9099/tcp firewall-cmd --permanent --add-port=10250/tcp firewall-cmd --permanent --add-port=10254/tcp firewall-cmd --permanent --add-port=30000-32767/tcp firewall-cmd --permanent --add-port=30000-32767/udp firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16 # pods network firewall-cmd --permanent --zone=trusted --add-source=10.43.0.0/16 # services network firewall-cmd --reload # etcd Server firewall-cmd --permanent --add-port=2376/tcp firewall-cmd --permanent --add-port=2379/tcp firewall-cmd --permanent --add-port=2380/tcp firewall-cmd --permanent --add-port=8472/udp firewall-cmd --permanent --add-port=9099/tcp firewall-cmd --permanent --add-port=10250/tcp firewall-cmd --reload
-
Install k3s
curl -sfL https://get.k3s.io | sh -s - server --disable=traefik --cluster-init
-
Get k3s Secret Token
cat /var/lib/rancher/k3s/server/node-token
Install k3s and join cluster using k3s Token and hostname of primary server
curl -sfL https://get.k3s.io | K3S_TOKEN=<K3S-TOKEN> sh -s - server --disable=traefik --server https://<PRIMARY-SERVER-HOSTNAME>:6443
Install k3s etcd component to complete etcd cluster. You need the k3s Token and hostname of primary/secondary server again
curl -sfL https://get.k3s.io | K3S_TOKEN=<K3S-TOKEN> sh -s - server --disable-apiserver --disable-controller-manager --disable-scheduler --disable=traefik --server https://<PRIMARY/SECONDARY-SERVER-HOSTNAME>:6443