Benutzer-Werkzeuge

Webseiten-Werkzeuge


it-wiki:kubernetes:installation

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
it-wiki:kubernetes:installation [2023/03/09 18:39] – [Manuelle Installation der Kubernetes-Binaries] markoit-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 ''/etc/modules'' eintragen:**+**Kernel-Module in die ''/etc/modules-load.d/modules.conf'' eintragen:**
 <code bash> <code bash>
 br_netfilter br_netfilter
Zeile 13: Zeile 13:
 </code> </code>
  
-**System-Konfiguration anpassen (''/etc/sysctl.conf''): **+**System-Konfiguration anpassen (''/etc/sysctl.d/90.kubernetes.conf''): **
 <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 /etc/sysctl.conf+sysctl -p /etc/sysctl.d/90.kubernetes.conf
 </code> </code>
  
Zeile 33: Zeile 33:
 **Docker-Repository hinzufügen (''/etc/apt/sources.list.d/docker.list''): ** **Docker-Repository hinzufügen (''/etc/apt/sources.list.d/docker.list''): **
 <code bash> <code bash>
-deb https://download.docker.com/linux/debian/ bullseye stable+deb https://download.docker.com/linux/debian/ bookworm stable
 </code> </code>
  
Zeile 53: Zeile 53:
 ''containerd-Konfiguration ''/etc/containerd/config.toml'' anpassen:'' ''containerd-Konfiguration ''/etc/containerd/config.toml'' anpassen:''
 <code bash> <code bash>
 +sandbox_image = "registry.k8s.io/pause:3.10"
 +
 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
   SystemdCgroup = true   SystemdCgroup = true
Zeile 60: Zeile 62:
 <code bash> <code bash>
 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
-  endpoint = ["https://registry.training.lab:5000"]+  endpoint = ["https://registry.tuxnet.lab:5000"]
 </code> </code>
  
Zeile 75: Zeile 77:
  
 **Kubernetes-Repository-Schlüssel vertrauen: ** **Kubernetes-Repository-Schlüssel vertrauen: **
-<code bash> +<code bash>  
-wget -/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/deb/Release.key | gpg --dearmor --output /etc/apt/trusted.gpg.d/kubernetes-keyring.gpg
 </code> </code>
  
 **Kubernetes-Repository hinzufügen (''/etc/apt/sources.list.d/kubernetes.list''): ** **Kubernetes-Repository hinzufügen (''/etc/apt/sources.list.d/kubernetes.list''): **
 <code bash> <code bash>
