Kubernetes ist ein Open-Source-Container-Orchestrierungstool auf Produktionsniveau, das dabei hilft, die Bereitstellung, Skalierung und Verwaltung containerisierter Anwendungen zu automatisieren. Google hat Kubernetes ursprünglich entwickelt und wird jetzt von der Cloud Native Computing Foundation verwaltet.
Sie können Kubernetes aufrufen ist ein Cluster-Manager für Docker , und es bietet fast dieselben Funktionen wie Docker Swarm . Mit Kubernetes können Sie eine beliebige Anzahl von Containerreplikaten auf einem Knotencluster bereitstellen, und Kubernetes kümmert sich um die verbleibenden (wo Container hochgefahren werden) für Sie.
Wir können Kubernetes auf dem lokalen Computer mit den folgenden Methoden ausführen,
1. MinKube – Ein Kubernetes-Cluster mit einem Knoten für Entwicklung und Tests.
2. Kubeadm-dind (Kuberadm) – Ein Kubernetes-Cluster mit mehreren Knoten
Alle Methoden können Sie hier nachlesen .
Hier werden wir einen Kubernetes-Cluster mit mehreren Knoten mithilfe von kubeadm bereitstellen. In diesem Multi-Node-Setup haben wir einen Master-Node und mehrere Worker-Nodes (Minions).
Komponenten
Master-Knoten
kube-API-Server: Es ist ein API-Server, der auf dem Master-Knoten ausgeführt wird, der die Kubernetes-API
etcd: verfügbar macht Ein Schlüsselspeicher, der Kubenetes-Clusterdaten speichert
kube-scheduler: Es ist ein Planer, der auf dem Master-Knoten ausgeführt wird, der neu erstellte Pods überwacht und diese Pods abhängig von der Ressourcenverfügbarkeit auf ausgewählten Knoten ausführt.
kube-controller-manager: Es ist ein Steuerungsmanager, der auf dem Manager ausgeführt wird, der für die Überwachung der Knoten und die Aufrechterhaltung der Pod-Replikation verantwortlich ist.
cloud-controller-manager: Ein Cloud Control Manager, der mit zugrunde liegenden Cloud-Anbietern interagiert (z. B. DigitalOcean, Rancher usw.).
Worker-Knoten
kubelet: Es wird auf allen Worker-Knoten ausgeführt und übernimmt Aufgaben wie das Starten von Pods und Containern.
kube-proxy: Es ist ein Kubernetes-Netzwerk-Proxy, der eingehende TCP/UDP-Anforderungen an den Back-End-Container weiterleitet.
Container-Laufzeit: Es ist eine Container-Software (Docker)
Umgebung
Knoten | Hostname | IP-Adresse | Betriebssystem | Prozessor | RAM |
---|---|---|---|---|---|
Master-Knoten | master.itzgeek.local | 192.168.1.10 | CentOS 7 / RHEL 7 | 2 | 2 GB |
Minion-Knoten 1 | node1.itzgeek.local | 192.168.1.20 | Ubuntu 18.04 / 16.04 | 2 | 2 GB |
Minion-Knoten 2 | node2.itzgeek.local | 192.168.1.30 | Debian 9 | 2 | 2 GB |
Hier verwende ich eine gemischte Umgebung für diese Demo. Ich bitte Sie jedoch, das ähnliche Betriebssystem nur zur einfacheren Fehlerbehebung zu verwenden.
Voraussetzungen
Werden Sie Root-Benutzer.
su -
ODER
sudo su -
Hostnamen festlegen
Legen Sie einen eindeutigen Hostnamen für alle Ihre Knoten fest. Beispiel:
hostnamectl set-hostname master.itzgeek.local
Machen Sie einen Host-Eintrag oder DNS Eintrag zum Auflösen des Hostnamens für alle Knoten.
vi /etc/hosts
Eintrag:
192.168.1.10 master.itzgeek.local master192.168.1.20 node1.itzgeek.local node1192.168.1.30 node2.itzgeek.local node2
Firewall
Konfigurieren Sie die Firewall für Kubernetes so, dass sie ordnungsgemäß funktioniert.
Auf Masterknoten
FirwallD:
firewall-cmd --permanent --add-port=6443/tcpfirewall-cmd --permanent --add-port=2379-2380/tcpfirewall-cmd --permanent --add-port=10250/tcpfirewall-cmd --permanent --add-port=10251/tcpfirewall-cmd --permanent --add-port=10252/tcpfirewall-cmd --permanent --add-port=10255/tcpfirewall-cmd --reload
UFW:
ufw zulassen 6443/tcpufw zulassen 2379tcpufw zulassen 2380/tcpufw zulassen 10250/tcpufw zulassen 10251/tcpufw zulassen 10252/tcpufw zulassen 10255/tcpufw neu laden
Auf Worker-Knoten
FirwallD:
firewall-cmd --permanent --add-port=10251/tcpfirewall-cmd --permanent --add-port=10255/tcpfirewall-cmd --reload
UFW:
ufw zulassen 10251/tcpufw zulassen 10255/tcpufw neu laden
SELinux
Erwägen Sie, SELinux auf CentOS 7/RHEL 7 zu deaktivieren Knoten.
setenforce 0sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
Kernel-Einstellungen
In RHEL 7/CentOS 7 , setzen Sie net.bridge.bridge-nf-call-iptables in Ihrer sysctl-Konfiguration auf 1.
cat </etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables =1net.bridge.bridge-nf-call-iptables =1EOFsysctl -p
Docker installieren
Installieren Sie Docker auf allen Ihren Knoten (Master und Minions). Docker-Version v18.06 wird empfohlen, aber v1.11, v1.12, v1.13 und 17.03 funktionieren auch gut mit Kubernetes.
CentOS 7 / RHEL 7
### Installieren Sie Docker aus dem CentOS/RHEL-Repository ### yum install -y dockersystemctl docker aktivieren systemctl docker starten ODER ### Docker CE 18.06 aus den CentOS-Repositories von Docker installieren #### Voraussetzungen installieren yum install -y yum-utils device-mapper-persistent-data lvm2# Docker-Repository hinzufügen yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # Dockeryum installieren updateyum install -y docker-ce-18.06.1.ce# Docker-Verzeichnis erstellen mkdir /etc/docker# Docker Daemoncat einrichten> /etc/docker/daemon.json <Ubuntu 18.04 / Ubuntu 16.04
### Installieren Sie Docker aus den Repositories von Ubuntu ### apt-get updateapt-get install -y docker.ioODER ### Installieren Sie Docker CE 18.06 aus den Docker-Repositories für Ubuntu #### Installationsvoraussetzungen apt-get updateapt-get install -y apt-transport-https ca-certificates curl software-properties-common# GPG-Schlüssel herunterladen curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -# Docker-Repository hinzufügen add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"# Docker installieren apt-get updateapt-get install -y docker-ce=18.06.0~ce~3-0~ubuntu# Setup Daemon cat> /etc/docker/daemon.json <# Docker Daemon neu starten systemctl daemon-reloadsystemctl docker neu starten Debian 9
### Installieren Sie Docker aus den Debian-Repositories ### apt-get updateapt-get install -y docker.ioODER ### Installieren Sie Docker CE 18.06 aus den Docker-Repositories für Debian ### # Installationsvoraussetzung sapt-get updateapt-get install -y apt-transport-https ca-certificates curl software-properties-common# GPG-Schlüssel herunterladen curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -# Docker-Repository hinzufügen add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable"# Docker installieren apt-get updateapt-get install -y docker-ce=18.06.0~ce~3-0~debian# Setup Daemon cat> /etc/docker/daemon.json <# Docker Daemon neu starten systemctl daemon-reloadsystemctl docker neu starten Kubernetes-Repository konfigurieren
Kubernetes Pakete sind nicht in OS-Repositorys verfügbar, daher müssen Sie die folgenden Schritte ausführen, um das Repository auf allen Ihren Knoten zu konfigurieren.
### CentOS 7 / RHEL 7 ###cat </etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://packages.cloud.google.com/ yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum /doc/rpm-package-key.gpgexclude=kube*EOF### Ubuntu 18.04 / 16.05 &Debian 9 ###apt-get updateapt-get install -y curl apt-transport-httpscurl -s https://packages. cloud.google.com/apt/doc/apt-key.gpg | apt-key add -echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list Installieren Sie kubeadm, kubelet und kubectl
Führen Sie auf allen Ihren Knoten die folgenden Befehle aus, um die erforderlichen Pakete zu installieren.
kubeadm:Der Befehl zum Erstellen des Clusters.
kubelet:Läuft auf allen Maschinen in Ihrem Cluster und erledigt Dinge wie das Starten von Pods und Containern.
kubectl:das Befehlszeilendienstprogramm zum Verwalten Ihres Clusters.
### CentOS 7 / RHEL 7 ###yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetssystemctl enable kubelet systemctl start kubelet### Ubuntu 16.04 / Debian 9 ###apt-get updateapt-get install - und kubelet kubeadm kubectlKubernetes-Master initialisieren
Führen Sie auf dem Master-Knoten den Befehl kubeadm init im Terminal aus, um den Cluster zu initialisieren.
Abhängig vom Netzwerk-Add-on Sie verwenden, müssen Sie möglicherweise--pod-network-cidr
festlegen auf einen bestimmten Wert. Hier verwende ich das Wave-Pod-Netzwerk, das keine zusätzlichen Argumente erfordert.kubeadm initAusgabe:
[init] Verwendung von Kubernetes Version:v1.13.0[preflight] Ausführen von Preflight-Checks [WARNUNG Firewalld]:Firewalld ist aktiv, bitte stellen Sie sicher, dass die Ports [6443 10250] offen sind oder Ihr Cluster möglicherweise nicht richtig funktioniert[preflight] Pulling Bilder, die zum Einrichten eines Kubernetes-Clusters erforderlich sind[Preflight] Dies kann je nach Geschwindigkeit Ihrer Internetverbindung ein oder zwei Minuten dauern[Preflight] Sie können diese Aktion auch im Voraus mit „kubeadm config images pull“ ausführen[kubelet-start] Schreiben der kubelet-Umgebungsdatei mit Flags in die Datei „/var/lib/kubelet/kubeadm-flags.env“[kubelet-start] Schreiben der kubelet-Konfiguration in die Datei „/var/lib/kubelet/config.yaml“[kubelet-start] Aktivieren the kubelet service[certs] Using certificateDir folder „/etc/kubernetes/pki“[certs] Generating „ca“ certificate and key[certs] Generating „apiserver-kubelet-client“ certificate and key. . .. . .. . .[bootstraptoken] konfigurierte RBAC-Regeln, um die Zertifikatsrotation für alle Knoten-Client-Zertifikate im Cluster zuzulassen[bootstraptoken] erstellte die „cluster-info“-ConfigMap im „kube-public“-Namespace[addons] Angewandtes wesentliches Add-on:CoreDNS[addons] Angewendet Essential Add-on:kube-proxyIhr Kubernetes-Master wurde erfolgreich initialisiert!Um Ihren Cluster zu verwenden, müssen Sie Folgendes als normaler Benutzer 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 im Cluster bereitstellen. Führen Sie „kubectl apply -f [podnetwork].yaml“ mit einer der unter https://kubernetes.io/docs/concepts/cluster-administration/addons/You aufgeführten Optionen aus kubeadm beitreten 192.168.1.10:6443 --token d1dyaj.31zxywbg93s1ywjy --discovery-token-ca-cert-Hash sha256:71a91721595fde66b6382908d801266602a14de8e16bdb7a3cede21509427009 können nun mit dem folgenden auf jeder nodeas Wurzel eine beliebige Anzahl von Maschinen verbindenCluster verwalten
Führen Sie diese Befehle im Terminal aus, um den Cluster als normaler Benutzer zu verwalten und zu bearbeiten.
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configFühren Sie den Befehl kubectl get pods –all-namespaces aus, um den Status des Clusters zu überprüfen.
kubectl get pods --all-namespacesAusgabe:
Sie können diese Coredns sehen Pod befindet sich im Wartezustand und der Status sollte sich ändern, sobald Sie das Pod-Netzwerk installieren.
Pod-Netzwerk einrichten
Wir müssen ein Pod-Netzwerk-Add-On auf dem Cluster einrichten, damit Pods miteinander kommunizieren können. Es gibt mehrere Projekte, die Kubernetes-Pod-Netzwerke bereitstellen nämlich Kaliko, Kanal, Flanell usw.
Hier verwenden wir das Wave-Pod-Netzwerk für diese Demo.
export kubever=$(kubectl version | base64 | tr -d '\n')kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"Ausgabe:
Dienstkonto/weave-net createdclusterrole.rbac.authorization.k8s.io/weave-net createdclusterrolebinding.rbac.authorization.k8s.io/weave-net createdrole.rbac.authorization.k8s.io/weave-net createdrolebinding.rbac .authorization.k8s.io/weave-net erstelltdaemonset.extensions/weave-net erstelltÜberprüfen Sie den Clusterstatus noch einmal. Der coredns-Pod sollte jetzt im Status running sein.
kubectl get pods --all-namespacesAusgabe:
Arbeiterknoten mit dem Kuberenete-Cluster verbinden
Wenn Sie sich erinnern, gab es in der Ausgabe des Befehls kubeadm init ein Token zum Verbinden von Knoten. Verwenden Sie das Token und treten Sie allen Ihren Worker-Knoten bei.
kubeadm join 192.168.1.10:6443 --token d1dyaj.31zxywbg93s1ywjy --discovery-token-ca-cert-hash sha256:71a91721595fde66b6382908d801266602a14de8e16bdb7a3cede27094pre>Ausgabe:
[preflight] Preflight-Prüfungen werden ausgeführt[discovery] Versucht, eine Verbindung zum API-Server „192.168.1.10:6443“ herzustellen[discovery] Cluster-Info-Discovery-Client erstellt, Informationen von „https://192.168.1.10:6443 „[Erkennung] Fordern von Informationen von „https://192.168.1.10:6443“ erneut an, um TLS anhand des angehefteten öffentlichen Schlüssels zu validieren[Erkennung] Signatur und Inhalte der Clusterinformationen sind gültig und das TLS-Zertifikat wird anhand der angehefteten Wurzeln validiert, wird den API-Server verwenden“ 192.168.1.10:6443"[discovery] Erfolgreich hergestellte Verbindung mit API Server "192.168.1.10:6443"[join] Lese Konfiguration aus dem Cluster...[join] FYI:Sie können sich diese Konfigurationsdatei mit 'kubectl -n kube-system get cm kubeadm-config -oyaml'[kubelet] Herunterladen der Konfiguration für das kubelet aus der ConfigMap "kubelet-config-1.13" im kube-system-Namespace[kubelet-start] Schreiben der kubelet-Konfiguration in die Datei "/var/lib /kubelet/config.yaml"[kubelet-start] Schreiben der kubelet-Umgebungsdatei mit Flags in die Datei "/var/lib/kubelet/kubeadm-fl ags.env"[kubelet-start] Aktivieren des Kubelet-Dienstes[tlsbootstrap] Warten, bis das Kubelet den TLS-Bootstrap ausführt...[patchnode] Hochladen der CRI-Socket-Informationen "/var/run/dockershim.sock" in die Knoten-API Objekt "node1.itzgeek.local" als Anmerkung 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 nodes" aus den Master, um zu sehen, wie dieser Knoten dem Cluster beitritt.Die obige Ausgabe bestätigt, dass der Knoten erfolgreich zum Cluster hinzugefügt wurde.
Überprüfen Sie nun den Status der Worker-Knoten auf dem Master-Knoten mit dem folgenden Befehl.
kubectl erhält KnotenAusgabe:
Sie sollten sehen, dass Worker-Knoten bereit sind.
In unserem nächsten Artikel werden wir Pods, Dienste und Replikationscontroller in Kubernetes bereitstellen.
Das ist alles.