Behälter

Kubernetes-Cluster auf CentOS 7 / CentOS 8 mit Ansible und Calico CNI bereitstellen

Kubernetes-Cluster auf CentOS 7 / CentOS 8 mit Ansible und Calico CNI bereitstellen

Sie möchten einen Kubernetes-Cluster mit drei Knoten auf CentOS 7 / CentOS 8 für Ihre Entwicklungsprojekte einrichten - 1 Meister und Zwei oder mehr Worker-Knoten?. Diese Anleitung führt Sie durch die Schritte zum Einrichten eines Kubernetes-Clusters auf CentOS 8 / CentOS 7 Linux-Computern mit Ansible und Calico CNI mit ausgeführtem und konfiguriertem Firewalld. Kubernetes (K8s) ist ein Open-Source-System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung von containerisierten Anwendungen.

Ähnliche Kubernetes-Bereitstellungsleitfäden:

My Lab basiert auf der folgenden Umgebung:

Maschine ArtHostnameIP Adresse
Kontrollknotenk8smaster01.Computerforgeeks.com192.168.122.10
Arbeiterknoten 1k8snode01.Computerforgeeks.com192.168.122.11
Arbeiterknoten 2k8snode01.Computerforgeeks.com192.168.122.12

Wir beginnen damit, sicherzustellen, dass die Systeme aktualisiert werden, und installieren alle Abhängigkeiten, einschließlich der Container-Laufzeit, Kubernetes-Softwarepakete und der Konfiguration der Firewall für k8s.

Schritt 1: Standardanforderungen einrichten

Ich habe eine Ansible-Rolle für die Standardvorbereitung von Kubernetes-Knoten geschrieben. Die Rolle enthält die Aufgaben zu:

Besuchen Sie meine Github-Seite, um die Einrichtung durchzuführen:

https://github.com/jmutai/k8s-pre-bootstrap

Dies ist eine Ausgabe meiner letzten Hinrichtung:

AUFGABE [kubernetes-bootstrap : Flanell-Ports auf der Firewall öffnen] ************************************* ************************************************* überspringen: [k8smaster01] => (item=8285) überspringen: [k8smaster01] => (item=8472) überspringen: [k8snode01] => (item=8285) überspringen: [k8snode01] => (item=8472) überspringen: [k8snode02] => (item=8285) überspringen: [k8snode02] => (item=8472) AUFGABE [kubernetes-bootstrap : Calico UDP-Ports auf der Firewall öffnen] ************** ************************************************* ******************** ok: [k8snode01] => (Artikel=4789) ok: [k8smaster01] => (Artikel=4789) ok: [k8snode02] = > (item=4789) AUFGABE [kubernetes-bootstrap : Calico TCP-Ports auf der Firewall öffnen] ****************************** ************************************************* **** ok: [k8snode02] => (item=5473) ok: [k8snode01] => (item=5473) ok: [k8smaster01] => (item=5473) ok: [k8snode01] => (item=179) ok: [k8snode02] => (item=179) ok: [k8smaster01] => (item=179) ok: [k8snode02] => (item=5473) ok: [k8snode01 ] => (item=5473) ok: [k8smaster01] => (item=5473) AUFGABE [kubernetes-bootstrap : Firewalld neu laden] ********************* ************************************************* ********************************** geändert: [k8smaster01] geändert: [k8snode01] geändert: [k8snode02] PLAY ZUSAMMENFASSUNG ************************************************ ************************************************* ***************************************** k8smaster01 : ok=23 geändert=3 nicht erreichbar=0 fehlgeschlagen=0 übersprungen=11 gerettet=0 ignoriert=0 k8snode01 : ok=23 geändert=3 nicht erreichbar=0 fehlgeschlagen=0 übersprungen=11 gerettet=0 ignoriert=0 k8snode02 : ok=23 geändert=3 nicht erreichbar=0 fehlgeschlagen =0 übersprungen=11 gerettet=0 ignoriert=0 

Schritt 2: Einzelknoten-Steuerungsebene initialisieren

Diese Bereitstellung ist für einen einzelnen Control-Plane-Knoten mit integriertem etcd. Wenn Sie mehrere Kontrollknoten (3 für HA) erstellen möchten, lesen Sie die Seite Hochverfügbare Cluster erstellen mit dem offiziellen kubeadm-Leitfaden.

