Wenn du schon immer mal die Kubernetes (K8s)-Container-Plattform ausprobieren wolltest, aber gezögert hast, weil es dir zu kompliziert ist, probier es mal mit K3s .
K3s ist eine Kubernetes-Distribution, die von Rancher entwickelt wurde. Im Vergleich zu einigen anderen Kubernetes-Distributionen ist sie leichtgewichtig, einfach zu installieren und hat nur minimale Abhängigkeiten vom Betriebssystem. Die Installation ist sehr simpel weil alle nötigen Kubernetes-Komponenten in einem Binary gebündelt sind:
Ingress-Controller
K3s installiert standardmäßig Traefik als Ingress-Controller. Der Ingress-Controller ist wie ein Reverse Proxy und Load Balancer, der Web-Anfragen an die Container weiterleitet. Wenn du einen anderen Ingress-Controller bevorzugst (z. B. Nginx) kann man den Installer anweisen keinen Ingress-Controller zu installieren.
Storage-Driver
Storage drivers are responsible for managing persistent volumes – volumes that should persist between container restarts. By default, K3s installs the „local-path-provisioner“ storage driver. This is a very simple storage driver that only makes sense to use when persistent volumes do not need to be shared across multiple Kubernetes nodes.
The local-path provisioner simply provides persistent volumes by creating folders on the respective node, and bind-mounting them to the containers. For testing Kubernetes on a single node, this is ideal and perfectly sufficient.
One-Node Cluster
Kubernetes kann große Cluster mit vielen Knoten bilden. Für deine ersten Schritte mit Kubernetes würde ich dir jedoch empfehlen, die Dinge einfach zu halten und einen Ein-Knoten-Cluster zu deployen, was mit K3s wirklich einfach ist.
Um K3s auf einem Ein-Knoten-Cluster zu installieren, musst du eigentlich nur den folgenden Befehl mit Root-Rechten ausführen:
curl -sfL https://get.k3s.io | sh - [INFO] Finding release for channel stable [INFO] Using v1.17.4+k3s1 as release [INFO] Downloading hash https://github.com/rancher/k3s/releases/download/v1.17.4+k3s1/sha256sum-amd64.txt [INFO] Downloading binary https://github.com/rancher/k3s/releases/download/v1.17.4+k3s1/k3s [INFO] Verifying binary download [INFO] Installing k3s to /usr/local/bin/k3s [INFO] Creating /usr/local/bin/kubectl symlink to k3s [INFO] Creating /usr/local/bin/crictl symlink to k3s [INFO] Creating /usr/local/bin/ctr symlink to k3s [INFO] Creating killall script /usr/local/bin/k3s-killall.sh [INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh [INFO] env: Creating environment file /etc/systemd/system/k3s.service.env [INFO] systemd: Creating service file /etc/systemd/system/k3s.service [INFO] systemd: Enabling k3s unit Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service. [INFO] systemd: Starting k3s #
Dadurch wird K3s unter /usr/local/bin/k3s installiert und mehrere Symlinks zu diesem Binary erstellt. Der Installer erstellt außerdem eine Systemd-Unit und startet den Dienst bei jedem Start:
systemctl status k3s.service ● k3s.service - Lightweight Kubernetes Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-01-06 23:11:08 CET; 1 weeks 5 days ago Docs: https://k3s.io Process: 492 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS) Process: 502 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS) Main PID: 506 (k3s-server) Tasks: 328 Memory: 1.1G CGroup: /system.slice/k3s.service ├─ 506 /usr/local/bin/k3s server ├─ 1465 containerd ├─ 2042 /var/lib/rancher/k3s/data/986d5e8cf570... ├─ 2062 /pause ├─ 2300 /var/lib/rancher/k3s/data/986d5e8cf570... ├─ 2320 /pause ├─ 2383 /traefik --configfile=/config/traefik.toml ...
Connecting to your Cluster
Zum Cluster verbinden
Bei der K3s-Installation wird ein kubeconfig-File in ‚/etc/rancher/k3s/k3s.yaml‘ geschrieben, mit dem du dich zum Cluster verbinden kannst. Die kubeconfig in etwa so aus wie diese hier:
apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0... server: https://127.0.0.1:6443 name: default contexts: - context: cluster: default user: default name: default current-context: default kind: Config preferences: {} users: - name: default user: client-certificate-data: LS... client-key-data: LS...
To connect to the cluster using the kubectl command you can specify the location of the kubeconfig file with the ‚–kubeconfig‘ option as shown below:
Um mit dem Befehl kubectl mit dem Cluster zu verbinden, musst du das File mit der Option „–kubeconfig“ wie unten gezeigt angeben:
# Liste der Nodes ausgeben kubectl --kubeconfig=/etc/rancher/k3s/k3s.yaml get nodes NAME STATUS ROLES AGE VERSION vmxx28193.bydddddserver.net Ready control-plane,master 255d v1.20.0+k3s2
# Liste der Pods ausgeben kubectl --kubeconfig=/etc/rancher/k3s/k3s.yaml get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system local-path-provisioner-58fb86bdfd-r5zcp 1/1 Running 0 2m10s kube-system metrics-server-6d684c7b5-2g7wq 1/1 Running 0 2m10s kube-system helm-install-traefik-zv6bp 0/1 Completed 0 2m9s kube-system svclb-traefik-98bgg 2/2 Running 0 107s kube-system coredns-6c6bb68b64-hr2dv 1/1 Running 0 2m10s kube-system traefik-7b8b884c8-qqhgf 1/1 Running 0 107s
Lies diesen Artikel für weitere Möglichkeiten, wie du dich mit dem Cluster verbinden kannst.
UFW Firewall (optional)
Wenn dein Host direkt aus dem Internet erreichbar ist, ist es ratsam, eine Firewall zu konfigurieren. Auch wenn du bereits eine Firewall auf deinem Host konfiguriert hast, musst du eventuell ein paar Regeln hinzufügen, damit Kubernetes korrekt funktioniert. Wenn dein Host nur von deinem internen Netzwerk aus erreichbar ist kannst du diesen Teil überspringen.
Die Standard-Firewall unter Ubuntu ist UFW, daher zeige ich dir die Befehle für UFW.
Firewall-Regel für das Zulassen von Intra-Cluster-Verkehr (Credits gehen an https://jbhannah.net/articles/k3s-wireguard-kilo ):
ufw default allow routed ufw allow in on cni0 from 10.42.0.0/16 coment "K3s rule: allow traffic from kube-system pods" ufw allow in on kube-bridge from 10.42.0.0/16 comment "K3s”
Erlaube eingehenden Traffic zum Ingress Controller:
ufw allow 80/tcp comment "K8s Ingress Traefik" ufw allow 443 comment "K8s Ingress Traefik"
Erlaube Zugriff zur Kubernetes API von deinem Netz (IP Bereich passend ersetzen):
ufw allow from 10.x.x.0/24 to any port 6443 comment "K8s: allow access to kube-api from internal network" ufw allow from 2a02:abcd:abcd:abcd::/64 to any port 6443 comment "K8s: allow access to kube-api from home"
Nicht vergessen den SSH Port von deinem Netzwerk zu öffnen:
ufw allow from x.x.x.0/24 to any port 22 comment "SSH: allow SSH access from home"