Lukša / Luksa | Kubernetes in Action | E-Book | www.sack.de
E-Book

E-Book, Deutsch, 670 Seiten

Lukša / Luksa Kubernetes in Action

Anwendungen in Kubernetes-Clustern bereitstellen und verwalten
1. Auflage 2018
ISBN: 978-3-446-45602-0
Verlag: Carl Hanser
Format: PDF
Kopierschutz: 1 - PDF Watermark

Anwendungen in Kubernetes-Clustern bereitstellen und verwalten

E-Book, Deutsch, 670 Seiten

ISBN: 978-3-446-45602-0
Verlag: Carl Hanser
Format: PDF
Kopierschutz: 1 - PDF Watermark



Mit Kubernetes große Container-Infrastrukturen ausfallsicher verwalten Nach einer Einführung in die typischen Problemstellungen, mit denen Softwareentwickler und Administratoren konfrontiert sind, und wie diese mit Kubernetes gelöst werden können, lernen Sie in einem ersten Beispielprojekt die praktische Umsetzung. Es wird gezeigt, wie eine einfache in einem Container laufende Web-Applikation über ein Kubernetes-Cluster verwaltet werden kann. Im zweiten Teil des Buches lernen Sie die zu Grunde liegenden Konzepte kennen, deren Verständnis unbedingt notwendig ist, um große Container-Cluster mit Kubernetes zu betreiben. Im letzten Teil wird die Funktionsweise von Kubernetes beschrieben und auf weiterführende Aspekte eingegangen. Hier wird außerdem das erworbene Wissen aus den ersten beiden Teilen zusammengeführt, damit Sie den vollen Nutzen aus der Kubernetes-Plattform ziehen können.

Marko Luk?a ist Software Engineer bei Red Hat im Cloud Enablement Team. Das Team sorgt dafür, dass Red Hat's Enterprise Middleware-Produkte auf OpenShift funktionieren - eine PaaS-Plattform, die auf Kubernetes läuft. Durch seine 15-jährige Erfahrung als Trainer gelingt es ihm besonders gut schwierige Inhalte einfach und verständlich zu vermitteln.
Lukša / Luksa Kubernetes in Action jetzt bestellen!

Autoren/Hrsg.


Weitere Infos & Material


