1.051
Bearbeitungen
K (→Dashboard) |
KKeine Bearbeitungszusammenfassung |
||
(17 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 als CPU | ''Damit es später keine Probleme gibt, sollte daher als CPU 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 | </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: | ||
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. | |||
Damit der Node eine IP zugewiesen bekommt, müssen wir als erstes 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 | '''Glückwunsch zu eurem neuen Kubernetes Cluster!''' | ||
== Dashboard == | == Dashboard == | ||
Zeile 371: | Zeile 389: | ||
status: | status: | ||
loadBalancer: {} | loadBalancer: {} | ||
</syntaxhighlight>Mit folgendem Befehl kann überprüft werden auf welchem Port der Service läuft:<syntaxhighlight lang="bash"> | </syntaxhighlight>Mit '''NodePort''' wird der Service auf einen Host-Port zwischen '''30000''' und '''32767''' weitergeleitet. | ||
Mit folgendem Befehl kann überprüft werden auf welchem Port der Service läuft:<syntaxhighlight lang="bash"> | |||
kubectl get service -n kubernetes-dashboard | kubectl get service -n kubernetes-dashboard | ||
</syntaxhighlight> | </syntaxhighlight><syntaxhighlight lang="bash"> | ||
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE | NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE | ||
dashboard-metrics-scraper ClusterIP 10.101.128.128 <none> 8000/TCP 10m | dashboard-metrics-scraper ClusterIP 10.101.128.128 <none> 8000/TCP 10m | ||
kubernetes-dashboard NodePort 10.96.102.224 <none> 443:31447/TCP 10m | kubernetes-dashboard NodePort 10.96.102.224 <none> 443:31447/TCP 10m | ||
</syntaxhighlight>Das Dashboard sollte jetzt über https://<Node-IP>:31447 erreichbar sein. | </syntaxhighlight>In diesem Fall ist der Port '''31447'''... | ||
Das Dashboard sollte jetzt über '''https://<Node-IP>:31447''' erreichbar sein. | |||
Als Node-IP kann jede IP von einem der Hosts genommen werden. | |||
=== Benutzer Anmeldung === | === Benutzer Anmeldung === | ||
Zeile 389: | 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 395: | 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 412: | 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 418: | Zeile 444: | ||
==== Keycloak (OIDC) ==== | ==== Keycloak (OIDC) ==== | ||
Siehe [[Kubernetes Dashboard mit Keycloak OIDC]] | |||
=== Metrics Server installieren === | === Metrics Server installieren === | ||
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 465: | 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.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 === |