Lukša / Luksa Kubernetes in Action
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
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.
Autoren/Hrsg.
Fachgebiete
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




