Kubernetes Cluster in Proxmox VE (AlmaLinux/CentOS): Unterschied zwischen den Versionen

K
keine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
 
(16 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 19: Zeile 19:


Die Installation in einem VM Cluster wie Proxmox bietet sich aufgrund der Zeitersparnis an, dennoch sollte aber alles hier beschriebene grundsätzlich auch auf "echten" Maschinen funktionieren.
Die Installation in einem VM Cluster wie Proxmox bietet sich aufgrund der Zeitersparnis an, dennoch sollte aber alles hier beschriebene grundsätzlich auch auf "echten" Maschinen funktionieren.




Zeile 38: Zeile 36:
''Einige Kubernetes Deployments nutzen MongoDB als Datenbank.''
''Einige Kubernetes Deployments nutzen MongoDB als Datenbank.''


''Ab MongoDB 5.0 werden keine Systeme mehr unterstützt deren CPU das AVX-Flag nicht hat.''
''Ab MongoDB 5.0 werden keine Systeme mehr unterstützt deren CPU das AVX-Flag nicht gesetzt hat.''
 
''Damit es später keine Probleme gibt, sollte daher als CPU nicht 'kvm64' sondern 'host' ausgewählt werden.''


''Damit es später keine Probleme gibt, sollte als CPU daher nicht 'kvm64' sondern 'host' ausgewählt werden.''
Dies wird ebenfalls empfohlen um "Nested Virtualization" zu nutzen, wodurch die Performance erheblich verbessert werden kann.<ref>https://pve.proxmox.com/wiki/Nested_Virtualization</ref>


=== Controller und Worker ===
=== Controller und Worker ===
Zeile 162: Zeile 162:
setenforce 0
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
</syntaxhighlight>Jetzt können die Tool für den Cluster installiert werden:<syntaxhighlight lang="bash">
</syntaxhighlight>Jetzt können die Tools für den Cluster installiert werden:<syntaxhighlight lang="bash">
dnf update
dnf update
dnf install -y kubeadm kubectl kubelet nfs-utils --disableexcludes=kubernetes
dnf install -y kubeadm kubectl kubelet nfs-utils --disableexcludes=kubernetes
Zeile 171: Zeile 171:
- '''kubelet''' / Steuert die Kommunikation zwischen den Nodes und der API
- '''kubelet''' / Steuert die Kommunikation zwischen den Nodes und der API


- '''nfs-utils''' / Um NFS Exports in den Cluster einzubinden
- '''nfs-utils''' / Um NFS Exports als "Persistent Volume" in den Cluster einzubinden
 


Kubelet beim Neustart automatisch starten:<syntaxhighlight lang="bash">
Kubelet beim Neustart automatisch starten:<syntaxhighlight lang="bash">
systemctl enable kubelet
systemctl enable kubelet
</syntaxhighlight>
</syntaxhighlight>
=== Firewall konfigurieren ===
=== Firewall konfigurieren ===


Zeile 268: Zeile 270:




Mit <code>kubectl get nodes</code> kann überprüft werden ob der Controller läuft:<syntaxhighlight lang="bash">
NAME          STATUS  ROLES          AGE    VERSION
k8s-ctrlr-1  Ready    control-plane  8m7s  v1.26.0
</syntaxhighlight>
'''''Es kann ein, zwei Minuten dauern bis der Status READY ist.'''''


Wenn man jetzt mit <code>kubectl get nodes</code> den Status des einen Nodes abfragt wird man feststellen, dass dieser auf "Not Ready" bleibt...
Mit <code>kubectl get pods -n kube-system</code> sieht man, dass die Pods "coredns" im Status "Pending" sind.<syntaxhighlight lang="bash">
NAME                                  READY  STATUS    RESTARTS        AGE
coredns-787d4945fb-k4q67              1/1    Pending  0              5m16s
coredns-787d4945fb-klgw4              1/1    Pending  0              5m16s
etcd-k8s-ctrlr-1                      1/1    Running  0              6m31s
kube-apiserver-k8s-ctrlr-1            1/1    Running  0              6m30s
kube-controller-manager-k8s-ctrlr-1  1/1    Running  0              6m29s
kube-proxy-8gstv                      1/1    Running  0              5m13s
kube-scheduler-k8s-ctrlr-1            1/1    Running  0              6m31s
</syntaxhighlight>Das liegt daran, dass der "coredns" auf eine interne IP im Bereich 10.244.0.0/16 wartet.


[[File:Kubernetes.png|thumb|Kubernetes Schema]]
Damit der Node eine IP zugewiesen bekommt, müssen wir als erstes den [https://github.com/flannel-io/flannel flannel-Agent] installieren.
Als erster müssen wir auf unserem neuem Cluster den [https://github.com/flannel-io/flannel flannel-Agent] installieren.


Dieser ist so eine Art interner Router der den Nodes eigene Subnetze zuweist, aus welchen sich die Pods dann ihre IP-Adressen beziehen.
Dieser ist so eine Art interner Router der den Nodes eigene Subnetze zuweist, aus welchen sich die Pods dann ihre IP-Adressen beziehen.
Zeile 289: Zeile 297:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
</syntaxhighlight>
</syntaxhighlight>
Jetzt können die Worker zu dem Cluster hinzugefügt werden.
 
Anschließend kann mit <code>kubectl get nodes</code> überprüft werden, ob der Controller läuft:<syntaxhighlight lang="bash">
NAME          STATUS  ROLES          AGE    VERSION
k8s-ctrlr-1  Ready    control-plane  8m7s  v1.26.0
</syntaxhighlight>
'''''Es kann ein, zwei Minuten dauern bis der Status READY ist.'''''
 
 
[[File:Kubernetes.png|thumb|Kubernetes Schema]]
'''Jetzt können die Worker zu dem Cluster hinzugefügt werden.'''
 




Zeile 309: Zeile 327:




'''Glückwunsch zu eurem neuem Kubernetes Cluster!'''
'''Glückwunsch zu eurem neuen Kubernetes Cluster!'''


== Dashboard ==
== Dashboard ==
Zeile 384: Zeile 402:
</syntaxhighlight>In diesem Fall ist der Port '''31447'''...
</syntaxhighlight>In diesem Fall ist der Port '''31447'''...


Das Dashboard sollte jetzt über https://<Node-IP>:31447 erreichbar sein.
Das Dashboard sollte jetzt über '''https://<Node-IP>:31447''' erreichbar sein.
 
Als Node-IP kann jede IP von einem der Hosts genommen werden.


Als Node-IP kann jede IP von einem der Hosts genommen werden.<nowiki>#</nowiki> Create admin-user


=== Benutzer Anmeldung ===
=== Benutzer Anmeldung ===
Zeile 395: Zeile 414:
Auf dem Controller in einem beliebigen Ordner folgende Dateien anlegen:
Auf dem Controller in einem beliebigen Ordner folgende Dateien anlegen:


admin-user.yaml<syntaxhighlight lang="bash" line="1">
admin-user.yaml / Manifest um einen Service Account anzulegen.<syntaxhighlight lang="bash" line="1">
apiVersion: v1
apiVersion: v1
kind: ServiceAccount
kind: ServiceAccount
Zeile 401: Zeile 420:
   name: admin-user
   name: admin-user
   namespace: kubernetes-dashboard
   namespace: kubernetes-dashboard
</syntaxhighlight>cluster-admin.yaml<syntaxhighlight lang="bash" line="1">
</syntaxhighlight>cluster-admin.yaml / Manifest um dem Service Account Adminrechte zuzuweisen.<syntaxhighlight lang="bash" line="1">
apiVersion: rbac.authorization.k8s.io/v1
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
kind: ClusterRoleBinding
Zeile 418: Zeile 437:
kubectl apply -f cluster-admin.yaml
kubectl apply -f cluster-admin.yaml
</syntaxhighlight>Jetzt haben wir einen Service Account mit dem Namen 'admin-user' und Administrator Berechtigung angelegt.
</syntaxhighlight>Jetzt haben wir einen Service Account mit dem Namen 'admin-user' und Administrator Berechtigung angelegt.


Um einen Token für die Anmeldung im Dashboard zu generieren reicht folgender Befehl:<syntaxhighlight lang="bash">
Um einen Token für die Anmeldung im Dashboard zu generieren reicht folgender Befehl:<syntaxhighlight lang="bash">
Zeile 424: Zeile 444:


==== Keycloak (OIDC) ====
==== Keycloak (OIDC) ====
Folgt...
Siehe [[Kubernetes Dashboard mit Keycloak OIDC]]
 




=== Metrics Server installieren ===
=== Metrics Server installieren ===
Das Installations Manifest für den Metrics-Server herunterladen:<syntaxhighlight lang="bash">
Um die Auslastung der einzelnen Pods, bzw der Nodes im Dashboard zu sehen, muss der Metrics-Server installiert werden.
 
Darüber hinaus kann der Metrics-Server verwendet werden um die Pods gleichmäßig auf die Nodes aufzuteilen ('''Horizontal Autoscaling''') oder
 
um die zugeteilten Ressourcen (CPU, RAM) automatisch an der Verbrauch anzupassen ('''Vertical Autoscaling''').
 
 
Zuerst das Installations Manifest für den Metrics-Server herunterladen:<syntaxhighlight lang="bash">
curl -LO https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
curl -LO https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
</syntaxhighlight><code>- --kubelet-insecure-tls</code> in deployment.spec.template.spec.containers.args<ref>https://www.scmgalaxy.com/tutorials/kubernetes-metrics-server-error-readiness-probe-failed-http-probe-failed-with-statuscode/</ref><syntaxhighlight lang="bash" line="1">
</syntaxhighlight><code>- --kubelet-insecure-tls</code> in deployment.spec.template.spec.containers.args<ref>https://www.scmgalaxy.com/tutorials/kubernetes-metrics-server-error-readiness-probe-failed-http-probe-failed-with-statuscode/</ref><syntaxhighlight lang="bash" line="1">
Zeile 471: Zeile 499:
== Weiterführende Links ==
== Weiterführende Links ==
*[https://krew.sigs.k8s.io/plugins/ Plugins für kubectl Kommando]
*[https://krew.sigs.k8s.io/plugins/ Plugins für kubectl Kommando]
*[https://github.com/collabnix/kubetools Liste mit Tools für Kubernetes]
*[https://github.com/collabnix/kubetools Liste mit Tools für Kubernetes]
*[https://artifacthub.io/ Sammlung von Kubernetes Packages (Helm)]
== Quellen ==
== Quellen ==
https://www.youtube.com/watch?v=U1VzcjCB_sY
https://docs.docker.com/engine/install/centos/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/


https://www.thegeekdiary.com/how-to-access-kubernetes-dashboard-externally/
* https://www.youtube.com/watch?v=U1VzcjCB_sY
* https://docs.docker.com/engine/install/centos/
* https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
* https://www.thegeekdiary.com/how-to-access-kubernetes-dashboard-externally/


=== Einzelnachweise ===
=== Einzelnachweise ===