Control Plane Setup
Ziel
In diesem Projekt setzen Sie die Control Plane eines Kubernetes-Clusters manuell auf. Dabei werden Sie:
- containerd
, runc
und die cni-plugins
installieren
- Zertifikate und Konfigurationsdateien erstellen
- etcd
, kube-apiserver
, kube-controller-manager
und kube-scheduler
konfigurieren und starten
- die Control Plane testen
Aufgabe 1: Installation von containerd
In dieser Aufgabe installieren Sie containerd
und runc
auf einem Node.
- Erstellen Sie ein Shell-Skript
install-containerd.sh
, das die Installation voncontainerd
durchführt:
CONTAINERD_VERSION=2.0.2
RUNC_VERSION=1.2.4
# Install Containerd
wget https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz
tar Cxzvf /usr/local containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz
rm containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz
mkdir -p /usr/local/lib/systemd/system/
wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -O /usr/local/lib/systemd/system/containerd.service
systemctl daemon-reload
systemctl enable --now containerd
# Install runc
wget https://github.com/opencontainers/runc/releases/download/v${RUNC_VERSION}/runc.amd64
install -m 755 runc.amd64 /usr/local/sbin/runc
- Führen Sie das Skript aus:
bash install-containerd.sh
Aufgabe 2: Zertifikate erstellen
In dieser Aufgabe erstellen Sie die benötigten Zertifikate für die Control Plane.
- Erstellen Sie ein Shell-Skript
generate-certificates.sh
, das die Zertifikate generiert:
#!/bin/bash
# CA Zertifikat
openssl genrsa -out /etc/kubernetes/pki/ca.key 2048
openssl req -x509 -new -nodes -key /etc/kubernetes/pki/ca.key \
-subj "/CN=kubernetes-ca" \
-days 10000 -out /etc/kubernetes/pki/ca.crt
# API Server Zertifikat
openssl genrsa -out /etc/kubernetes/pki/apiserver.key 2048
openssl req -new -key /etc/kubernetes/pki/apiserver.key \
-subj "/CN=kube-apiserver" \
-out /etc/kubernetes/pki/apiserver.csr
openssl x509 -req -in /etc/kubernetes/pki/apiserver.csr \
-CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial \
-days 10000 -out /etc/kubernetes/pki/apiserver.crt
# API Server Kubelet Client Zertifikat
openssl genrsa -out /etc/kubernetes/pki/apiserver-kubelet-client.key 2048
openssl req -new -key /etc/kubernetes/pki/apiserver-kubelet-client.key \
-subj "/CN=kube-apiserver-kubelet-client" \
-out /etc/kubernetes/pki/apiserver-kubelet-client.csr
openssl x509 -req -in /etc/kubernetes/pki/apiserver-kubelet-client.csr \
-CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial \
-days 10000 -out /etc/kubernetes/pki/apiserver-kubelet-client.crt
# Service Account Key
openssl genrsa -out /etc/kubernetes/pki/sa.key 2048
openssl rsa -in /etc/kubernetes/pki/sa.key -pubout -out /etc/kubernetes/pki/sa.pub
# Etcd Zertifikat
openssl genrsa -out /etc/kubernetes/pki/etcd.key 2048
openssl req -new -key /etc/kubernetes/pki/etcd.key \
-subj "/CN=etcd" \
-out /etc/kubernetes/pki/etcd.csr
openssl x509 -req -in /etc/kubernetes/pki/etcd.csr \
-CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial \
-days 10000 -out /etc/kubernetes/pki/etcd.crt
# Etcd Peer Zertifikat
openssl genrsa -out /etc/kubernetes/pki/etcd-peer.key 2048
openssl req -new -key /etc/kubernetes/pki/etcd-peer.key \
-subj "/CN=etcd-peer" \
-out /etc/kubernetes/pki/etcd-peer.csr
openssl x509 -req -in /etc/kubernetes/pki/etcd-peer.csr \
-CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial \
-days 10000 -out /etc/kubernetes/pki/etcd-peer.crt
# Controller Manager Zertifikat
openssl genrsa -out /etc/kubernetes/pki/controller-manager.key 2048
openssl req -new -key /etc/kubernetes/pki/controller-manager.key \
-subj "/CN=system:kube-controller-manager" \
-out /etc/kubernetes/pki/controller-manager.csr
openssl x509 -req -in /etc/kubernetes/pki/controller-manager.csr \
-CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial \
-days 10000 -out /etc/kubernetes/pki/controller-manager.crt
# Scheduler Zertifikat
openssl genrsa -out /etc/kubernetes/pki/scheduler.key 2048
openssl req -new -key /etc/kubernetes/pki/scheduler.key \
-subj "/CN=system:kube-scheduler" \
-out /etc/kubernetes/pki/scheduler.csr
openssl x509 -req -in /etc/kubernetes/pki/scheduler.csr \
-CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial \
-days 10000 -out /etc/kubernetes/pki/scheduler.crt
# Admin Zertifikat
openssl genrsa -out /etc/kubernetes/pki/admin.key 2048
openssl req -new -key /etc/kubernetes/pki/admin.key \
-subj "/CN=kubernetes-admin/O=system:masters" \
-out /etc/kubernetes/pki/admin.csr
openssl x509 -req -in /etc/kubernetes/pki/admin.csr \
-CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial \
-days 10000 -out /etc/kubernetes/pki/admin.crt
- Führen Sie das Skript aus:
bash generate-certificates.sh
- Überprüfen Sie die generierten Zertifikate:
ls -l /etc/kubernetes/pki/
Die folgenden Zertifikate sollten vorhanden sein:
- ca.crt
, ca.key
- apiserver.crt
, apiserver.key
- apiserver-kubelet-client.crt
, apiserver-kubelet-client.key
- sa.key
, sa.pub
- etcd.crt
, etcd.key
, etcd-peer.crt
, etcd-peer.key
- controller-manager.crt
, controller-manager.key
- scheduler.crt
, scheduler.key
- admin.crt
, admin.key
Aufgabe 3: etcd konfigurieren und starten
In dieser Aufgabe konfigurieren und starten Sie etcd
.
- Erstellen Sie eine Datei
etcd.yaml
mit folgendem Inhalt:
apiVersion: v1
kind: Pod
metadata:
name: etcd
namespace: kube-system
spec:
containers:
- name: etcd
image: quay.io/coreos/etcd:v3.4.13
command:
- "/usr/local/bin/etcd"
- "--name=etcd-0"
- "--data-dir=/var/lib/etcd"
- "--listen-peer-urls=http://0.0.0.0:2380"
- "--listen-client-urls=http://0.0.0.0:2379"
- "--advertise-client-urls=http://<CONTROL_PLANE_IP>:2379"
- "--initial-cluster=etcd-0=http://<CONTROL_PLANE_IP>:2380"
- "--initial-cluster-token=etcd-cluster"
- "--initial-cluster-state=new"
- "--cert-file=/etc/kubernetes/pki/etcd.crt"
- "--key-file=/etc/kubernetes/pki/etcd.key"
- "--trusted-ca-file=/etc/kubernetes/pki/ca.crt"
volumeMounts:
- name: etcd-data
mountPath: /var/lib/etcd
- name: etcd-certs
mountPath: /etc/kubernetes/pki
volumes:
- name: etcd-data
emptyDir: {}
- name: etcd-certs
hostPath:
path: /etc/kubernetes/pki
- Wenden Sie die Konfiguration an:
kubectl apply -f etcd.yaml
Aufgabe 4: API Server konfigurieren und starten
In dieser Aufgabe konfigurieren und starten Sie den API Server.
- Erstellen Sie eine Datei
kube-apiserver.yaml
mit folgendem Inhalt:
apiVersion: v1
kind: Pod
metadata:
name: kube-apiserver
namespace: kube-system
spec:
containers:
- name: kube-apiserver
image: k8s.gcr.io/kube-apiserver:v1.24.0
command:
- "/kube-apiserver"
- "--advertise-address=<CONTROL_PLANE_IP>"
- "--allow-privileged=true"
- "--etcd-servers=http://<CONTROL_PLANE_IP>:2379"
- "--service-cluster-ip-range=10.96.0.0/12"
- "--tls-cert-file=/etc/kubernetes/pki/apiserver.crt"
- "--tls-private-key-file=/etc/kubernetes/pki/apiserver.key"
- "--client-ca-file=/etc/kubernetes/pki/ca.crt"
volumeMounts:
- name: apiserver-certs
mountPath: /etc/kubernetes/pki
volumes:
- name: apiserver-certs
hostPath:
path: /etc/kubernetes/pki
- Wenden Sie die Konfiguration an:
kubectl apply -f kube-apiserver.yaml
Aufgabe 5: Controller Manager und Scheduler konfigurieren
In dieser Aufgabe konfigurieren und starten Sie den Controller Manager und den Scheduler.
- Erstellen Sie eine Datei
kube-controller-manager.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: kube-controller-manager
namespace: kube-system
spec:
containers:
- name: kube-controller-manager
image: k8s.gcr.io/kube-controller-manager:v1.24.0
command:
- "/kube-controller-manager"
- "--leader-elect=true"
- "--kubeconfig=/etc/kubernetes/controller-manager.conf"
volumeMounts:
- name: controller-manager-config
mountPath: /etc/kubernetes
volumes:
- name: controller-manager-config
hostPath:
path: /etc/kubernetes
- Erstellen Sie eine Datei
kube-scheduler.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: kube-scheduler
namespace: kube-system
spec:
containers:
- name: kube-scheduler
image: k8s.gcr.io/kube-scheduler:v1.24.0
command:
- "/kube-scheduler"
- "--leader-elect=true"
- "--kubeconfig=/etc/kubernetes/scheduler.conf"
volumeMounts:
- name: scheduler-config
mountPath: /etc/kubernetes
volumes:
- name: scheduler-config
hostPath:
path: /etc/kubernetes
- Wenden Sie beide Konfigurationen an:
kubectl apply -f kube-controller-manager.yaml
kubectl apply -f kube-scheduler.yaml
Aufgabe 6: Überprüfung
- Überprüfen Sie, ob alle Pods in der Control Plane laufen:
kubectl get pods -n kube-system
- Überprüfen Sie, ob der API Server erreichbar ist:
kubectl cluster-info
Aufgabe 7: Weitere Control Plane Nodes hinzufügen
In dieser Aufgabe verteilen Sie die Control Plane auf zwei weitere Nodes, um Hochverfügbarkeit zu gewährleisten.
Schritt 1: Zertifikate und Konfigurationsdateien kopieren
- Kopieren Sie die Zertifikate und Konfigurationsdateien von der ersten Control Plane Node auf die anderen beiden Nodes:
scp -r /etc/kubernetes/pki <control-plane-node-2>:/etc/kubernetes/
scp -r /etc/kubernetes/pki <control-plane-node-3>:/etc/kubernetes/
scp /etc/kubernetes/admin.conf <control-plane-node-2>:/etc/kubernetes/admin.conf
scp /etc/kubernetes/admin.conf <control-plane-node-3>:/etc/kubernetes/admin.conf
Schritt 2: etcd, kubeapiserver, controller manager und scheduler kopieren und anpassen
scp /etc/kubernetes/manifests/etcd.yaml <control-plane-node-2>:/etc/kubernetes/manifests/
scp /etc/kubernetes/manifests/etcd.yaml <control-plane-node-3>:/etc/kubernetes/manifests/
scp /etc/kubernetes/manifests/kube-apiserver.yaml <control-plane-node-2>:/etc/kubernetes/manifests/
scp /etc/kubernetes/manifests/kube-apiserver.yaml <control-plane-node-3>:/etc/kubernetes/manifests/
scp /etc/kubernetes/manifests/kube-controller-manager.yaml <control-plane-node-2>:/etc/kubernetes/manifests/
scp /etc/kubernetes/manifests/kube-controller-manager.yaml <control-plane-node-3>:/etc/kubernetes/manifests/
scp /etc/kubernetes/manifests/kube-scheduler.yaml <control-plane-node-2>:/etc/kubernetes/manifests/
scp /etc/kubernetes/manifests/kube-scheduler.yaml <control-plane-node-3>:/etc/kubernetes/manifests/
- Ändern Sie in den etcd.yaml-Dateien die spezifischen Werte wie
--advertise-address
und--name
um die jeweilige Node zu identifizieren.
Aufgabe 8: HAProxy konfigurieren
In dieser Aufgabe konfigurieren Sie HAProxy, um den Traffic auf die Control Plane Nodes zu verteilen.
Schritt 1: HAProxy installieren
- Installieren Sie HAProxy auf einer oder mehreren Control Plane Nodes oder auf einer separaten Load Balancer Node:
sudo apt update
sudo apt install -y haproxy
Schritt 2: HAProxy konfigurieren
- Bearbeiten Sie die Datei
/etc/haproxy/haproxy.cfg
und fügen Sie die folgende Konfiguration hinzu:
frontend kubernetes
bind *:6443
mode tcp
option tcplog
default_backend kubernetes-backend
backend kubernetes-backend
mode tcp
balance roundrobin
server control-plane-1 <IP1>:6443 check
server control-plane-2 <IP2>:6443 check
server control-plane-3 <IP3>:6443 check
- Ersetzen Sie
<IP1>
,<IP2>
und<IP3>
durch die IP-Adressen Ihrer Control Plane Nodes.
Schritt 3: HAProxy starten
- Starten und aktivieren Sie den HAProxy-Dienst:
sudo systemctl restart haproxy
sudo systemctl enable haproxy
Schritt 4: HAProxy-Konfiguration überprüfen
- Überprüfen Sie die HAProxy-Konfiguration:
haproxy -c -f /etc/haproxy/haproxy.cfg
- Stellen Sie sicher, dass keine Fehler angezeigt werden.
Schritt 5: HAProxy testen
- Testen Sie, ob der HAProxy den Traffic korrekt auf die Control Plane Nodes verteilt:
curl -k https://<HAPROXY_IP>:6443/version
- Ersetzen Sie
<HAPROXY_IP>
durch die IP-Adresse der Node, auf der HAProxy läuft. Der Befehl sollte die Kubernetes-Version zurückgeben.
Überprüfung
- Stellen Sie sicher, dass der HAProxy den Traffic korrekt verteilt und alle Control Plane Nodes erreichbar sind:
kubectl get nodes
- Überprüfen Sie, ob alle Control Plane Nodes im Cluster als
Ready
angezeigt werden.