Wir verwenden kubeadm, um einen minimal tragfähigen Kubernetes-Cluster zu booten, der den Best Practices entspricht. Das Gute an kubeadm ist, dass es andere Cluster-Lebenszyklusfunktionen unterstützt, wie z Upgrades, Herabstufung, und Verwalten von Bootstrap-Token.

Bootstrap-Anforderungen für Single Control Nodes:

Melden Sie sich am Kontrollknoten an:

$ ssh [email protected]

Überprüfen Sie die Argumente, die zum Initialisieren Ihres Kubernetes-Clusters verwendet werden können:

$ kubeadm init --help

Die Standardargumente, die wir verwenden werden, sind:

Für mich führe ich den Befehl aus:

sudo kubeadm init \ --apiserver-advertise-address=192.168.122.10 \ --pod-network-cidr 192.168.0.0/16 \ --upload-certs

Um dies aktualisieren zu können einzelne Steuerebene kubeadm-Cluster zu hohe Verfügbarkeit du solltest das angeben --Kontrollebenen-Endpunkt um den gemeinsamen Endpunkt für alle Knoten der Steuerungsebene festzulegen. Ein solcher Endpunkt kann entweder ein DNS-Name oder eine IP-Adresse eines Load-Balancers sein.

kubeadm init \ --apiserver-advertise-address=192.168.122.227 \ --pod-network-cidr 192.168.0.0/16 \ --control-plane-endpoint  --Upload-Zertifikate

Hier ist meine Installationsausgabe:

W0109 20:27:51.787966 18069 Validierung.go:28] Kube-Proxy-Konfiguration kann nicht validiert werden - kein Validator ist verfügbar W0109 20:27:51.788126 18069 Validierung.go:28] Kubelet-Konfiguration kann nicht validiert werden - kein Validator ist verfügbar [init] Verwenden von Kubernetes-Version: v1.17.0 [Preflight] Ausführen von Preflight-Prüfungen [WARNUNG Firewalld]: Firewalld ist aktiv, bitte stellen Sie sicher, dass die Ports [6443 10250] geöffnet sind oder Ihr Cluster möglicherweise nicht richtig funktioniert [Preflight] Zum Einrichten eines Kubernetes-Clusters erforderliche Bilder werden abgerufen [Preflight] Dies kann je nach Geschwindigkeit Ihrer Internetverbindung ein oder zwei Minuten dauern [Preflight] Sie können diese Aktion auch vorher mit 'kubeadm config images pull' ausführen [kubelet-start] Kubelet-Umgebungsdatei mit Flags in die Datei "/var/" schreiben lib/kubelet/kubeadm-flags.env" [kubelet-start] Kubelet-Konfiguration in Datei "/var/lib/kubelet/config . schreiben.yaml" [kubelet-start] Kubelet starten [certs] Using certificateDir Ordner "/etc/kubernetes/pki" [certs] "ca" Zertifikat und Schlüssel generieren [certs] "apiserver" Zertifikat und Schlüssel generieren [certs] apiserver Serving cert ist für DNS-Namen signiert [k8smaster01.Computerforgeeks.com kubernetes kubernetes.Standard-Kubernetes.Standard.svc kubernetes.Standard.svc.Cluster.local] und IPs [10.96.0.1 192.168.122.10] [certs] Generieren von "apiserver-kubelet-client"-Zertifikat und Schlüssel [certs] Generieren von "front-proxy-ca"-Zertifikat und -schlüssel [certs] Generieren von "front-proxy-client"-Zertifikat und Schlüssel [certs] Generieren von "etcd /ca" Zertifikat und Schlüssel [certs] Generieren von "etcd/server" Zertifikat und Schlüssel [certs] etcd/server Serving Zertifikat ist für DNS-Namen signiert [k8smaster01.Computerforgeeks.com localhost] und IPs [192.168.122.10 127.0.0.1 ::1] [certs] Generieren von "etcd/peer" Zertifikat und Schlüssel [certs] etcd/peer Serving Zertifikat wird für DNS-Namen signiert [k8smaster01.Computerforgeeks.com localhost] und IPs [192.168.122.10 127.0.0.1 ::1] [certs] Generieren von "etcd/healthcheck-client"-Zertifikat und Schlüssel [certs] Generieren von "apiserver-etcd-client"-Zertifikat und Schlüssel [certs] Generieren von "sa"-Schlüssel und öffentlichem Schlüssel [kubeconfig] Verwenden des kubeconfig-Ordners "/etc/kubernetes" [kubeconfig] Schreiben von "admin.conf" kubeconfig-Datei [kubeconfig] Schreiben von "kubelet.conf" kubeconfig-Datei [kubeconfig] Schreiben von "controller-manager.conf" kubeconfig-Datei [kubeconfig] Schreiben von "scheduler.conf" kubeconfig-Datei [control-plane] Manifestordner "/etc/kubernetes/manifests" verwenden [control-plane] Statisches Pod-Manifest für "kube-apiserver" erstellen [control-plane] Statisches Pod-Manifest für "kube-controller- erstellen" Manager" W0109 20:32:51.776569 18069 Manifeste.go:214] der standardmäßige kube-apiserver-Autorisierungsmodus ist "Node,RBAC"; using "Node,RBAC" [control-plane] Statisches Pod-Manifest für "kube-scheduler" erstellen W0109 20:32:51.777334 18069 manifestiert.go:214] der standardmäßige kube-apiserver-Autorisierungsmodus ist "Node,RBAC"; using "Node,RBAC" [etcd] Erstellen eines statischen Pod-Manifests für lokales etcd in "/etc/kubernetes/manifests" [wait-control-plane] Warten darauf, dass das Kubelet die Steuerungsebene als statische Pods aus dem Verzeichnis "/etc . hochfährt /kubernetes/manifeste". Dies kann bis zu 4m0s dauern [apiclient] Alle Komponenten der Steuerungsebene sind nach 15 . fehlerfrei.507327 Sekunden [upload-config] Speichern der in ConfigMap verwendeten Konfiguration „kubeadm-config“ im Namensraum „kube-system“ [kubelet] Erstellen einer ConfigMap „kubelet-config-1.17" im Namespace kube-system mit der Konfiguration für die Kubelets im Cluster [upload-certs] Speicherung der Zertifikate im Secret "kubeadm-certs" im Namespace "kube-system" [upload-certs] Verwendung des Zertifikatsschlüssels: bce5c1ad320f4c64e42688e25526615d2ffd7efad334249b [ca. mark-control-plane] Markieren des Knotens k8smaster01.Computerforgeeks.com als Control-Plane durch Hinzufügen des Labels "node-role.Kubernetes.io/master="" [mark-control-plane] Markieren des Knotens k8smaster01.Computerforgeeks.com als Kontrollebene durch Hinzufügen der Taints [Knotenrolle.Kubernetes.io/master:NoSchedule] [bootstrap-token] Token verwenden: nx1jjq.u42y27ip3bhmj8vj [bootstrap-token] Konfigurieren von Bootstrap-Token, Cluster-Info ConfigMap, RBAC-Rollen [bootstrap-token] konfigurierte RBAC-Regeln, damit Knoten-Bootstrap-Token CSRs posten können, damit Knoten langfristige Zertifikatsanmeldeinformationen erhalten [Bootstrap-token] konfigurierte RBAC Regeln, damit der csrapprover-Controller CSRs von einem Node-Bootstrap-Token automatisch genehmigen kann [bootstrap-token] konfigurierte RBAC-Regeln, um die Zertifikatsrotation für alle Node-Client-Zertifikate im Cluster zuzulassen [bootstrap-token] Erstellen der "cluster-info" ConfigMap im " kube-public"-Namespace [kubelet-finalize] Aktualisieren von "/etc/kubernetes/kubelet.conf", um auf ein drehbares Kubelet-Client-Zertifikat und -Schlüssel zu verweisen [Addons] Angewandtes Essential Addon: CoreDNS [Addons] Angewandtes Essential Addon: kube-proxy Ihre Kubernetes-Steuerungsebene wurde erfolgreich initialisiert! Um Ihren Cluster zu verwenden, müssen Sie als normaler Benutzer Folgendes ausführen: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Sie sollten jetzt ein Pod-Netzwerk für den Cluster bereitstellen. Führen Sie "kubectl apply -f [podnetwork] aus.yaml" mit einer der Optionen, die unter https://kubernetes . aufgeführt sind.io/docs/concepts/cluster-administration/addons/ Dann können Sie einer beliebigen Anzahl von Worker-Knoten beitreten, indem Sie auf jedem als Root Folgendes ausführen: kubeadm join 192.168.122.10:6443 --token nx1jjq.u42y27ip3bhmj8vj \ --discovery-token-ca-cert-hash sha256:c6de85f6c862c0d58cc3d10fd199064ff25c4021b6e88475822d6163a25b4a6c

Kopiere das kubectl Konfigurationsdatei.

mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