-deb https://apt.kubernetes.io/ kubernetes-xenial main+deb https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /
 </code> </code>
  
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
 </code> </code>
  
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 (''k8s-control1.tuxnet.lan'') wird der Cluster initialisiert +1. auf dem ersten Knoten (''control1.tuxnet.lab'') wird der Cluster initialisiert 
-2. die Control-Plane des Clusters wird um zwei Knoten erweitert (''k8s-control2.tuxnet.lan'', ''k8s-control3.tuxnet.lan''+2. die Control-Plane des Clusters wird um zwei Knoten erweitert (''control2.tuxnet.lab'', ''control3.tuxnet.lab''
-3. dem Cluster werden zwei Worker-Knoten hinzugefügt (''k8s-worker1.tuxnet.lan'', ''k8s-worker2.tuxnet.lan'')+3. dem Cluster werden zwei Worker-Knoten hinzugefügt (''node1.tuxnet.lab'', ''node2.tuxnet.lab'')
  
 ==== Initialisierung des Clusters ==== ==== Initialisierung des Clusters ====
 +**kube-vip.yml**
  
-Für die Initialisierung des Clusters wird auf dem ersten Knoten (''k8s-control1.tuxnet.lan'') eine Datei mit der Cluster-Konfiguration benötigt (''init.yml''): +<code yaml> 
-<code bash+--- 
-apiVersion: kubeadm.k8s.io/v1beta3+# task: install kube-vip for HA Kubernetes Controlplane 
 +# hint: see https://kube-vip.io/docs/installation/static/#example-arp-manifest 
 +
 +apiVersion: v1 
 +kind: Pod 
 +metadata: 
 +  creationTimestamp: null 
 +  name: kube-vip 
 +  namespace: kube-system 
 +spec: 
 +  containers: 
 +  - args: 
 +    - manager 
 +    env: 
 +    - name: address 
 +      value: need-to-be-set                       # use your own kubevip 
 +    - name: port 
 +      value: "6443" 
 +    - name: vip_arp 
 +      value: "true" 
 +    - name: vip_interface                         # use your own network interface 
 +      value: ens3                                 #    e.g. ens3, eth0 
 +    - name: vip_cidr 
 +      value: "32" 
 +    - name: cp_enable 
 +      value: "true" 
 +    - name: cp_namespace 
 +      value: kube-system 
 +    - name: vip_ddns 
 +      value: "false" 
 +    - name: svc_enable 
 +      value: "false" 
 +    - name: vip_leaderelection 
 +      value: "true" 
 +    - name: vip_leaseduration 
 +      value: "5" 
 +    - name: vip_renewdeadline 
 +      value: "3" 
 +    - name: vip_retryperiod 
 +      value: "1" 
 +    image: ghcr.io/kube-vip/kube-vip:v0.8.9     # change: to internal registry, if needed 
 +    imagePullPolicy: Always 
 +    name: kube-vip 
 +    resources: {} 
 +    securityContext: 
 +      capabilities: 
 +        add: 
 +        - NET_ADMIN 
 +        - NET_RAW 
 +        - SYS_TIME 
 +    volumeMounts: 
 +    - mountPath: /etc/kubernetes/admin.conf 
 +      name: kubeconfig 
 +  hostAliases: 
 +  - hostnames: 
 +    - kubernetes 
 +    ip: 127.0.0.1 
 +  hostNetwork: true 
 +  volumes: 
 +  - hostPath: 
 +      path: /etc/kubernetes/super-admin.conf          # for kubernetes >v1.29.x use super-admin.conf 
 +    name: kubeconfig 
 +</code> 
 +Die kube-vip.yaml muss auf alle controlplan Nodes unter `/etc/kubernetes/manifests/` kopiert werden. 
 +Desweiteren muss **nach dem Initialisieren** und **vor dem joinen** der anderen control plane Nodes in den Cluster die `/etc/kubernetes/super-admin.conf` auf die anderen anderen control plane Nodes kopiert werden 
 + 
 + 
 +Für die Initialisierung des Clusters wird auf dem ersten Knoten (''control1.tuxnet.lab'') eine Datei mit der Cluster-Konfiguration benötigt (''init.yml''): 
 +<code yaml
 +apiVersion: kubeadm.k8s.io/v1beta4
 kind: ClusterConfiguration kind: ClusterConfiguration
-kubernetesVersion: 1.25.4 +kubernetesVersion: 1.31.7 
-controlPlaneEndpoint: kubeapi.tuxnet.lan:6443+controlPlaneEndpoint: kubeapi.tuxnet.lab:6443
 networking: networking:
-  podSubnet: 10.30.0.0/16 +  podSubnet: 100.73.0.0/16 
-  serviceSubnet: 10.40.0.0/16+  serviceSubnet: 100.74.0.0/16
 --- ---
 apiVersion: kubelet.config.k8s.io/v1beta1 apiVersion: kubelet.config.k8s.io/v1beta1
Zeile 122: Zeile 194:
 cgroupDriver: systemd cgroupDriver: systemd
 serverTLSBootstrap: true serverTLSBootstrap: true
 +resolvConf: /etc/resolv.conf             # kann man auch weglassen
 </code> </code>
  
-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
 </code> </code>
  
-Die Option `--upload-certsbewirkt, dass die Cluster-Zertifikate temporär und verschlüsselt in der Cluster-Datenbank gespeichert werden. Dies vereinfacht die Erweiterung der Control-Plane, da die Zertifikate nicht händisch kopiert werden müssen.+Die Option ''--upload-certs'' bewirkt, dass die Cluster-Zertifikate temporär und verschlüsselt in der Cluster-Datenbank gespeichert werden. Dies vereinfacht die Erweiterung der Control-Plane, da die Zertifikate nicht händisch kopiert werden müssen.
  
-Hat alles funktioniert, werden am Ende zwei `kubeadm join`-Befehle angezeigt. Die Ausgabe sollte gespeichert werden, da die angezeigten Befehle auf den anderen Knoten benötigt werden.+Hat alles funktioniert, werden am Ende zwei ''kubeadm join''-Befehle angezeigt. Die Ausgabe sollte gespeichert werden, da die angezeigten Befehle auf den anderen Knoten benötigt werden.
  
-#### 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 `--control-planeverwendet: +Wenn die Cluster-Initialisierung abgeschlossen ist, kann die Control-Plane um zwei Knoten (''control2.tuxnet.lab''''control3.tuxnet.lab'') auf insgesamt drei Knoten erweitert werden. Dazu wird der erste ''kubeadm join''-Befehl **mit** der Option ''--control-plane'' verwendet: 
-```shell +<code bash> 
-kubeadm join kubeapi-X.training.lab:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash> --control-plane --certificate-key <key> +kubeadm join kubeapi.tuxnet.lab:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash> --control-plane --certificate-key <key> 
-```+</code> 
 + 
 +<note important>Wenn die HA Fähigkeit mittels kube-vip angewendet wird, dann muss auf allen control-plane Nodes sowohl die kube-vip.yaml als auch die super-admin.conf kopiert werden.</note>
  
 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
-```+</code>
  
-#### Hinzufügen der Worker-Knoten+==== Hinzufügen der Worker-Knoten ====
  
-Ist die Control-Plane vollständig, können dem Cluster die Worker-Knoten hinzugefügt werden. Dazu wird der zweite `kubeadm join`-Befehl **ohne** die Option `--control-planeverwendet: +Ist die Control-Plane vollständig, können dem Cluster die Worker-Knoten hinzugefügt werden. Dazu wird der zweite ''kubeadm join''-Befehl **ohne** die Option ''--control-plane'' verwendet: 
-```shell +<code bash> 
-kubeadm join kubeapi-X.training.lab:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash> +kubeadm join kubeapi.tuxnet.lab:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash> 
-```+</code>
  
 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
-```+</code>
  
-### 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 `kubectlim `bin`-Verzeichnis des Benutzers (`/home/userX/bin`) installiert: +Dazu wird zunächst ''kubectl'' im ''bin''-Verzeichnis des Benutzers (''/home/<user>/bin'') installiert: 
-```shell+<code bash>
 mkdir bin mkdir bin
 source .profile source .profile
-wget -O bin/kubectl https://dl.k8s.io/release/v1.25.4/bin/linux/amd64/kubectl+wget -O bin/kubectl https://dl.k8s.io/release/v1.31.1/bin/linux/amd64/kubectl
 chmod +x bin/kubectl chmod +x bin/kubectl
-```+</code>
  
-Die Konfiguration für `kubectlwird von einem Control-Plane-Knoten in die _Datei_ `.kube/configkopiert: +Die Konfiguration für ''kubectl'' wird von einem Control-Plane-Knoten in die _Datei_ ''.kube/config'' kopiert: 
-```shell+<code bash>
 mkdir -m 700 .kube mkdir -m 700 .kube
-scp root@master1-X.training.lab:/etc/kubernetes/admin.conf .kube/config +scp root@control1.tuxnet.lab:/etc/kubernetes/admin.conf .kube/config 
-```+</code>
  
 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:~$ kubectl get nodes user0@jumphost:~$ kubectl get nodes
 NAME        STATUS   ROLES           AGE     VERSION NAME        STATUS   ROLES           AGE     VERSION
-master1-0   NotReady   control-plane   97s   v1.25.4 +control1   NotReady   control-plane   97s   v1.31.7 
-master2-0   NotReady   control-plane   57s   v1.25.4 +control2   NotReady   control-plane   57s   v1.31.7 
-master3-0   NotReady   control-plane   55s   v1.25.4 +control3   NotReady   control-plane   55s   v1.31.7 
-worker1-0   NotReady   <none>          5s    v1.25.4 +node1      NotReady   <none>          5s    v1.31.7 
-worker2-0   NotReady   <none>          5s    v1.25.4 +node2      NotReady   <none>          5s    v1.31.7 
-```+</code>
  
-### Abschluss der Cluster-Installation+===== Abschluss der Cluster-Installation ===== 
 +==== Calico installieren ====
  
-#### Calico installieren+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.
  
-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 ''Calico'' in das Cluster installiert: 
- +<code bash> 
-Daher wird jetzt `Calicoin das Cluster installiert: +kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.3/manifests/calico.yaml 
-```shell +</code>
-kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml +
-```+
  
-Nach einer Weile sind die Knoten `Ready`+Nach einer Weile sind die Knoten ''Ready''
-```console+<code bash>
 user0@jumphost:~$ kubectl get nodes user0@jumphost:~$ kubectl get nodes
 NAME        STATUS   ROLES           AGE   VERSION NAME        STATUS   ROLES           AGE   VERSION
-master1-0   Ready    control-plane   12m   v1.25.4 +control1    Ready    control-plane   12m   v1.31.7 
-master2-0   Ready    control-plane   12m   v1.25.4 +control2    Ready    control-plane   12m   v1.31.7 
-master3-0   Ready    control-plane   12m   v1.25.4 +control3    Ready    control-plane   12m   v1.31.7 
-worker1-0   Ready    <none>          11m   v1.25.4 +node1       Ready    <none>          11m   v1.31.7 
-worker2-0   Ready    <none>          11m   v1.25.4 +node2       Ready    <none>          11m   v1.31.7 
-```+</code>
  
-#### 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
-```+</code>
  
 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
-```+</code>
  
 Alternativ Alternativ
-`kubectl get csr` +''kubectl get csr'' 
-`kubectl delete csr --all` +''kubectl delete csr --all'' 
-`kubectl certificate approve <csr>`+''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://kubernetes.io/docs/tasks/tools/install-kubectl-linux/ https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/
  
-```+<code bash>
 mkdir bin mkdir bin
 source .profile source .profile
-wget https://dl.k8s.io/release/v1.24.3/bin/linux/amd64/kubectl+wget https://dl.k8s.io/release/v1.31.7/bin/linux/amd64/kubectl
 chmod +x kubectl chmod +x kubectl
 mv kubectl bin mv kubectl bin
 mkdir .kube mkdir .kube
 scp root@master-x:/etc/kubernetes/admin.conf .kube/config scp root@master-x:/etc/kubernetes/admin.conf .kube/config
-```+</code>
  
-### Bash Anpassungen +==== Bash Anpassungen ==== 
-vim ~/.bash_aliases +''vim ~/.bash_aliases'' 
-```+<code bash>
 # enable bash completion # enable bash completion
-source <( kubectl completion bash | sed 's#kubectl$#kubectl k#g' )+source <(kubectl completion bash)
 alias k=kubectl alias k=kubectl
-```+complete -F __start_kubectl k 
 +</code>
  
-`$ source .bash_aliases`+''$ source .bash_aliases'' 
 + 
 +=== oder === 
 +<code bash> 
 +mkdir -p ~/.local/share/bash-completion/completions/ 
 +kubectl completion bash > ~/.local/share/bash-completion/completions/kubectl 
 +</code> 
 +und in der .bashrc dann 
 +<code bash> 
 +# kubectl bash complition 
 +source <(kubectl completion bash) 
 +</code> 
 + 
 +=== oder === 
 +am Ende der .profile 
 +<code bash> 
 +# kubectl alias and bash completion 
 +# https://kubernetes.io/docs/reference/kubectl/quick-reference/#bash 
 +source <(kubectl completion bash) 
 +alias k=kubectl 
 +complete -F __start_kubectl k 
 +</code> 
 + 
 + 
 +Für Helm würde selbiges funktionieren 
 +<code bash> 
 +mkdir -p ~/.local/share/bash-completion/completions/ 
 +helm completion bash > ~/.local/share/bash-completion/completions/helm 
 +</code> 
 +==== Installation Krew PlugIn Manager ===== 
 +<code yaml> 
 +(   set -x; cd "$(mktemp -d)" &&   OS="$(uname | tr '[:upper:]' '[:lower:]')" &&   ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&   KREW="krew-${OS}_${ARCH}" &&   curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&   tar zxvf "${KREW}.tar.gz" &&   ./"${KREW}" install krew; ) 
 +export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH" 
 +echo 'export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"' >> ~/.bashrc 
 +kubectl krew 
 +kubectl krew update 
 +kubectl krew install ctx 
 +kubectl krew install neat 
 +</code>
it-wiki/kubernetes/installation.1678387172.txt.gz · Zuletzt geändert: 2023/03/09 18:39 von marko