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/rke2Code-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.kubeconfigCode-Sprache: JavaScript (javascript)
set mouse=
syntax on

set expandtab
set smarttab
set shiftwidth=2
set tabstop=2Code-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/rke2Code-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-serverCode-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+rke2r1Code-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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.