1;Inhalt;9
2;Vorwort;23
2.1;Der Autor;24
2.2;Danksagung zur englischsprachigen Ausgabe;25
3;Über dieses Buch;27
3.1;Zielgruppe;27
3.2;Der Aufbau dieses Buches;28
3.3;Der Code;29
3.4;Das Forum zum Buch;30
3.5;Sonstige Onlinequellen;30
4;Teil I: Überblick;31
4.1;1 Einführung in Kubernetes;33
4.1.1;1.1 Der Bedarf für ein System wie Kubernetes;34
4.1.1.1;1.1.1 Von monolithischen Anwendungen zu Microservices;34
4.1.1.2;1.1.2 Eine konsistente Umgebung für Anwendungen bereitstellen;38
4.1.1.3;1.1.3 Übergang zu Continuous Delivery: DevOps und NoOps;38
4.1.2;1.2 Containertechnologien;40
4.1.2.1;1.2.1 Was sind Container?;40
4.1.2.2;1.2.2 Die Containerplattform Docker;44
4.1.2.3;1.2.3 Die Docker-Alternative rkt;48
4.1.3;1.3 Kubernetes;49
4.1.3.1;1.3.1 Die Ursprünge;49
4.1.3.2;1.3.2 Kubernetes im Überblick;49
4.1.3.3;1.3.3 Die Architektur eines Kubernetes-Clusters;51
4.1.3.4;1.3.4 Anwendungen auf Kubernetes ausführen;52
4.1.3.5;1.3.5 Vorteile der Verwendung von Kubernetes;54
4.1.4;1.4 Zusammenfassung;57
4.2;2 Erste Schritte mit Docker und Kubernetes;59
4.2.1;2.1 Containerimages mit Docker erstellen, ausführen und teilen;59
4.2.1.1;2.1.1 Docker installieren und einen Hello-world-Container ausführen;60
4.2.1.2;2.1.2 Eine triviale Node.js-Anwendung erstellen;62
4.2.1.3;2.1.3 Eine Docker-Datei für das Image erstellen;63
4.2.1.4;2.1.4 Das Containerimage erstellen;63
4.2.1.5;2.1.5 Das Containerimage ausführen;66
4.2.1.6;2.1.6 Das Innenleben eines laufenden Containers untersuchen;67
4.2.1.7;2.1.7 Container anhalten und entfernen;69
4.2.1.8;2.1.8 Das Image zu einer Registry hochladen;69
4.2.2;2.2 Kubernetes-Cluster einrichten;71
4.2.2.1;2.2.1 Einen lokalen Kubernetes-Cluster mit einem Knoten mithilfe von Minikube ausführen;71
4.2.2.2;2.2.2 Gehostete GKE-Cluster;73
4.2.2.3;2.2.3 Einen Alias und die Befehlszeilenvervollständigung für kubectl einrichten;76
4.2.3;2.3 Eine erste Anwendung in Kubernetes ausführen;77
4.2.3.1;2.3.1 Die Node.js-Anwendung bereitstellen;78
4.2.3.2;2.3.2 Auf die Webanwendung zugreifen;81
4.2.3.3;2.3.3 Die logischen Bestandteile des Systems;82
4.2.3.4;2.3.4 Anwendungen horizontal skalieren;84
4.2.3.5;2.3.5 Auf welchen Knoten läuft die Anwendung?;87
4.2.3.6;2.3.6 Das Kubernetes-Dashboard;88
4.2.4;2.4 Zusammenfassung;89
5;Teil II: Grundlagen;91
5.1;3 Pods: Container in Kubernetes ausführen;93
5.1.1;3.1 Einführung in Pods;93
5.1.1.1;3.1.1 Wozu benötigen wir Pods?;94
5.1.1.2;3.1.2 Grundlagen von Pods;95
5.1.1.3;3.1.3 Container auf Pods verteilen;96
5.1.2;3.2 Pods aus YAML- und JSON-Deskriptoren erstellen;99
5.1.2.1;3.2.1 Den YAML-Deskriptor eines bestehenden Pods untersuchen;99
5.1.2.2;3.2.2 Einen einfachen YAML-Deskriptor für einen Pod schreiben;101
5.1.2.3;3.2.3 Einen Pod mit kubectl create erstellen;103
5.1.2.4;3.2.4 Anwendungsprotokolle anzeigen;104
5.1.2.5;3.2.5 Anforderungen an den Pod senden;105
5.1.3;3.3 Pods mithilfe von Labels ordnen;106
5.1.3.1;3.3.1 Einführung in Labels;107
5.1.3.2;3.3.2 Labels beim Erstellen eines Pods angeben;108
5.1.3.3;3.3.3 Labels vorhandener Pods ändern;109
5.1.4;3.4 Eine Auswahl der Pods mithilfe von Labelselektoren auflisten;110
5.1.4.1;3.4.1 Pods anhand eines Labelselektors auflisten;110
5.1.4.2;3.4.2 Labelselektoren mit mehreren Bedingungen;112
5.1.5;3.5 Die Podzuweisung mithilfe von Labels und Selektoren einschränken;112
5.1.5.1;3.5.1 Labels zur Klassifizierung von Arbeitsknoten;113
5.1.5.2;3.5.2 Pods bestimmten Knoten zuweisen;114
5.1.5.3;3.5.3 Zuweisung zu einem einzelnen Knoten;114
5.1.6;3.6 Pods mit Anmerkungen versehen;115
5.1.6.1;3.6.1 Die Anmerkungen zu einem Objekt einsehen;115
5.1.6.2;3.6.2 Anmerkungen hinzufügen und ändern;116
5.1.7;3.7 Ressourcen mithilfe von Namespaces gruppieren;116
5.1.7.1;3.7.1 Der Bedarf für Namespaces;117
5.1.7.2;3.7.2 Andere Namespaces und die zugehörigen Pods finden;117
5.1.7.3;3.7.3 Namespaces erstellen;118
5.1.7.4;3.7.4 Objekte in anderen Namespaces verwalten;119
5.1.7.5;3.7.5 Die Trennung der Namespaces;120
5.1.8;3.8 Pods stoppen und entfernen;120
5.1.8.1;3.8.1 Pods unter Angabe des Namens löschen;120
5.1.8.2;3.8.2 Pods mithilfe von Labelselektoren löschen;121
5.1.8.3;3.8.3 Pods durch Entfernen eines ganzen Namespaces löschen;121
5.1.8.4;3.8.4 Alle Pods in einem Namespace löschen und den Namespace erhalten;122
5.1.8.5;3.8.5 (Fast) alle Ressourcen in einem Namespace löschen;122
5.1.9;3.9 Zusammenfassung;123
5.2;4 Replikationscontroller & Co.: Verwaltete Pods bereitstellen;125
5.2.1;4.1 Pods funktionsfähig halten;126
5.2.1.1;4.1.1 Aktivitätssonden;126
5.2.1.2;4.1.2 HTTP-Aktivitätssonden erstellen;127
5.2.1.3;4.1.3 Eine Aktivitätssonde in Aktion;128
5.2.1.4;4.1.4 Weitere Eigenschaften der Aktivitätssonde festlegen;129
5.2.1.5;4.1.5 Wirkungsvolle Aktivitätssonden erstellen;130
5.2.2;4.2 Replikationscontroller;132
5.2.2.1;4.2.1 Die Funktionsweise von Replikationscontrollern;133
5.2.2.2;4.2.2 Einen Replikationscontroller erstellen;135
5.2.2.3;4.2.3 Der Replikationscontroller in Aktion;136
5.2.2.4;4.2.4 Pods in den Gültigkeitsbereich eines Replikationscontrollers bringen und daraus entfernen;141
5.2.2.5;4.2.5 Das Pod-Template ändern;144
5.2.2.6;4.2.6 Pods horizontal skalieren;145
5.2.2.7;4.2.7 Einen Replikationscontroller löschen;147
5.2.3;4.3 Replikationssätze anstelle von Replikationscontrollern verwenden;148
5.2.3.1;4.3.1 Replikationssätze und Replikationscontroller im Vergleich;148
5.2.3.2;4.3.2 Einen Replikationssatz definieren;149
5.2.3.3;4.3.3 Einen Replikationssatz erstellen und untersuchen;150
5.2.3.4;4.3.4 Die ausdrucksstärkeren Labelselektoren des Replikationssatzes;151
5.2.3.5;4.3.5 Zusammenfassung: Replikationssätze;152
5.2.4;4.4 Daemonsets zur Ausführung einer Instanz eines Pods auf jedem Knoten;152
5.2.4.1;4.4.1 Einen Pod auf allen Knoten ausführen;152
5.2.4.2;4.4.2 Einen Pod nur auf einigen Knoten ausführen;153
5.2.5;4.5 Pods für endliche Aufgaben;156
5.2.5.1;4.5.1 Jobs;157
5.2.5.2;4.5.2 Einen Job definieren;158
5.2.5.3;4.5.3 Ein Job in Aktion;158
5.2.5.4;4.5.4 Mehrere Podinstanzen in einem Job ausführen;159
5.2.5.5;4.5.5 Die Zeit zum Abschließen eines Job-Pods begrenzen;160
5.2.6;4.6 Jobs regelmäßig oder zu einem späteren Zeitpunkt ausführen;161
5.2.6.1;4.6.1 Einen Cron-Job erstellen;161
5.2.6.2;4.6.2 Die Ausführung geplanter Jobs;162
5.2.7;4.7 Zusammenfassung;163
5.3;5 Dienste: Pods finden und mit ihnen kommunizieren;165
5.3.1;5.1 Dienste;166
5.3.1.1;5.1.1 Dienste erstellen;167
5.3.1.2;5.1.2 Dienste finden;173
5.3.2;5.2 Verbindungen zu Diensten außerhalb des Clusters;177
5.3.2.1;5.2.1 Dienstendpunkte;177
5.3.2.2;5.2.2 Manuell eingerichtete Dienstendpunkte;178
5.3.2.3;5.2.3 Einen Alias für einen externen Dienst erstellen;180
5.3.3;5.3 Dienste für externe Clients verfügbar machen;181
5.3.3.1;5.3.1 Einen NodePort-Dienst verwenden;181
5.3.3.2;5.3.2 Einen Dienst über einen externen Load Balancer verfügbar machen;185
5.3.3.3;5.3.3 Besondere Eigenschaften von externen Verbindungen;187
5.3.4;5.4 Dienste über eine Ingress-Ressource extern verfügbar machen;189
5.3.4.1;5.4.1 Eine Ingress-Ressource erstellen;191
5.3.4.2;5.4.2 Über den Ingress auf den Dienst zugreifen;192
5.3.4.3;5.4.3 Mehrere Dienste über denselben Domänennamen verfügbar machen;193
5.3.4.4;5.4.4 Einen Ingress für TLS-Datenverkehr einrichten;194
5.3.5;5.5 Die Bereitschaft eines Pods zur Annahme von Verbindungen signalisieren;196
5.3.5.1;5.5.1 Bereitschaftssonden;197
5.3.5.2;5.5.2 Einem Pod eine Bereitschaftssonde hinzufügen;198
5.3.5.3;5.5.3 Bereitschaftssonden in der Praxis;200
5.3.6;5.6 Headless-Dienste zur Ermittlung einzelner Pods;202
5.3.6.1;5.6.1 Einen headless-Dienst erstellen;202
5.3.6.2;5.6.2 Pods über DNS finden;203
5.3.6.3;5.6.3 Alle Pods finden – auch diejenigen, die nicht bereit sind;204
5.3.7;5.7 Fehlerbehebung bei Diensten;205
5.3.8;5.8 Zusammenfassung;206
5.4;6 Volumes: Festplattenspeicher zu Containern hinzufügen;207
5.4.1;6.1 Volumes;208
5.4.1.1;6.1.1 Ein Beispiel;208
5.4.1.2;6.1.2 Arten von Volumes;210
5.4.2;6.2 Gemeinsame Datennutzung durch die Container;211
5.4.2.1;6.2.1 emptyDir-Volumes;211
5.4.2.2;6.2.2 Ein Git-Repository als Ausgangspunkt für ein Volume verwenden;214
5.4.3;6.3 Zugriff auf Dateien im Dateisystem des Arbeitsknotens;217
5.4.3.1;6.3.1 HostPath-Volumes;218
5.4.3.2;6.3.2 Systempods mit hostPath-Volumes;218
5.4.4;6.4 Dauerhafte Speicherung;220
5.4.4.1;6.4.1 Eine GCE Persistent Disk in einem Pod-Volume;220
5.4.4.2;6.4.2 Andere Arten von Volumes mit zugrunde liegendem persistenten Speicher;223
5.4.5;6.5 Pods von der zugrunde liegenden Speichertechnologie entkoppeln;225
5.4.5.1;6.5.1 Persistente Volumes und Claims;225
5.4.5.2;6.5.2 Ein persistentes Volume erstellen;226
5.4.5.3;6.5.3 Mit einem Claim ein persistentes Volume beanspruchen;228
5.4.5.4;6.5.4 Einen Claim in einem Pod verwenden;230
5.4.5.5;6.5.5 Vorteile der Verwendung von persistenten Volumes und Claims;231
5.4.5.6;6.5.6 Persistente Volumes wiederverwenden;232
5.4.6;6.6 Persistente Volumes dynamisch bereitstellen;234
5.4.6.1;6.6.1 Die verfügbaren Speichertypen mit Speicherklassen definieren;234
5.4.6.2;6.6.2 Die Speicherklasse in einem Claim angeben;235
5.4.6.3;6.6.3 Dynamische Bereitstellung ohne Angabe einer Speicherklasse;237
5.4.7;6.7 Zusammenfassung;240
5.5;7 Konfigurationszuordnungen und Secrets: Anwendungen konfigurieren;243
5.5.1;7.1 Konfiguration von Anwendungen im Allgemeinen;243
5.5.2;7.2 Befehlszeilenargumente an Container übergeben;245
5.5.2.1;7.2.1 Den Befehl und die Argumente in Docker definieren;245
5.5.2.2;7.2.2 Den Befehl und die Argumente in Kubernetes überschreiben;247
5.5.3;7.3 Umgebungsvariablen für einen Container einrichten;249
5.5.3.1;7.3.1 Eine Umgebungsvariable in einer Containerdefinition festlegen;250
5.5.3.2;7.3.2 Im Wert einer Variablen auf andere Umgebungsvariablen verweisen;250
5.5.3.3;7.3.3 Die Nachteile hartkodierter Umgebungsvariablen;251
5.5.4;7.4 Die Konfiguration mit einer Konfigurationszuordnung entkoppeln;251
5.5.4.1;7.4.1 Einführung in Konfigurationszuordnungen;251
5.5.4.2;7.4.2 Eine Konfigurationszuordnung erstellen;253
5.5.4.3;7.4.3 Einen Konfigurationseintrag als Umgebungsvariable an einen Container übergeben;256
5.5.4.4;7.4.4 Alle Einträge einer Konfigurationszuordnung auf einmal als Umgebungsvariablen übergeben;257
5.5.4.5;7.4.5 Einen Konfigurationseintrag als Befehlszeilenargument übergeben;258
5.5.4.6;7.4.6 Konfigurationsdateien mithilfe eines configMap-Volumes verfügbar machen;259
5.5.4.7;7.4.7 Die Konfiguration einer Anwendung ohne Neustart ändern;265
5.5.5;7.5 Sensible Daten mithilfe von Geheimnissen an Container übergeben;267
5.5.5.1;7.5.1 Einführung in Geheimnisse;268
5.5.5.2;7.5.2 Das Geheimnis default-token;268
5.5.5.3;7.5.3 Ein Geheimnis erstellen;270
5.5.5.4;7.5.4 Unterschiede zwischen Konfigurationszuordnungen und Geheimnissen;271
5.5.5.5;7.5.5 Das Geheimnis in einem Pod verwenden;273
5.5.5.6;7.5.6 Geheimnisse zum Abrufen von Images;277
5.5.6;7.6 Zusammenfassung;278
5.6;8 Von Anwendungen aus auf Podmetadaten und andere Ressourcen zugreifen;279
5.6.1;8.1 Metadaten über die Downward-API übergeben;279
5.6.1.1;8.1.1 Die verwendbaren Metadaten;280
5.6.1.2;8.1.2 Metadaten über Umgebungsvariablen verfügbar machen;281
5.6.1.3;8.1.3 Metadaten über Dateien in einem downwardAPI-Volume übergeben;284
5.6.2;8.2 Kommunikation mit dem Kubernetes-API-Server;287
5.6.2.1;8.2.1 Die REST-API von Kubernetes;288
5.6.2.2;8.2.2 Von einem Pod aus mit dem API-Server kommunizieren;292
5.6.2.3;8.2.3 Botschaftercontainer zur Vereinfachung der Kommunikation mit dem API-Server;298
5.6.2.4;8.2.4 Clientbibliotheken zur Kommunikation mit dem API-Server;300
5.6.3;8.3 Zusammenfassung;303
5.7;9 Deployments: Anwendungen deklarativ aktualisieren;305
5.7.1;9.1 Anwendungen in Pods aktualisieren;306
5.7.1.1;9.1.1 Alte Pods löschen und anschließend durch neue ersetzen;307
5.7.1.2;9.1.2 Neue Pods starten und danach die alten löschen;307
5.7.2;9.2 Automatische schrittweise Aktualisierung mit einem Replikationscontroller;309
5.7.2.1;9.2.1 Die ursprüngliche Version der Anwendung ausführen;309
5.7.2.2;9.2.2 Die schrittweise Aktualisierung mit kubectl durchführen;311
5.7.2.3;9.2.3 Warum ist kubectl rolling-update veraltet?;315
5.7.3;9.3 Deployments zur deklarativen Verwaltung von Anwendungen;317
5.7.3.1;9.3.1 Ein Deployment erstellen;317
5.7.3.2;9.3.2 Ein Deployment aktualisieren;320
5.7.3.3;9.3.3 Eine Bereitstellung zurücknehmen;324
5.7.3.4;9.3.4 Die Rolloutrate festlegen;327
5.7.3.5;9.3.5 Den Rolloutvorgang anhalten;329
5.7.3.6;9.3.6 Das Rollout fehlerhafter Versionen verhindern;331
5.7.4;9.4 Zusammenfassung;336
5.8;10 StatefulSets: Replizierte statusbehaftete Anwendungen bereitstellen;337
5.8.1;10.1 Statusbehaftete Pods replizieren;337
5.8.1.1;10.1.1 Mehrere Replikate mit jeweils eigenem Speicher ausführen;338
5.8.1.2;10.1.2 Eine unveränderliche Identität für jeden Pod bereitstellen;339
5.8.2;10.2 Statussätze;341
5.8.2.1;10.2.1 Statussätze und Replikationssätze im Vergleich;341
5.8.2.2;10.2.2 Unveränderliche Netzwerkidentität;342
5.8.2.3;10.2.3 Eigenen beständigen Speicher für jede Podinstanz zuweisen;344
5.8.2.4;10.2.4 Garantien von Statussätzen;346
5.8.3;10.3 Statussätze nutzen;347
5.8.3.1;10.3.1 Die Anwendung und das Containerimage erstellen;347
5.8.3.2;10.3.2 Die Anwendung mithilfe eines Statussatzes bereitstellen;348
5.8.3.3;10.3.3 Die Pods untersuchen;353
5.8.4;10.4 Peers im Statussatz finden;357
5.8.4.1;10.4.1 Die Peer-Ermittlung über DNS einrichten;359
5.8.4.2;10.4.2 Einen Statussatz aktualisieren;360
5.8.4.3;10.4.3 Den Clusterdatenspeicher ausprobieren;361
5.8.5;10.5 Umgang mit Knotenausfällen;362
5.8.5.1;10.5.1 Die Trennung eines Knotens vom Netzwerk simulieren;362
5.8.5.2;10.5.2 Den Pod manuell löschen;364
5.8.6;10.6 Zusammenfassung;366
6;Teil III: Fortgeschrittene Themen;367
6.1;11 Interne Mechanismen von Kubernetes;369
6.1.1;11.1 Die Architektur;369
6.1.1.1;11.1.1 Die verteilte Natur der Kubernetes-Komponenten;370
6.1.1.2;11.1.2 Verwendung von etcd;373
6.1.1.3;11.1.3 Aufgaben des API-Servers;376
6.1.1.4;11.1.4 Benachrichtigungen des API-Servers über Ressourcenänderungen;378
6.1.1.5;11.1.5 Der Scheduler;380
6.1.1.6;11.1.6 Die Controller im Controller-Manager;382
6.1.1.7;11.1.7 Die Rolle des Kubelets;387
6.1.1.8;11.1.8 Die Rolle des Kubernetes-Dienstproxys;388
6.1.1.9;11.1.9 Kubernetes-Add-ons;389
6.1.1.10;11.1.10 Zusammenfassung;391
6.1.2;11.2 Kooperation der Controller;391
6.1.2.1;11.2.1 Die betroffenen Komponenten;391
6.1.2.2;11.2.2 Die Abfolge der Ereignisse;392
6.1.2.3;11.2.3 Clusterereignisse beobachten;394
6.1.3;11.3 Laufende Pods;395
6.1.4;11.4 Das Podnetzwerk;396
6.1.4.1;11.4.1 Anforderungen an das Netzwerk;396
6.1.4.2;11.4.2 Funktionsweise des Netzwerks;398
6.1.4.3;11.4.3 CNI;400
6.1.5;11.5 Implementierung von Diensten;400
6.1.5.1;11.5.1 Der Kube-Proxy;400
6.1.5.2;11.5.2 Iptables-Regeln;401
6.1.6;11.6 Cluster mit hoher Verfügbarkeit;403
6.1.6.1;11.6.1 Anwendungen hochverfügbar machen;403
6.1.6.2;11.6.2 Die Komponenten der Kubernetes-Steuerebene hochverfügbar machen;404
6.1.7;11.7 Zusammenfassung;407
6.2;12 Sicherheit des Kubernetes-API-Servers;409
6.2.1;12.1 Authentifizierung;409
6.2.1.1;12.1.1 Benutzer und Gruppen;410
6.2.1.2;12.1.2 Dienstkonten;411
6.2.1.3;12.1.3 Dienstkonten erstellen;412
6.2.1.4;12.1.4 Ein Dienstkonto mit einem Pod verknüpfen;414
6.2.2;12.2 Rollengestützte Zugriffssteuerung;416
6.2.2.1;12.2.1 Das RBAC-Autorisierungs-Plug-in;416
6.2.2.2;12.2.2 RBAC-Ressourcen;418
6.2.2.3;12.2.3 Rollen und Rollenbindungen;421
6.2.2.4;12.2.4 Clusterrollen und Clusterrollenbindungen;425
6.2.2.5;12.2.5 Standardclusterrollen und -clusterrollenbindungen;434
6.2.2.6;12.2.6 Berechtigungen bedachtsam gewähren;436
6.2.3;12.3 Zusammenfassung;437
6.3;13 Sicherheit der Clusterknoten und des Netzwerks;439
6.3.1;13.1 Die Namespaces des Hostknotens in einem Pod verwenden;439
6.3.1.1;13.1.1 Den Netzwerknamespace des Knotens in einem Pod verwenden;440
6.3.1.2;13.1.2 Bindung an einen Hostport ohne Verwendung des Host-Netzwerknamespace;441
6.3.1.3;13.1.3 Den PID- und den IPC-Namespace des Knotens verwenden;443
6.3.2;13.2 Den Sicherheitskontext eines Containers einrichten;444
6.3.2.1;13.2.1 Einen Container unter einer bestimmten Benutzer-ID ausführen;445
6.3.2.2;13.2.2 Die Ausführung eines Containers als root verhindern;446
6.3.2.3;13.2.3 Pods im privilegierten Modus ausführen;447
6.3.2.4;13.2.4 Einem Container einzelne Kernelfähigkeiten hinzufügen;448
6.3.2.5;13.2.5 Fähigkeiten von einem Container entfernen;450
6.3.2.6;13.2.6 Prozesse am Schreiben im Dateisystem des Containers hindern;451
6.3.2.7;13.2.7 Gemeinsame Nutzung von Volumes durch Container mit verschiedenen Benutzer-IDs;452
6.3.3;13.3 Die Bearbeitung der Sicherheitsmerkmale in einem Pod einschränken;454
6.3.3.1;13.3.1 Podsicherheitsrichtlinien;454
6.3.3.2;13.3.2 Die Richtlinien runAsUser, fsGroup und supplementalGroups;457
6.3.3.3;13.3.3 Zulässige, unzulässige und Standardfähigkeiten festlegen;459
6.3.3.4;13.3.4 Die verwendbaren Arten von Volumes einschränken;460
6.3.3.5;13.3.5 Benutzern und Gruppen unterschiedliche Podsicherheitsrichtlinien zuweisen;461
6.3.4;13.4 Das Podnetzwerk isolieren;464
6.3.4.1;13.4.1 Die Netzwerkisolierung in einem Namespace aktivieren;465
6.3.4.2;13.4.2 Einzelnen Pods im Namespace die Verbindung zu einem Serverpod erlauben;465
6.3.4.3;13.4.3 Das Netzwerk zwischen Kubernetes-Namespaces isolieren;466
6.3.4.4;13.4.4 Verwendung der CIDR-Schreibweise zur Isolierung;468
6.3.4.5;13.4.5 Den ausgehenden Datenverkehr von Pods einschränken;468
6.3.5;13.5 Zusammenfassung;469
6.4;14 Die Computerressourcen eines Pods verwalten;471
6.4.1;14.1 Ressourcen für die Container eines Pods anfordern;471
6.4.1.1;14.1.1 Pods mit Ressourcenanforderungen erstellen;472
6.4.1.2;14.1.2 Einfluss der Ressourcenanforderungen auf die Zuteilung zu Knoten;473
6.4.1.3;14.1.3 Der Einfluss der CPU-Anforderungen auf die CPU-Zeitzuteilung;478
6.4.1.4;14.1.4 Benutzerdefinierte Ressourcen definieren und anfordern;478
6.4.2;14.2 Die verfügbaren Ressourcen für einen Container einschränken;479
6.4.2.1;14.2.1 Harte Grenzwerte für die von einem Container verwendeten Ressourcen festlegen;479
6.4.2.2;14.2.2 Überschreiten der Grenzwerte;481
6.4.2.3;14.2.3 Grenzwerte aus der Sicht der Anwendungen in den Containern;482
6.4.3;14.3 QoS-Klassen für Pods;484
6.4.3.1;14.3.1 Die QoS-Klasse eines Pods festlegen;484
6.4.3.2;14.3.2 Auswahl des zu beendenden Prozesses bei zu wenig Speicher;487
6.4.4;14.4 Standardanforderungen und -grenzwerte für die Pods in einem Namespace festlegen;488
6.4.4.1;14.4.1 Der Grenzwertbereich;489
6.4.4.2;14.4.2 Einen Grenzwertbereich erstellen;490
6.4.4.3;14.4.3 Die Grenzwerte durchsetzen;491
6.4.4.4;14.4.4 Standardanforderungen und -grenzwerte anwenden;492
6.4.5;14.5 Die in einem Namespace insgesamt verfügbaren Ressourcen beschränken;493
6.4.5.1;14.5.1 Ressourcenkontingente;493
6.4.5.2;14.5.2 Kontingente für persistenten Speicher festlegen;495
6.4.5.3;14.5.3 Die Höchstzahl der Objekte in einem Namespace beschränken;496
6.4.5.4;14.5.4 Kontingente für einzelne Podstatus und QoS-Klassen festlegen;497
6.4.6;14.6 Die Ressourcennutzung der Pods überwachen;498
6.4.6.1;14.6.1 Die tatsächliche Ressourcennutzung erfassen;498
6.4.6.2;14.6.2 Verlaufsdaten des Ressourcenverbrauchs speichern und analysieren;500
6.4.7;14.7 Zusammenfassung;504
6.5;15 Automatische Skalierung von Pods und Clusterknoten;505
6.5.1;15.1 Automatische horizontale Podskalierung;506
6.5.1.1;15.1.1 Der Vorgang der automatischen Skalierung;506
6.5.1.2;15.1.2 Skalierung auf der Grundlage der CPU-Nutzung;509
6.5.1.3;15.1.3 Skalierung auf der Grundlage der Speichernutzung;516
6.5.1.4;15.1.4 Skalierung auf der Grundlage anderer Messgrößen;516
6.5.1.5;15.1.5 Geeignete Messgrößen für die automatische Skalierung auswählen;518
6.5.1.6;15.1.6 Herunterskalieren auf null Replikate;519
6.5.2;15.2 Automatische vertikale Podskalierung;519
6.5.2.1;15.2.1 Ressourcenanforderungen automatisch einrichten;519
6.5.2.2;15.2.2 Ressourcenanforderungen von laufenden Pods ändern;520
6.5.3;15.3 Horizontale Skalierung von Clusterknoten;520
6.5.3.1;15.3.1 Der Cluster-Autoskalierer;520
6.5.3.2;15.3.2 Den Cluster-Autoskalierer aktivieren;522
6.5.3.3;15.3.3 Die Unterbrechung von Diensten beim Herunterskalieren des Clusters minimieren;523
6.5.4;15.4 Zusammenfassung;525
6.6;16 Erweiterte Planung;527
6.6.1;16.1 Pods mithilfe von Mängeln und Tolerierungen von bestimmten Knoten fernhalten;527
6.6.1.1;16.1.1 Mängel und Tolerierungen;528
6.6.1.2;16.1.2 Einem Knoten benutzerdefinierte Mängel hinzufügen;530
6.6.1.3;16.1.3 Tolerierungen zu Pods hinzufügen;530
6.6.1.4;16.1.4 Verwendungszwecke für Mängel und Tolerierungen;531
6.6.2;16.2 Knotenaffinität;532
6.6.2.1;16.2.1 Feste Knotenaffinitätsregeln aufstellen;533
6.6.2.2;16.2.2 Knotenprioritäten bei der Zuteilung eines Pods;535
6.6.3;16.3 Pods mit Affinitäts- und Antiaffinitätsregeln auf denselben Knoten unterbringen;538
6.6.3.1;16.3.1 Podaffinitätsregeln zur Bereitstellung von Pods auf demselben Knoten;539
6.6.3.2;16.3.2 Pods im selben Schaltschrank, in derselben Verfügbarkeitszone oder derselben geografischen Region bereitstellen;541
6.6.3.3;16.3.3 Präferenzen statt fester Regeln für die Podaffinität angeben;543
6.6.3.4;16.3.4 Pods mit Antiaffinitätsregeln voneinander getrennt halten;544
6.6.4;16.4 Zusammenfassung;546
6.7;17 Best Practices für die Anwendungsentwicklung;549
6.7.1;17.1 Das Gesamtbild;549
6.7.2;17.2 Der Lebenszyklus eines Pods;551
6.7.2.1;17.2.1 Beendigung und Verlegung von Anwendungen;551
6.7.2.2;17.2.2 Tote oder teilweise tote Pods neu bereitstellen;554
6.7.2.3;17.2.3 Pods in einer bestimmten Reihenfolge starten;555
6.7.2.4;17.2.4 Lebenszyklushooks;557
6.7.2.5;17.2.5 Pods herunterfahren;561
6.7.3;17.3 Die ordnungsgemäße Verarbeitung aller Clientanforderungen sicherstellen;565
6.7.3.1;17.3.1 Unterbrechungen von Clientverbindungen beim Hochfahren eines Pods verhindern;565
6.7.3.2;17.3.2 Unterbrechungen von Clientverbindungen beim Herunterfahren eines Pods verhindern;565
6.7.4;17.4 Einfache Ausführung und Handhabung von Anwendungen in Kubernetes;570
6.7.4.1;17.4.1 Einfach zu handhabende Containerimages erstellen;570
6.7.4.2;17.4.2 Images sauber kennzeichnen;571
6.7.4.3;17.4.3 Mehrdimensionale statt eindimensionaler Labels;571
6.7.4.4;17.4.4 Ressourcen mit Anmerkungen beschreiben;572
6.7.4.5;17.4.5 Gründe für die Beendigung eines Prozesses angeben;572
6.7.4.6;17.4.6 Anwendungsprotokolle;574
6.7.5;17.5 Empfohlene Vorgehensweisen für Entwicklung und Tests;576
6.7.5.1;17.5.1 Anwendungen während der Entwicklung außerhalb von Kubernetes ausführen;576
6.7.5.2;17.5.2 Minikube für die Entwicklung;577
6.7.5.3;17.5.3 Versionssteuerung und Manifeste zur automatischen Bereitstellung von Ressourcen;579
6.7.5.4;17.5.4 Ksonnet als Alternative zu YAML- und JSON-Manifesten;579
6.7.5.5;17.5.5 Continuous Integration und Continuous Delivery (CI/CD);580
6.7.6;17.6 Zusammenfassung;581
6.8;18 Kubernetes erweitern;583
6.8.1;18.1 Eigene API-Objekte definieren;583
6.8.1.1;18.1.1 Eigene Ressourcendefinitionen;584
6.8.1.2;18.1.2 Benutzerdefinierte Ressourcen mit benutzerdefinierten Controllern automatisieren;588
6.8.1.3;18.1.3 Benutzerdefinierte Objekte validieren;592
6.8.1.4;18.1.4 Einen benutzerdefinierten API-Server für benutzerdefinierte Objekte bereitstellen;592
6.8.2;18.2 Kubernetes mit dem Kubernetes-Dienstkatalog erweitern;594
6.8.2.1;18.2.1 Der Dienstkatalog;595
6.8.2.2;18.2.2 Der API-Server des Dienstkatalogs und der Controller-Manager;596
6.8.2.3;18.2.3 Dienstbroker und die API OpenServiceBroker;597
6.8.2.4;18.2.4 Dienste bereitstellen und nutzen;598
6.8.2.5;18.2.5 Aufheben der Bindung und der Bereitstellung;601
6.8.2.6;18.2.6 Vorteile des Dienstkatalogs;601
6.8.3;18.3 Plattformen auf der Grundlage von Kubernetes;602
6.8.3.1;18.3.1 Die Containerplattform Red Hat OpenShift;602
6.8.3.2;18.3.2 Deis Workflow und Helm;605
6.8.4;18.4 Zusammenfassung;608
7;Anhang A: Verwendung von kubectl für mehrere Cluster;609
7.1;A.1 Umschalten zwischen Minikube und Google Kubernetes Engine;609
7.1.1;A.1.1 Umschalten zu Minikube;609
7.1.2;A.1.2 Umschalten zu GKE;609
7.2;A.2 Verwendung von kubectl für mehrere Cluster oder Namespaces;610
7.2.1;A.2.1 Den Speicherort der Konfigurationsdatei festlegen;610
7.2.2;A.2.2 Der Inhalt der Konfigurationsdatei;610
7.2.3;A.2.3 Konfigurationseinträge auflisten, hinzufügen und ändern;611
7.2.4;A.2.4 Verwendung von kubectl mit verschiedenen Clustern, Benutzern und Kontexten;613
7.2.5;A.2.5 Umschalten zwischen Kontexten;613
7.2.6;A.2.6 Kontexte und Cluster auflisten;614
7.2.7;A.2.7 Kontexte und Cluster löschen;614
8;Anhang B: Einen Cluster mit mehreren Knoten mit kubeadm erstellen;615
8.1;B.1 Das Betriebssystem und die erforderlichen Pakete einrichten;615
8.1.1;B.1.1 Die virtuelle Maschine erstellen;615
8.1.2;B.1.2 Den Netzwerkadapter für die VM einrichten;616
8.1.3;B.1.3 Das Betriebssystem installieren;617
8.1.4;B.1.4 Docker und Kubernetes installieren;620
8.1.5;B.1.5 Die VM klonen;621
8.2;B.2 Den Master mit kubeadm konfigurieren;623
8.2.1;B.2.1 Ausführung der Komponenten durch kubeadm;624
8.3;B.3 Arbeitsknoten mit kubeadm einrichten;625
8.3.1;B.3.1 Das Containernetzwerk einrichten;626
8.4;B.4 Vom lokalen Computer auf den Cluster zugreifen;627
9;Anhang C: Andere Containerlaufzeitumgebungen verwenden;629
9.1;C.1 Docker durch rkt ersetzen;629
9.1.1;C.1.1 Kubernetes zur Verwendung von rkt einrichten;629
9.1.2;C.1.2 rkt in Minikube ausprobieren;630
9.2;C.2 Andere Containerlaufzeiten über die CRI verwenden;632
9.2.1;C.2.1 CRI-O;632
9.2.2;C.2.2 Anwendungen in VMs statt in Containern ausführen;632
10;Anhang D: Clusterverbund;633
10.1;D.1 Der Kubernetes-Clusterverbund;633
10.2;D.2 Die Architektur;634
10.3;D.3 Verbund-API-Objekte;635
10.3.1;D.3.1 Verbundversionen der Kubernetes-Ressourcen;635
10.3.2;D.3.2 Funktionsweise von Verbundressourcen;636
11;Anhang E: Kubernetes-Ressourcen in diesem Buch;639
12;Index;643