Auch zur Kasse: Einfache Verwaltung mehrerer Kubernetes-Cluster mit kubectl & kubectx

Bereitstellen eines Pod-Netzwerks im Cluster

Ich werde Calico verwenden, aber Sie können jedes andere Pod-Netzwerk-Add-On Ihrer Wahl verwenden.

kubectl apply -f https://docs.Projektkaliko.org/v3.8/manifeste/kaliko.jaml

Dadurch werden eine Reihe von Ressourcen erstellt, wie in der folgenden Ausgabe zu sehen ist.

configmap/calico-config erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/felixkonfigurationen.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/ipamblöcke.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/blockaffinitäten.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/ipamhandles.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/ipamconfigs.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/bgpeers.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/bgp-Konfigurationen.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/ippools.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/hostendpoints.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/Clusterinformationen.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/globale Netzwerkrichtlinien.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/globale Netzwerke.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/Netzwerkrichtlinien.crd.Projektkaliko.org erstellt benutzerdefinierte Ressourcendefinition.apiextensions.k8s.io/Netzwerke.crd.Projektkaliko.org hat Clusterrolle erstellt.rbac.Genehmigung.k8s.io/calico-kube-controllers hat Clusterrollenbindung erstellt.rbac.Genehmigung.k8s.io/calico-kube-controllers hat Clusterrolle erstellt.rbac.Genehmigung.k8s.io/calico-node erstellt Clusterrollenbindung.rbac.Genehmigung.k8s.io/calico-node erstelltes Daemonset.apps/calico-node erstellt serviceaccount/calico-node erstellt Bereitstellung.apps/calico-kube-controllers erstellt serviceaccount/calico-kube-controllers erstellt

Bestätigen Sie mit dem folgenden Befehl, dass alle Pods ausgeführt werden.

Watch kubectl pods abrufen --all-namespaces

Sobald alles wie erwartet läuft, sieht die Ausgabe wie unten aus.

NAMESPACE NAME BEREIT STATUS NEUSTARTEN ALTER kube-system calico-kube-controllers-5c45f5bd9f-c8mwx 1/1 Wird ausgeführt 0 3m45s kube-system calico-node-m5qmb 1/1 Wird ausgeführt 0 3m45s kube-system coredns-6955765f44-cz65r 0 9m43s kube-system coredns-6955765f44-mtch2 1/1 Läuft 0 9m43s kube-system etcd-k8smaster01.Computerforgeeks.com 1/1 Läuft 0 9m59s kube-system kube-apiserver-k8smaster01.Computerforgeeks.com 1/1 Läuft 0 9m59s kube-system kube-controller-manager-k8smaster01.Computerforgeeks.com 1/1 Laufen 0 9m59s kube-system kube-proxy-bw494 1/1 Laufen 0 9m43s kube-system kube-scheduler-k8smaster01.Computerforgeeks.com 1/1 Laufen 0 9m59s

Beachten Sie, dass jeder Pod die STATUS von Laufen.

Weitere Informationen finden Sie in der Calico-Dokumentation.

Schritt 3: Verbinden Ihrer Worker-Knoten mit dem Cluster

Nachdem Sie nun den Kontrollknoten bereit haben, können Sie neue Knoten hinzufügen, auf denen Ihre Workloads (Container und Pods usw.) ausgeführt werden. Sie müssen dies auf jedem Computer tun, der zum Ausführen von Pods verwendet werden soll.

$ ssh [email protected]
sudo kubeadm beitreten 192.168.122.10:6443 --token nx1jjq.u42y27ip3bhmj8vj \ --discovery-token-ca-cert-hash sha256:c6de85f6c862c0d58cc3d10fd199064ff25c4021b6e88475822d6163a25b4a6c

Wenn das Token abgelaufen ist, können Sie mit dem Befehl ein neues generieren:

kubeadm-Token erstellen

Holen Sie sich den Token

kubeadm-Token-Liste

Sie können den Wert von Discovery-Token-ca-Cert-Hash mit dem Befehl:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

