Inhaltsverzeichnis
Voraussetzungen
Für einen RKE2 Cluster benötigen wir drei Linux Systeme für die Control Plane. Bei mir sind es drei Arch VMs (cp1.home,cp2.home,cp3.home) mit jeweils 2 Cores und 6GB Ram, es sollte aber mit jeder Distribution funktionieren. Wichtig ist, dass die VMs sich auch gegenseitig mit Namen auflösen können. Man kann auch mit einer Single Node Installation starten, dann fehlt einem die Redundanz und bei Systemupdates ist die Verfügbarkeit eingeschränkt. Was zusätzlich von Vorteil ist, ist eine eigene Domain um auf Kubernets Dienste zuzugreifen. Praktisch ist hier Cloudflare als Hoster, dort habe ich auch meine Testdomain liegen.
Installation und Konfiguration des ersten Nodes
Die Installation des ersten Nodes ist etwas umfangreicher, da hier auch die initiale Clusterkonfiguration mit vorgenommen wird. Zuerst gehören aber die Binaries installiert. Das geht über rpm oder tarball. Ich nutze letzteres, da diese Methode auf allen Linux Distributionen funktioniert.
# Installation direkt als root durchführen
curl -sfL https://get.rke2.io | sh -
Code-Sprache: Bash (bash)
Vor dem ersten Starten müssen wir rke2 noch konfigurieren. Alle Konfigurationsdateien befinden sich auch auf Github im Repository https://github.com/worli-info/rke2-setup
# Zuerst das Konfig Verzeichnis erstellen
mkdir -p /etc/rancher/rke2
Code-Sprache: Bash (bash)
Danach die config.yaml aus dem Repository /config/config.yaml reinkopieren
write-kubeconfig-mode: "0644"
tls-san:
- "cp1"
- "cp2"
- "cp3"
- "cp1.home"
- "cp2.home"
- "cp3.home"
debug: true
cni:
- "multus"
- "cilium"
disable-kube-proxy: true
embedded-registry: true
kube-apiserver-arg:
- "audit-log-path=/var/log/rke2/audit.log"
- "audit-log-maxage=40"
- "audit-log-maxbackup=15"
- "audit-log-maxsize=150"
Code-Sprache: YAML (yaml)
Um kubectl im Pfad zu haben und ein paar aliase zu setzen habe ich im Repository unter /user meine .profile und .vimrc abgelegt.
alias vi=vim
alias kn="kubectl config set-context --current --namespace "
alias oc=kubectl
alias k=kubectl
alias ls="ls --color "
export EDITOR=vim
export PATH=$PATH:/var/lib/rancher/rke2/bin
export KUBECONFIG=/var/lib/rancher/rke2/server/cred/admin.kubeconfig
Code-Sprache: JavaScript (javascript)
set mouse=
syntax on
set expandtab
set smarttab
set shiftwidth=2
set tabstop=2
Code-Sprache: JavaScript (javascript)
Auf meinem arch System installiere ich noch die bash-completion:
pacman -Sy bash-completion
Jetzt können wir zum ersten Mal rke2 starten:
systemctl start rke2-server
Um nicht immer den Namespace tippen zu müssen setzen wir den Namespace vom aktuellen Kontext mit meinem alias „kn“ um und schauen uns an welche Pods laufen:
kn kube-system
kubectl get pods
NAME READY STATUS RESTARTS AGE
cilium-jxgxm 0/1 Init:1/7 1 (42s ago) 2m4s
cilium-operator-65b696c86-7gwg6 0/1 Running 1 (34s ago) 2m4s
cilium-operator-65b696c86-cdxqf 0/1 Pending 0 2m4s
cloud-controller-manager-cp1 1/1 Running 0 2m15s
etcd-cp1 1/1 Running 0 2m15s
helm-install-rke2-cilium-852c7 0/1 Completed 0 2m11s
helm-install-rke2-coredns-ktmqp 0/1 Completed 0 2m11s
helm-install-rke2-ingress-nginx-2xcxw 0/1 Pending 0 2m11s
helm-install-rke2-metrics-server-lwckm 0/1 Pending 0 2m11s
helm-install-rke2-multus-dlc56 0/1 Completed 0 2m11s
helm-install-rke2-runtimeclasses-sv7jx 0/1 Pending 0 2m11s
helm-install-rke2-snapshot-controller-crd-sf7mz 0/1 Pending 0 2m11s
helm-install-rke2-snapshot-controller-cszx6 0/1 Pending 0 2m11s
kube-apiserver-cp1 1/1 Running 0 2m15s
kube-controller-manager-cp1 1/1 Running 0 2m15s
kube-scheduler-cp1 1/1 Running 0 2m15s
rke2-coredns-rke2-coredns-86c455b944-7jxq7 0/1 Pending 0 2m4s
rke2-coredns-rke2-coredns-autoscaler-79677f89c4-5q4jb 0/1 Pending 0 2m4s
rke2-multus-2lgvf 0/1 CrashLoopBackOff 4 (30s ago) 2m4s
Code-Sprache: JavaScript (javascript)
Wir sehen jetzt, das die beiden CNI nicht wirklich starten. Der Pod für Multus stürzt ab und der cilium-operator und auch die cilium Instanz für den Node kommen nicht online. Das liegt an der fehlenden cilium Konfiguration. Die können wir erst nach dem ersten Start setzen. Selbst wenn wir aber die cilium Konfig jetzt ablegen können die operator Pods nicht automatisiert durchstarten. Hier stoßen wir an die default Settings: zwei Operator Pods müssen auf zwei unterschiedlichen Kubernetes Nodes laufen und beim Update/Rollout einer neuen Version darf nur maximal 50% ausfallen.
Wir legen jetzt die rke2-cilium-config.yaml (Im Repository unter manifests) nach /var/lib/rancher/rke2/server/manifests und sehen und dann den Status an.
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: rke2-cilium
namespace: kube-system
spec:
valuesContent: |-
kubeProxyReplacement: true
k8sServiceHost: "localhost"
k8sServicePort: "6443"
hubble:
enabled: true
relay:
enabled: true
ui:
enabled: true
ingressController:
enabled: true
loadbalancerMode: shared
gatewayAPI:
enabled: true
updateStrategy:
rollingUpdate:
maxUnavailable: 3
bgpControlPlane:
enabled: true
Code-Sprache: YAML (yaml)
kubectl get pods
NAME READY STATUS RESTARTS AGE
cilium-d92vh 0/1 Running 0 4m50s
cilium-operator-65b696c86-7gwg6 0/1 CrashLoopBackOff 9 (65s ago) 23m
cilium-operator-6f7b9975f7-6w8x6 0/1 Pending 0 4m50s
cilium-operator-6f7b9975f7-zwlqk 0/1 Pending 0 4m50s
cloud-controller-manager-cp1 1/1 Running 0 23m
etcd-cp1 1/1 Running 0 23m
helm-install-rke2-cilium-cq8q9 0/1 Completed 0 4m53s
helm-install-rke2-coredns-ktmqp 0/1 Completed 0 23m
helm-install-rke2-ingress-nginx-2xcxw 0/1 Pending 0 23m
helm-install-rke2-metrics-server-lwckm 0/1 Pending 0 23m
helm-install-rke2-multus-dlc56 0/1 Completed 0 23m
helm-install-rke2-runtimeclasses-sv7jx 0/1 Pending 0 23m
helm-install-rke2-snapshot-controller-crd-sf7mz 0/1 Pending 0 23m
helm-install-rke2-snapshot-controller-cszx6 0/1 Pending 0 23m
hubble-relay-57f4c565fb-s94nk 0/1 Pending 0 4m50s
hubble-ui-7677cbb7c-sjxjq 0/2 Pending 0 4m50s
kube-apiserver-cp1 1/1 Running 0 23m
kube-controller-manager-cp1 1/1 Running 0 23m
kube-scheduler-cp1 1/1 Running 0 23m
rke2-coredns-rke2-coredns-86c455b944-7jxq7 0/1 Pending 0 23m
rke2-coredns-rke2-coredns-autoscaler-79677f89c4-5q4jb 0/1 Pending 0 23m
rke2-multus-2lgvf 0/1 CrashLoopBackOff 9 (2m45s ago) 23m
Code-Sprache: JavaScript (javascript)
Wir sehen das erwartete: Das Operator Deployment 65b696c86 wurde auf einen Pod reduziert. Die beiden neuen Pods sind aber auf Pending, da die nicht auf dem gleichen Kubernetes Node laufen dürfen.
Es gibt jetzt mehrere Varianten das zu lösen:
- Quick and Dirty: Wir löschen den Pod cilium-operator-65b696c86-7gwg6. Damit kann ein neuer Pod mit der richtigen Konfig hochfahren und cilium sollte funktionieren. Nachteil bei jedem Update an der cilium Konfig bzw einem rke2 Update haben wir wieder das Problem und der Schönheitsfehler ein Operator Pods auf Pending bleibt auch
- Wir fahren mit der Cluster Installation fort, dann haben wir einen bzw zwei Nodes zusätzlich und haben das Problem nicht mehr. (Das machen wir)
- Bei einer Single Node Installation haben wir aber die Möglichkeit nicht. Da bleibt uns nur die Umstellung der Operator Pod Anzahl, des MaxUnavailable Werts (100%) im Rollout, oder die PodAffinity Regeln, damit zwei Operator Pods auf einem Node laufen dürfen. Diese Option betrachte ich jetzt nicht. Falls doch ein Beispiel gebraucht wird, dann bitte kommentieren.
Zweiten und dritten Node zum Cluster hinzufügen
Wir müssen hier wieder die rke2 binaries installieren und das Konfig Verzeichnis anlegen:
curl -sfL https://get.rke2.io | sh -
mkdir -p /etc/rancher/rke2
Code-Sprache: JavaScript (javascript)
Für den Server Join ist die Konfig Datei aber einfacher, was wir aber brauchen ist der generierte Token vom ersten Server (cp1). Dieser liegt unter /var/lib/rancher/rke2/server/node-token Die Konfig sieht dann so aus, der Token und Servername vom ersten Server muss natürlich geändert werden. Eine Beispiel config Datei befindet sich im repo unter config/config2.xml
server: https://cp1.home:9345
token: K10f07d244ed11093e8651214836ee213efef6090d40c64bb849cc823fd17513fcf::server:b656f35f967ec682ff4b6f683d843cb7
write-kubeconfig-mode: "0644"
tls-san:
- "cp1"
- "cp2"
- "cp3"
- "cp1.home"
- "cp2.home"
- "cp3.home"
cni:
- "multus"
- "cilium"
disable-kube-proxy: true
embedded-registry: true
kube-apiserver-arg:
- "audit-log-path=/var/log/rke2/audit.log"
- "audit-log-maxage=40"
- "audit-log-maxbackup=15"
- "audit-log-maxsize=150"
Code-Sprache: PHP (php)
Jetzt können wir den Service starten
systemctl start rke2-server
Code-Sprache: Bash (bash)
Dasselbe für den dritten Server wiederholen. Danach sollte der cluster und die Pods wie folgt aussehen:
kubectl get pods && kubectl get nodes
NAME READY STATUS RESTARTS AGE
cilium-b9dtk 1/1 Running 0 10m
cilium-mddsn 1/1 Running 0 12m
cilium-operator-6f7b9975f7-dkljb 1/1 Running 0 12m
cilium-operator-6f7b9975f7-tkmnq 1/1 Running 0 12m
cilium-qktg4 1/1 Running 0 5m45s
cloud-controller-manager-cp1 1/1 Running 1 (15m ago) 15m
cloud-controller-manager-cp2 1/1 Running 0 9m59s
cloud-controller-manager-cp3 1/1 Running 0 5m31s
etcd-cp1 1/1 Running 0 15m
etcd-cp2 1/1 Running 0 9m59s
etcd-cp3 1/1 Running 0 5m31s
helm-install-rke2-cilium-zh752 0/1 Completed 0 12m
helm-install-rke2-coredns-fl66w 0/1 Completed 0 15m
helm-install-rke2-ingress-nginx-bmxnr 0/1 Completed 0 15m
helm-install-rke2-metrics-server-q964b 0/1 Completed 0 15m
helm-install-rke2-multus-f64vt 0/1 Completed 0 15m
helm-install-rke2-runtimeclasses-mc4g2 0/1 Completed 0 15m
helm-install-rke2-snapshot-controller-99cvx 0/1 Completed 1 15m
helm-install-rke2-snapshot-controller-crd-d8x9b 0/1 Completed 0 15m
hubble-relay-57f4c565fb-cx5nd 1/1 Running 0 12m
hubble-ui-7677cbb7c-8k8cp 2/2 Running 0 12m
kube-apiserver-cp1 1/1 Running 0 15m
kube-apiserver-cp2 1/1 Running 0 9m59s
kube-apiserver-cp3 1/1 Running 0 5m31s
kube-controller-manager-cp1 1/1 Running 0 15m
kube-controller-manager-cp2 1/1 Running 0 9m59s
kube-controller-manager-cp3 1/1 Running 0 5m31s
kube-scheduler-cp1 1/1 Running 0 15m
kube-scheduler-cp2 1/1 Running 0 9m59s
kube-scheduler-cp3 1/1 Running 0 5m31s
rke2-coredns-rke2-coredns-86c455b944-95pks 1/1 Running 0 9m28s
rke2-coredns-rke2-coredns-86c455b944-fqdph 1/1 Running 0 15m
rke2-coredns-rke2-coredns-autoscaler-79677f89c4-77n29 1/1 Running 0 15m
rke2-ingress-nginx-controller-4fdkz 1/1 Running 0 9m33s
rke2-ingress-nginx-controller-bcd9v 1/1 Running 0 9m33s
rke2-ingress-nginx-controller-jr4gq 1/1 Running 0 5m5s
rke2-metrics-server-69bdccfdd9-5wfrb 1/1 Running 0 9m42s
rke2-multus-8nkdc 1/1 Running 6 (12m ago) 15m
rke2-multus-c66lp 1/1 Running 2 (9m45s ago) 10m
rke2-multus-rg79w 1/1 Running 2 (5m17s ago) 5m45s
rke2-snapshot-controller-696989ffdd-rtdcc 1/1 Running 0 9m39s
NAME STATUS ROLES AGE VERSION
cp1 Ready control-plane,etcd,master 15m v1.32.8+rke2r1
cp2 Ready control-plane,etcd,master 10m v1.32.8+rke2r1
cp3 Ready control-plane,etcd,master 5m45s v1.32.8+rke2r1
Code-Sprache: JavaScript (javascript)
Der Cluster ist jetzt bereit für die ersten Anwendungen. Der nächste Teil meiner Anleitung wird argocd und cert-manager installieren. Sobald es online ist wird es hier verlinkt.