Kubernetes Cluster in Proxmox VE (AlmaLinux/CentOS)
Anleitung um ein Kubernetes Cluster innerhalb von Proxmox VE einzurichten.
Getestet auf AlmaLinux 8
Vorbereitungen
######################
## Auf ctrlr & node ##
######################
# Feste IP einrichten
Grafische Oberfläche:
nmtui
Oder per Konsole (Name des Interfaces kann abweichen):
vi /etc/sysconfig/network-scripts/ifcfg-ens18
Beispiel:
BOOTPROTO=none
IPADDR=192.168.2.65
PREFIX=24
GATEWAY=192.16.2.1
DNS1=192.168.2.1
DNS2=1.1.1.1
Hostname festlegen
vi /etc/hostname
Für den Controller .z.B.:
k8s-ctrlr
Für die Worker-Nodes z.B.:
k8s-node-1
Hosts-Datei:
vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.2.65 k8s-ctrlr.my.domain k8s-ctrlr
# Containerd installieren
dnf install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf install containerd
# Die ggf. automatisch installierte config.toml löschen und neu generieren:
rm /etc/containerd/config.toml
containerd config default | tee /etc/containerd/config.toml
# Die neu erzeugte config.toml bearbeiten
vi /etc/containerd/config.toml
Folgenden Absatz suchen und SystemdCgroup
auf true setzen (Suchen in vi mit /<Suchbegriff>
):
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
BinaryName = ""
CriuImagePath = ""
CriuPath = ""
CriuWorkPath = ""
IoGid = 0
IoUid = 0
NoNewKeyring = false
NoPivotRoot = false
Root = ""
ShimCgroup = ""
SystemdCgroup = false
#
vi /etc/sysctl.conf
Folgende Zeile am Ende einfügen, bzw. auskommentieren, falls schon vorhanden:
net.ipv4.ip_forward=1
# Module config / Enable bridge netfilter
vi /etc/modules-load.d/k8s.conf
Einfügen:
br_netfilter
# Anschließend noch ein Neustart um alle Änderungen zu übernehmen
reboot
# Add kubernetes repository
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
# Da kubelet
noch nicht SELinux optimimert ist muss dieses dauerhaft deaktiviert werden
Nur so können die Container auf das Dateisystem des Hosts zugreifen.
Disable SELinux /
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
Kubernetes installieren
dnf update
dnf install kubeadm kubectl kubelet --disableexcludes=kubernetes
Den kubelet Service automatisch starten:
systemctl enable kubelet
##
- kubeadm / initialize new cluster & joining nodes & updating cluster
- kubectl / cmd line util to manage cluster
- kubelet / communication between nodes and API
##
####
Vom node kann nun ein template erstellt werden, welches immer wieder verwendet werden kann
####
## Wenn alle VMs aus dem selben Template erstellt wurden, muss die 'machine-id' neu generiert werden
rm /etc/machine-id
systemd-machine-id-setup
######################
## Nur auf ctrlr ##
######################
## Firewall konfigurieren
firewall-cmd --permanent --add-port={6443,10250,10256,2379-2380}/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
## Cluster initialisieren
kubeadm init --control-plane-endpoint=10.16.0.65 --node-name k8s-ctrlr --pod-network-cidr=10.244.0.0/16
## Join Kommandos kopieren und irgendwo sicher ablegen ## !!!ACHTUNG Zertifikat läuft schnell ab
### Join Kommandos können erneut angezeigt werden
kubeadm token create --print-join-command
# Benutzer die Berechtigung für kubernetes geben
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# Als root muss nur folgender Befehl ausgeführt werden
export KUBECONFIG=/etc/kubernetes/admin.conf
# Network overlay konfigurieren
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
######################
## Nur auf worker ##
######################
## Firewall konfigurieren
firewall-cmd --permanent --add-port={10250,10256,30000-32767}/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
## Auf dem Controller das join command anzeigen lassen
kubeadm token create --print-join-command
# Auf node ausführen
# Auf dem controller überprüfen ob der node registreiert wurde
kubectl get nodes
k8s-ctrlr Ready control-plane 19m v1.26.0
k8s-node-1 Ready <none> 3m1s v1.26.0
#### Dashboard
# Dashboard installieren
# Zugriff von LAN / https://www.thegeekdiary.com/how-to-access-kubernetes-dashboard-externally/
kubectl -n kubernetes-dashboard edit service kubernetes-dashboard
type: NodePort ### clusterIP to NodePort
# Create admin-user
https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
# Metrics Server installieren / https://www.scmgalaxy.com/tutorials/kubernetes-metrics-server-error-readiness-probe-failed-http-probe-failed-with-statuscode/
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
- Download https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
- Modify and add "- --kubelet-insecure-tls" in deployment.spec.template.spec.containers.args
- kubectl apply -f components.yaml
###############################
###Speziell gitlab
###############################
# DNS zur gitlab-runner config
[runners.kubernetes.dns_config]
nameservers = [
"10.16.0.3",
"10.16.0.4"
]
Quellen
https://www.youtube.com/watch?v=U1VzcjCB_sY
https://techviewleo.com/how-to-install-docker-ce-on-almalinux/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/