it-wiki:kubernetes:installation
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
it-wiki:kubernetes:installation [2023/03/09 18:39] – [Manuelle Installation der Kubernetes-Binaries] marko | it-wiki:kubernetes:installation [2025/04/04 08:40] (aktuell) – marko | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Kubernetes Installation ====== | ====== Kubernetes Installation ====== | ||
===== Manuelle Installation der Kubernetes-Binaries ===== | ===== Manuelle Installation der Kubernetes-Binaries ===== | ||
- | **Kernel-Module in die ''/ | + | **Kernel-Module in die ''/ |
<code bash> | <code bash> | ||
br_netfilter | br_netfilter | ||
Zeile 13: | Zeile 13: | ||
</ | </ | ||
- | **System-Konfiguration anpassen (''/ | + | **System-Konfiguration anpassen (''/ |
<code bash> | <code bash> | ||
net.ipv4.ip_forward=1 | net.ipv4.ip_forward=1 | ||
Zeile 22: | Zeile 22: | ||
**System-Konfiguration laden: ** | **System-Konfiguration laden: ** | ||
<code bash> | <code bash> | ||
- | sysctl -p / | + | sysctl -p /etc/sysctl.d/ |
</ | </ | ||
Zeile 33: | Zeile 33: | ||
**Docker-Repository hinzufügen (''/ | **Docker-Repository hinzufügen (''/ | ||
<code bash> | <code bash> | ||
- | deb https:// | + | deb https:// |
</ | </ | ||
Zeile 53: | Zeile 53: | ||
'' | '' | ||
<code bash> | <code bash> | ||
+ | sandbox_image = " | ||
+ | |||
[plugins." | [plugins." | ||
SystemdCgroup = true | SystemdCgroup = true | ||
Zeile 60: | Zeile 62: | ||
<code bash> | <code bash> | ||
[plugins." | [plugins." | ||
- | endpoint = [" | + | endpoint = [" |
</ | </ | ||
Zeile 75: | Zeile 77: | ||
**Kubernetes-Repository-Schlüssel vertrauen: ** | **Kubernetes-Repository-Schlüssel vertrauen: ** | ||
- | <code bash> | + | <code bash> |
- | wget -O /etc/apt/trusted.gpg.d/kubernetes-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg | + | curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/ |
</ | </ | ||
**Kubernetes-Repository hinzufügen (''/ | **Kubernetes-Repository hinzufügen (''/ | ||
<code bash> | <code bash> | ||
- | deb https://apt.kubernetes.io/ kubernetes-xenial main | + | deb https://pkgs.k8s.io/core:/ |
</ | </ | ||
Zeile 91: | Zeile 93: | ||
**Kubernetes-Binaries installieren: | **Kubernetes-Binaries installieren: | ||
<code bash> | <code bash> | ||
- | apt install kubeadm=1.25.4-00 kubectl=1.25.4-00 kubelet=1.25.4-00 | + | apt install kubeadm=1.31.7-00 kubectl=1.31.7-00 kubelet=1.31.7-00 |
</ | </ | ||
Zeile 102: | Zeile 104: | ||
Das Setup des Clusters erfolgt in drei Schritten: | Das Setup des Clusters erfolgt in drei Schritten: | ||
- | 1. auf dem ersten Knoten ('' | + | 1. auf dem ersten Knoten ('' |
- | 2. die Control-Plane des Clusters wird um zwei Knoten erweitert ('' | + | 2. die Control-Plane des Clusters wird um zwei Knoten erweitert ('' |
- | 3. dem Cluster werden zwei Worker-Knoten hinzugefügt ('' | + | 3. dem Cluster werden zwei Worker-Knoten hinzugefügt ('' |
==== Initialisierung des Clusters ==== | ==== Initialisierung des Clusters ==== | ||
+ | **kube-vip.yml** | ||
- | Für die Initialisierung des Clusters wird auf dem ersten Knoten ('' | + | <code yaml> |
- | < | + | --- |
- | apiVersion: kubeadm.k8s.io/ | + | # task: install kube-vip for HA Kubernetes Controlplane |
+ | # hint: see https:// | ||
+ | # | ||
+ | apiVersion: v1 | ||
+ | kind: Pod | ||
+ | metadata: | ||
+ | creationTimestamp: | ||
+ | name: kube-vip | ||
+ | namespace: kube-system | ||
+ | spec: | ||
+ | containers: | ||
+ | - args: | ||
+ | - manager | ||
+ | env: | ||
+ | - name: address | ||
+ | value: need-to-be-set | ||
+ | - name: port | ||
+ | value: " | ||
+ | - name: vip_arp | ||
+ | value: " | ||
+ | - name: vip_interface | ||
+ | value: ens3 # | ||
+ | - name: vip_cidr | ||
+ | value: " | ||
+ | - name: cp_enable | ||
+ | value: " | ||
+ | - name: cp_namespace | ||
+ | value: kube-system | ||
+ | - name: vip_ddns | ||
+ | value: " | ||
+ | - name: svc_enable | ||
+ | value: " | ||
+ | - name: vip_leaderelection | ||
+ | value: " | ||
+ | - name: vip_leaseduration | ||
+ | value: " | ||
+ | - name: vip_renewdeadline | ||
+ | value: " | ||
+ | - name: vip_retryperiod | ||
+ | value: " | ||
+ | image: ghcr.io/ | ||
+ | imagePullPolicy: | ||
+ | name: kube-vip | ||
+ | resources: {} | ||
+ | securityContext: | ||
+ | capabilities: | ||
+ | add: | ||
+ | - NET_ADMIN | ||
+ | - NET_RAW | ||
+ | - SYS_TIME | ||
+ | volumeMounts: | ||
+ | - mountPath: / | ||
+ | name: kubeconfig | ||
+ | hostAliases: | ||
+ | - hostnames: | ||
+ | - kubernetes | ||
+ | ip: 127.0.0.1 | ||
+ | hostNetwork: | ||
+ | volumes: | ||
+ | - hostPath: | ||
+ | path: / | ||
+ | name: kubeconfig | ||
+ | </ | ||
+ | Die kube-vip.yaml muss auf alle controlplan Nodes unter `/ | ||
+ | Desweiteren muss **nach dem Initialisieren** und **vor dem joinen** der anderen control plane Nodes in den Cluster die `/ | ||
+ | |||
+ | |||
+ | Für die Initialisierung des Clusters wird auf dem ersten Knoten ('' | ||
+ | < | ||
+ | apiVersion: kubeadm.k8s.io/ | ||
kind: ClusterConfiguration | kind: ClusterConfiguration | ||
- | kubernetesVersion: | + | kubernetesVersion: |
- | controlPlaneEndpoint: | + | controlPlaneEndpoint: |
networking: | networking: | ||
- | podSubnet: | + | podSubnet: |
- | serviceSubnet: | + | serviceSubnet: |
--- | --- | ||
apiVersion: kubelet.config.k8s.io/ | apiVersion: kubelet.config.k8s.io/ | ||
Zeile 122: | Zeile 194: | ||
cgroupDriver: | cgroupDriver: | ||
serverTLSBootstrap: | serverTLSBootstrap: | ||
+ | resolvConf: / | ||
</ | </ | ||
- | Die beiden Subnetze können angepasst werden und sollten sich nicht der Netzwerkkonfiguration des Hosts überschneiden. | + | Die beiden Subnetze können angepasst werden und sollten sich nicht mit der Netzwerkkonfiguration des Hosts überschneiden. |
- | **Mit der Cluster-Konfiguration wird das Cluster initialisiert**: | + | **Mit der Cluster-Konfiguration wird der Cluster initialisiert**: |
<code bash> | <code bash> | ||
kubeadm init --config=init.yml --upload-certs | kubeadm init --config=init.yml --upload-certs | ||
</ | </ | ||
- | Die Option | + | Die Option |
- | Hat alles funktioniert, | + | Hat alles funktioniert, |
- | #### Erweiterung der Control-Plane | + | ==== Erweiterung der Control-Plane |
- | Wenn das Cluster-Initialisierung abgeschlossen ist, kann die Control-Plane um zwei Knoten (`master2-X.training.lab`, `master3-X.training.lab`) auf insgesamt drei Knoten erweitert werden. Dazu wird der erste `kubeadm join`-Befehl **mit** der Option | + | Wenn die Cluster-Initialisierung abgeschlossen ist, kann die Control-Plane um zwei Knoten ('' |
- | ```shell | + | <code bash> |
- | kubeadm join kubeapi-X.training.lab:6443 --token < | + | kubeadm join kubeapi.tuxnet.lab:6443 --token < |
- | ``` | + | </ |
+ | |||
+ | <note important> | ||
Der Certificate-Key ist zwei Stunden gültig. Falls seit der Cluster-Initialisierung mehr als zwei Stunden vergangen sind, kann ein neuer Schlüssel erzeugt werden (die Doppelung im Befehl ist notwendig): | Der Certificate-Key ist zwei Stunden gültig. Falls seit der Cluster-Initialisierung mehr als zwei Stunden vergangen sind, kann ein neuer Schlüssel erzeugt werden (die Doppelung im Befehl ist notwendig): | ||
- | ```shell | + | <code bash> |
kubeadm init phase upload-certs --upload-certs | kubeadm init phase upload-certs --upload-certs | ||
- | ``` | + | </ |
- | #### Hinzufügen der Worker-Knoten | + | ==== Hinzufügen der Worker-Knoten |
- | Ist die Control-Plane vollständig, | + | Ist die Control-Plane vollständig, |
- | ```shell | + | <code bash> |
- | kubeadm join kubeapi-X.training.lab:6443 --token < | + | kubeadm join kubeapi.tuxnet.lab:6443 --token < |
- | ``` | + | </ |
Der Token ist 24 Stunden gültig. Soll nach Ablauf dieser Zeit ein Knoten hinzugefügt werden, muss ein neuer Token erzeugt werden: | Der Token ist 24 Stunden gültig. Soll nach Ablauf dieser Zeit ein Knoten hinzugefügt werden, muss ein neuer Token erzeugt werden: | ||
- | ```shell | + | <code bash> |
kubeadm token create --print-join-command | kubeadm token create --print-join-command | ||
- | ``` | + | </ |
- | ### kubectl auf dem Jumphost einrichten | + | ===== kubectl auf dem Jumphost einrichten |
Das Cluster ist jetzt vollständig. Die weitere Administration des Clusters soll vom Jumphost aus erfolgen. | Das Cluster ist jetzt vollständig. Die weitere Administration des Clusters soll vom Jumphost aus erfolgen. | ||
- | Dazu wird zunächst | + | Dazu wird zunächst |
- | ```shell | + | <code bash> |
mkdir bin | mkdir bin | ||
source .profile | source .profile | ||
- | wget -O bin/kubectl https:// | + | wget -O bin/kubectl https:// |
chmod +x bin/kubectl | chmod +x bin/kubectl | ||
- | ``` | + | </ |
- | Die Konfiguration für `kubectl` wird von einem Control-Plane-Knoten in die _Datei_ | + | Die Konfiguration für '' |
- | ```shell | + | <code bash> |
mkdir -m 700 .kube | mkdir -m 700 .kube | ||
- | scp root@master1-X.training.lab:/ | + | scp root@control1.tuxnet.lab:/ |
- | ``` | + | </ |
Jetzt ist der Zugriff auf Clusters vom Jumphost aus möglich: | Jetzt ist der Zugriff auf Clusters vom Jumphost aus möglich: | ||
- | ```console | + | <code bash> |
user0@jumphost: | user0@jumphost: | ||
NAME STATUS | NAME STATUS | ||
- | master1-0 | + | control1 |
- | master2-0 | + | control2 |
- | master3-0 | + | control3 |
- | worker1-0 | + | node1 |
- | worker2-0 | + | node2 |
- | ``` | + | </ |
- | ### Abschluss der Cluster-Installation | + | ===== Abschluss der Cluster-Installation |
+ | ==== Calico installieren ==== | ||
- | #### Calico installieren | + | Bisher werden die Knoten als '' |
- | Bisher werden die Knoten als `NotReady` angezeigt. Das ist an dieser Stelle das erwartete Verhalten. Die Ursache dafür ist, dass noch kein Netzwerk-Plugin installiert ist. | + | Daher wird jetzt '' |
- | + | <code bash> | |
- | Daher wird jetzt `Calico` in das Cluster installiert: | + | kubectl apply -f https:// |
- | ```shell | + | </ |
- | kubectl apply -f https:// | + | |
- | ``` | + | |
- | Nach einer Weile sind die Knoten | + | Nach einer Weile sind die Knoten |
- | ```console | + | <code bash> |
user0@jumphost: | user0@jumphost: | ||
NAME STATUS | NAME STATUS | ||
- | master1-0 | + | control1 |
- | master2-0 | + | control2 |
- | master3-0 | + | control3 |
- | worker1-0 | + | node1 Ready < |
- | worker2-0 | + | node2 Ready < |
- | ``` | + | </ |
- | #### Kubelet-Zertifikate signieren | + | ==== Kubelet-Zertifikate signieren |
Als letzter Schritt müssen die Kubelet-Zertifikate signiert werden. Dazu werden zunächst die offenen Zertifikatsanfragen angezeigt: | Als letzter Schritt müssen die Kubelet-Zertifikate signiert werden. Dazu werden zunächst die offenen Zertifikatsanfragen angezeigt: | ||
- | ```shell | + | <code bash> |
kubectl get certificatesigningrequests | grep -i pending | kubectl get certificatesigningrequests | grep -i pending | ||
- | ``` | + | </ |
Die jeweils jüngste Anfrage eines Knotens wird signiert: | Die jeweils jüngste Anfrage eines Knotens wird signiert: | ||
- | ```shell | + | <code bash> |
kubectl certificate approve csr-xxxxx csr-yyyyy csr-zzzzz | kubectl certificate approve csr-xxxxx csr-yyyyy csr-zzzzz | ||
- | ``` | + | </ |
Alternativ | Alternativ | ||
- | `kubectl get csr` | + | '' |
- | `kubectl delete csr --all` | + | '' |
- | `kubectl certificate approve <csr>` | + | '' |
An dieser Stelle ist das Setup des Cluster abgeschlossen. | An dieser Stelle ist das Setup des Cluster abgeschlossen. | ||
- | ### kubectl von Adminworkstation | + | ==== kubectl von Adminworkstation |
https:// | https:// | ||
- | ``` | + | <code bash> |
mkdir bin | mkdir bin | ||
source .profile | source .profile | ||
- | wget https:// | + | wget https:// |
chmod +x kubectl | chmod +x kubectl | ||
mv kubectl bin | mv kubectl bin | ||
mkdir .kube | mkdir .kube | ||
scp root@master-x:/ | scp root@master-x:/ | ||
- | ``` | + | </ |
- | ### Bash Anpassungen | + | ==== Bash Anpassungen |
- | vim ~/ | + | '' |
- | ``` | + | <code bash> |
# enable bash completion | # enable bash completion | ||
- | source <( kubectl completion bash | sed ' | + | source < |
alias k=kubectl | alias k=kubectl | ||
- | ``` | + | complete -F __start_kubectl k |
+ | </ | ||
- | `$ source .bash_aliases` | + | '' |
+ | |||
+ | === oder === | ||
+ | <code bash> | ||
+ | mkdir -p ~/ | ||
+ | kubectl completion bash > ~/ | ||
+ | </ | ||
+ | und in der .bashrc dann | ||
+ | <code bash> | ||
+ | # kubectl bash complition | ||
+ | source < | ||
+ | </ | ||
+ | |||
+ | === oder === | ||
+ | am Ende der .profile | ||
+ | <code bash> | ||
+ | # kubectl alias and bash completion | ||
+ | # https:// | ||
+ | source < | ||
+ | alias k=kubectl | ||
+ | complete -F __start_kubectl k | ||
+ | </ | ||
+ | |||
+ | |||
+ | Für Helm würde selbiges funktionieren | ||
+ | <code bash> | ||
+ | mkdir -p ~/ | ||
+ | helm completion bash > ~/ | ||
+ | </ | ||
+ | ==== Installation Krew PlugIn Manager ===== | ||
+ | <code yaml> | ||
+ | ( set -x; cd " | ||
+ | export PATH=" | ||
+ | echo ' | ||
+ | kubectl krew | ||
+ | kubectl krew update | ||
+ | kubectl krew install ctx | ||
+ | kubectl krew install neat | ||
+ | </ |
it-wiki/kubernetes/installation.1678387172.txt.gz · Zuletzt geändert: 2023/03/09 18:39 von marko