Hier ist eine Ausgabe des Join-Befehls:

 [Preflight] Ausführen von Preflight-Checks [Preflight] Lesen der Konfiguration aus dem Cluster… [Preflight] Zur Info: Sie können sich diese Konfigurationsdatei mit 'kubectl -n kube-system get cm kubeadm-config -oyaml' ansehen [kubelet-start] Herunterladen der Konfiguration für das Kubelet aus der "kubelet-config-1.17" ConfigMap im kube-system namespace [kubelet-start] Kubelet-Konfiguration in Datei "/var/lib/kubelet/config" schreiben.yaml" [kubelet-start] Schreiben einer Kubelet-Umgebungsdatei mit Flags in die Datei "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Starten des kubelet [kubelet-start] Warten darauf, dass das kubelet den TLS-Bootstrap durchführt… Dieser Knoten ist dem Cluster beigetreten: * Zertifikatsignierungsanforderung wurde an apiserver gesendet und eine Antwort wurde empfangen. * Das Kubelet wurde über die neuen sicheren Verbindungsdetails informiert. Führen Sie 'kubectl get node' auf der Steuerungsebene aus, um zu sehen, wie dieser Knoten dem Cluster beitritt.

Führen Sie denselben Join-Befehl auf allen anderen Worker-Knoten aus und sehen Sie sich dann die verfügbaren Knoten an, die dem Cluster mit dem Befehl beigetreten sind:

$ kubectl get node NAME STATUS ROLES ALTER VERSION k8smaster01.Computerforgeeks.com Bereit Master 26m v1.17.0 k8snode01.Computerforgeeks.com Bereit  4m35s v1.17.0 k8snode02.Computerforgeeks.com Bereit  2m4s v1.17.0 

Schritt 4: Metrics Server im Kubernetes-Cluster bereitstellen

Metrikserver ist ein clusterweiter Aggregator von Ressourcennutzungsdaten. Es sammelt Metriken von den Zusammenfassungs-API, ausgesetzt von Kubelet auf jedem Knoten. Verwenden Sie unsere Anleitung unten, um es bereitzustellen:

So stellen Sie Metrics Server im Kubernetes-Cluster bereit

Schritt 5: Ideen für dauerhafte Speicherung

Wenn Sie auch nach einer persistenten Speicherlösung für Ihr Kubernetes suchen, gehen Sie zur Kasse:

Ceph Persistent Storage für Kubernetes mit Cephfs

Persistenter Speicher für Kubernetes mit Ceph RBD

So konfigurieren Sie die dynamische Kubernetes-Volume-Bereitstellung mit Heketi und GlusterFS

Sehen Sie sich die folgenden Schulungen an, um mehr zu erfahren:Zertifizierter Kubernetes-Administrator (CKA) mit PraxistestsZertifizierter Kubernetes Administrator (CKA) mit Praxistests$12.06$156.75auf LagerJETZT KAUFENUdemy.comKubernetes für absolute Anfänger - Hands-onKubernetes für absolute Anfänger - Hands-on$12.06$156.75auf LagerJETZT KAUFENUdemy.comKubernetes Certified Application Developer (CKAD) mit TestsKubernetes Certified Application Developer (CKAD) mit Tests$12.06$156.75auf LagerJETZT KAUFENUdemy.com

Fazit

Da haben Sie es, Sie haben jetzt einen laufenden Kubernetes-Cluster, mit dem Sie native Cloud-Anwendungen entwickeln können. Wir haben andere Leitfäden zu Kubernetes, wie zum Beispiel:

So ziehen Sie Container-Images manuell, die von Kubernetes kubeadm verwendet werden

Installieren und verwenden Sie Helm 3 auf einem Kubernetes-Cluster

Installieren und verwenden Sie Helm 2 auf einem Kubernetes-Cluster

Kubernetes Service / User Account erstellen und mit RBAC auf einen Namespace beschränken

Dev Warum Offshoring eine großartige Option für Softwareunternehmen ist
Warum Offshoring eine großartige Option für Softwareunternehmen ist
Softwareentwicklung ist ein komplizierter Prozess mit vielen Schritten und beweglichen Teilen, der von Unternehmen qualifiziertes Talent, ein hohes Bu...
Dev Python 3 installieren.8 auf CentOS 7 / CentOS 8
Python 3 installieren.8 auf CentOS 7 / CentOS 8
In dieser Anleitung erfahren Sie, wie Sie Python 3 installieren.8 auf CentOS 7 / CentOS 8. Python ist eine beliebte Programmiersprache, die ursprüngli...
Dev 14 neue Geschäftsideen für mobile Apps, um im Jahr 2021 Geld zu verdienen
14 neue Geschäftsideen für mobile Apps, um im Jahr 2021 Geld zu verdienen
Ein Anwendungs-Startup ist eine ausgezeichnete Idee. Die Zahl neuer Anwendungen im Markt wächst kontinuierlich continuously. Im Jahr 2020 wurden über ...