Kubernetes Cluster auf Ubuntu 22.04 einrichten
Kubernetes ist ein kostenloses Container-Orchestrierungstool, das dir bei der automatischen Bereitstellung, Skalierung und Verwaltung von containerisierten Anwendungen hilft. Ein Kubernetes-Cluster besteht aus einem Master-Knoten und einem Worker-Knoten. Der Master Node ist für die Verwaltung der Nodes und Pods im Cluster zuständig. Der Worker Node wird für die Bereitstellung der Anwendungslast verwendet. Mit Kubernetes kannst du Cloud-native Anwendungen auf einer lokalen Infrastruktur oder auf öffentlichen Cloud-Plattformen bereitstellen und verwalten.
Diese Anleitung zeigt dir, wie du den Kubernetes-Cluster auf einem Ubuntu 22.04 Server einrichtest.
Voraussetzungen
- Ein Server, auf dem Ubuntu 22.04 läuft.
- Ein Root-Passwort ist auf dem Server konfiguriert.
Erste Schritte
Als Erstes musst du deine Systempakete aktualisieren und auf die neueste Version upgraden. Das kannst du mit dem folgenden Befehl tun:
apt update -y apt upgrade -y
Sobald alle Pakete aktualisiert sind, musst du auch den Swap auf deinem System deaktivieren. Du kannst ihn mit dem folgenden Befehl deaktivieren:
swapoff -a
Als Nächstes musst du einige erforderliche Kernel-Module auf allen Knoten laden. Dazu bearbeitest du die Datei /etc/modules-load.d/containerd.conf:
nano /etc/modules-load.d/containerd.conf
Füge die folgenden Zeilen hinzu:
overlay br_netfilter
Speichere und schließe die Datei und lade dann die Module mit dem folgenden Befehl:
modprobe overlay modprobe br_netfilter
Als Nächstes musst du eine Fine erstellen und einige erforderliche Kernelparameter definieren:
nano /etc/sysctl.d/kubernetes.conf
Füge die folgenden Zeilen hinzu:
net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1
Speichere und schließe die Datei und führe dann den folgenden Befehl aus, um die Änderungen zu übernehmen:
sysctl --system
Containerd installieren
Als Nächstes musst du den Containerd für den Kubernetes-Cluster installieren. Installiere zunächst alle erforderlichen Abhängigkeiten mit dem folgenden Befehl:
apt install curl gnupg2 software-properties-common apt-transport-https ca-certificates -y
Nachdem du alle Abhängigkeiten installiert hast, fügst du das Docker-Repository mit dem folgenden Befehl hinzu:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Als Nächstes aktualisierst du das Repository und installierst den Containerd mit dem folgenden Befehl:
apt update -y apt install containerd.io -y
Als Nächstes musst du den Containerd so konfigurieren, dass er von systemd gestartet wird. Das kannst du mit folgendem Befehl tun:
containerd config default | tee /etc/containerd/config.toml >/dev/null 2>&1 sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
Starte anschließend den Containerd-Dienst neu, um die Änderungen zu übernehmen:
systemctl restart containerd
Kubernetes-Komponenten installieren
Standardmäßig sind die Kubernetes-Komponenten nicht im Standard-Repository von Ubuntu enthalten. Daher musst du das Kubernetes-Repository zu deinem System hinzufügen. Du kannst es mit dem folgenden Befehl hinzufügen:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
Als Nächstes aktualisierst du das Repository und installierst alle Kubernetes-Komponenten mit dem folgenden Befehl:
apt update -y apt install kubelet kubeadm kubectl -y
Sobald alle Pakete installiert sind, kannst du mit dem nächsten Schritt fortfahren.
Kubernetes Cluster initialisieren
Zu diesem Zeitpunkt sind alle Kubernetes-Komponenten installiert. Führe nun den folgenden Befehl auf dem Master-Knoten aus, um den Cluster zu initialisieren:
kubeadm init --control-plane-endpoint=kubernetes-master-ip
Du erhältst die folgende Ausgabe:
To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root: kubeadm join kubernetes-master-ip:6443 --token chmz7m.fbjgdcqne1q0ff4t \ --discovery-token-ca-cert-hash sha256:c614bf14af27472e470546539a9a2ff63e5d558dbbb3cc06d6f7a030fcb55426 \ --control-plane Then you can join any number of worker nodes by running the following on each as root: kubeadm join kubernetes-master-ip:6443 --token chmz7m.fbjgdcqne1q0ff4t \ --discovery-token-ca-cert-hash sha256:c614bf14af27472e470546539a9a2ff63e5d558dbbb3cc06d6f7a030fcb55426
Hinweis: Kopiere den Befehl kubeadm join aus der obigen Ausgabe. Du musst diesen Befehl auf dem Worker-Knoten ausführen, um dem Cluster beizutreten. Als nächstes musst du die folgenden Befehle ausführen, um mit dem Kubernetes-Cluster zu interagieren:
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
Worker-Knoten dem Cluster beitreten
Melde dich beim Worker Node an und führe den folgenden Befehl aus, um den Worker Node in den Kubernetes-Cluster einzubinden:
kubeadm join kubernetes-master-ip:6443 --token chmz7m.fbjgdcqne1q0ff4t --discovery-token-ca-cert-hash sha256:c614bf14af27472e470546539a9a2ff63e5d558dbbb3cc06d6f7a030fcb55426
Du erhältst die folgende Ausgabe:
[preflight] Running pre-flight checks [WARNING SystemVerification]: missing optional cgroups: blkio [preflight] Reading configuration from the cluster... [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Starting the kubelet [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap... This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
Calico Pod Network Add-on installieren
Als nächstes musst du das Calico Pod Network auf dem Kubernetes Master Node installieren, um das Netzwerk zu verwalten.
Du kannst es mit dem folgenden Befehl herunterladen und installieren:
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O calico.yaml kubectl apply -f calico.yaml
Du erhältst die folgende Ausgabe:
poddisruptionbudget.policy/calico-kube-controllers created serviceaccount/calico-kube-controllers created serviceaccount/calico-node created configmap/calico-config created customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created clusterrole.rbac.authorization.k8s.io/calico-node created clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created clusterrolebinding.rbac.authorization.k8s.io/calico-node created
Als Nächstes überprüfst du den Status der Pods mit folgendem Befehl:
kubectl get pods -n kube-system
Du erhältst die folgende Ausgabe:
NAME READY STATUS RESTARTS AGE calico-kube-controllers-58dbc876ff-nh2st 1/1 Running 0 5m58s calico-node-7cfz7 1/1 Running 0 5m58s calico-node-lt5cv 1/1 Running 0 5m58s coredns-565d847f94-dm6qc 1/1 Running 0 21m coredns-565d847f94-zhng9 1/1 Running 0 21m etcd-k8smaster.example.net 1/1 Running 0 22m kube-apiserver-k8smaster.example.net 1/1 Running 0 22m kube-controller-manager-k8smaster.example.net 1/1 Running 0 22m kube-proxy-9w2xp 1/1 Running 0 14m kube-proxy-gdb97 1/1 Running 0 21m kube-scheduler-k8smaster.example.net 1/1 Running 0 22m
Du kannst nun den Status des Kubernetes-Clusters mit folgendem Befehl überprüfen:
kubectl get nodes
Du solltest sehen, dass sowohl der Master- als auch der Worker-Knoten den Status ready haben:
NAME STATUS ROLES AGE VERSION k8smaster.example.net Ready control-plane 22m v1.25.0 kubernetes Ready 14m v1.25.0
Eine Nginx-Anwendung auf Kubernetes bereitstellen
Um Kubernetes zu testen, werden wir eine Nginx-Anwendung auf dem Cluster bereitstellen.
Führe den folgenden Befehl aus, um eine Nginx-Anwendung einzurichten:
kubectl create deployment nginx-app --image=nginx --replicas=2
Du kannst deine Anwendung mit folgendem Befehl überprüfen:
kubectl get deployment nginx-app
Du erhältst die folgende Ausgabe:
NAME READY UP-TO-DATE AVAILABLE AGE nginx-app 2/2 2 2 13s
Als Nächstes stellst du deine Anwendung auf Port 80 mit folgendem Befehl bereit:
kubectl expose deployment nginx-app --type=NodePort --port=80
Als Nächstes überprüfst du den Status des Nginx-Dienstes mit dem folgenden Befehl:
kubectl get svc nginx-app
Du erhältst die folgende Ausgabe:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-app NodePort 10.109.89.196 80:30921/TCP 14s
Du kannst die detaillierten Informationen zu deiner Nginx-Anwendung auch mit folgendem Befehl einsehen:
kubectl describe svc nginx-app
Du solltest die folgende Ausgabe sehen:
Name: nginx-app Namespace: default Labels: app=nginx-app Annotations: Selector: app=nginx-app Type: NodePort IP Family Policy: SingleStack IP Families: IPv4 IP: 10.109.89.196 IPs: 10.109.89.196 Port: 80/TCP TargetPort: 80/TCP NodePort: 30921/TCP Endpoints: 192.168.192.129:80,192.168.192.130:80 Session Affinity: None External Traffic Policy: Cluster Events:
Notiere dir jetzt die IP-Adresse der Nginx-Anwendung aus der obigen Ausgabe und überprüfe deine Nginx-Anwendung mit dem Befehl curl:
curl http://10.109.89.196
Wenn alles in Ordnung ist, erhältst du die folgende Ausgabe:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
Herzlichen Glückwunsch! Du hast den Kubernetes-Cluster erfolgreich auf dem Ubuntu 22.04 Server eingerichtet.