Lukša, Marko
Marko Lukša ist Software Engineer bei Red Hat im Cloud Enablement Team. Das Team sorgt dafür, dass Red Hat's Enterprise Middleware-Produkte auf OpenShift funktionieren – eine PaaS-Plattform, die auf Kubernetes läuft. Durch seine 15-jährige Erfahrung als Trainer gelingt es ihm besonders gut schwierige Inhalte einfach und verständlich zu vermitteln.

Marko Lukša ist Software Engineer bei Red Hat im Cloud Enablement Team. Das Team sorgt dafür, dass Red Hat's Enterprise Middleware-Produkte auf OpenShift funktionieren – eine PaaS-Plattform, die auf Kubernetes läuft. Durch seine 15-jährige Erfahrung als Trainer gelingt es ihm besonders gut schwierige Inhalte einfach und verständlich zu vermitteln.



Ihre Fragen, Wünsche oder Anmerkungen
Vorname*
Nachname*
Ihre E-Mail-Adresse*
Kundennr.
Ihre Nachricht*
Lediglich mit * gekennzeichnete Felder sind Pflichtfelder.
Wenn Sie die im Kontaktformular eingegebenen Daten durch Klick auf den nachfolgenden Button übersenden, erklären Sie sich damit einverstanden, dass wir Ihr Angaben für die Beantwortung Ihrer Anfrage verwenden. Selbstverständlich werden Ihre Daten vertraulich behandelt und nicht an Dritte weitergegeben. Sie können der Verwendung Ihrer Daten jederzeit widersprechen. Das Datenhandling bei Sack Fachmedien erklären wir Ihnen in unserer Datenschutzerklärung.