Inhaltsverzeichnis

Alle Kapitel aufklappen
Alle Kapitel zuklappen
TEIL I Brave New World?
41
1 Container – die Lösung für alles ... oder etwa doch nicht?
43
1.1 Vorwort zur 3. Auflage
44
1.2 Vorbemerkungen
52
1.2.1 Verwendete Formatierungen
52
1.2.2 Weiterführende Hinweise
53
1.2.3 Editor/Tool Wars: vi(m), Visual Studio Code und K9s
53
1.3 Was dieses Buch sein bzw. nicht sein soll
56
1.4 Wie dieses Buch zu lesen ist
56
1.4.1 Grundsätzliches
56
1.4.2 Kapitel, Teile und Zielgruppen im groben Überblick
57
1.5 Welche Teile des Buchs sind neu, welche wurden stark überabeitet?
57
1.6 Verwendete Plattformen und Versionsspezifikationen
59
2 Warum Container?
61
2.1 Wer braucht’s?
61
2.2 Überblick: IaaS, CI/CD, GitOps – und maximale Automation
62
2.2.1 Maximale Automation – in allen Bereichen
62
2.2.2 Benefit durch DevOps? Na ja ...
63
2.2.3 Pipeline-Automation
64
TEIL II Container-Konzepte, -Engines und -Tools
65
3 Container- und Infrastruktur-Konzepte
67
3.1 World of Tiers – Teil 1
67
3.1.1 Konzeptioneller Aufbau und Planungsstrategien
68
3.1.2 VM-Infrastruktur und Templating
68
3.1.3 Container-Node-Plattformen
68
3.1.4 Container-Engines
68
3.1.5 Orchestrierer
69
3.1.6 OCI – Standardisierung, Container, Images
69
4 Container-Engines und -Tools
71
4.1 Die Container-Engines CRI-O, Singularity und containerd
71
4.2 Docker als Container-Engine
72
4.2.1 Docker-LTS-Problematiken
72
4.2.2 Docker-Installation – Paketnamen und Dependencies
73
4.2.3 Docker (EE) >=18.03: Auszüge einiger Neuerungen
74
4.2.4 Distributionsunabhängige Installation von Docker
75
4.2.5 Docker und Proxies
75
4.2.6 Docker-Binaries und Konfiguration
76
4.2.7 Docker-Image-Management – Basics
77
4.2.8 Image-Management
79
4.2.9 Betrieb und Management von Docker-Containern
86
4.2.10 Container starten – docker [container] run
88
4.2.11 Befehle im laufenden Container ausführen: docker [container] exec
92
4.2.12 docker [container] create
92
4.2.13 Container-Instanzen exportieren und als Images importieren
93
4.2.14 Prozessverwaltung im Container
94
4.2.15 Einfache Applikationen im Container
95
4.2.16 Taggen von Images
96
4.2.17 Layer-Analyse und Flattening (Zusammenfassung)
98
4.2.18 Container-Images erstellen (docker build) und verwalten
99
4.2.19 Best-Practice zur File-Hierarchie
100
4.2.20 docker [image] build
101
4.2.21 Dockerfile-Direktiven/Instruktionen
102
4.2.22 Build-Exkurs: Single-Layer-»Squash«-Images
110
4.2.23 Multi-Stage Builds ab Docker 17.06
111
4.2.24 Image-Build und Container-Test-run ohne Docker?
112
4.2.25 Docker-Networking
112
4.2.26 Basics: Netzwerkverbindung zum Container
113
4.2.27 Docker und iptables
114
4.3 Storage-Driver und Local Volumes
115
4.3.1 Storage-Driver (local)
116
4.3.2 Storage-Driver- und Filesystem-Kombinationen
116
4.3.3 Die Beziehung zwischen Images bzw. Container-Instanzen und dem Storage-Driver
117
4.3.4 Aufgaben des Storage-Drivers
117
4.3.5 Image-Layering und Sharing gemeinsamer Layer
117
4.3.6 Read/Write-Container, Readonly-Image, Storage-Driver und Datenspeicherung
118
4.3.7 Exkurs: Copy on Write
120
4.3.8 Data-Sharing mit Docker-Volumes
121
4.3.9 Docker-Data-Volumes
122
4.3.10 Host-mounted Data-Volumes
122
4.3.11 Data-Volume-Mounts vom Host für OpenLDAP-Container
125
4.4 SSSD – konsistente ID-Mappings für persistente Datenspeicherung in Container-Clustern
128
4.4.1 ID-Divergenzen
129
4.4.2 Was ist mit Service Accounts?
129
4.4.3 LDAP/AD und SSSD
130
4.4.4 Ausgangsbasis: Der Verzeichnisdienst
131
4.4.5 Das Active Directory als zentrale SSSD-IDM-Quelle
131
4.4.6 Pre-Flight Requirements
133
4.4.7 Vereinfachtes Test-Setup
134
4.4.8 Keine Wildcard-IDs, sondern feste Ranges und RIDs
139
4.4.9 Einschränkung des Search-Scopes und das Setzen von Filtern
139
4.4.10 Standalone-Test-Run mit AD-User
139
4.4.11 User- und Gruppen-IDs aus dem AD unter Kubernetes
140
4.5 »Docker-less«: Buildah, Podman und Co. – Container und Images ohne Docker erstellen und verwalten
141
4.5.1 Kompetenzbereiche und Überschneidungen
142
4.6 Image-Build mit Buildah
142
4.6.1 Vorbetrachtungen
142
4.6.2 Buildah: Funktionsweise und Installation
143
4.6.3 Tests und Buildah-Beispiele
144
4.6.4 Involvierte Konfigurationsdateien
144
4.6.5 Image-Import und Login
146
4.6.6 Buildah: CLI-Handling und Image-Verwaltung
147
4.6.7 Image-Konfiguration mit Buildah modifizieren
152
4.6.8 Push nach docker.io
154
4.7 Image-Build mit Kaniko
155
4.7.1 Image-Build
155
4.7.2 Funktionsbeschreibung
156
4.8 Podman
157
4.8.1 Vorbetrachtungen
157
4.8.2 Lib-Sharing
159
4.8.3 Installation
159
4.8.4 Achtung: CentOS 8.x – cgroup-, CNI- und andere Fehler mit Podman/CRI-O
161
4.8.5 Podman: Praktische Beispiele
162
4.8.6 Create und run (simple Container)
163
4.8.7 Podman: Host-PIDs auslesen
163
4.8.8 Create und Run eines Pods
164
4.8.9 Detaillierte Pod-Infos abfragen (Pod und Container)
166
4.8.10 Zweiten Applikations-Container im Pod starten
167
4.8.11 Podman und Kubernetes-kompatible YAML-Generierung
168
4.8.12 Container im Pod löschen, Pod sofort löschen
169
4.8.13 Build mit Podman, Includes
169
4.9 Podman vs. crictl
169
4.9.1 crictl und Podman im Vergleich
170
4.9.2 Funktionsunterschiede und Gemeinsamkeiten
171
5 Container Security (1) – Konzepte und Tasks
173
5.1 Trusted Images
174
5.1.1 Ein eigenes generisches Trusted Basis-Image erzeugen
174
5.1.2 Gescriptete Image-Erzeugung (YUM-Based)
175
5.1.3 Mikro-Image »from scratch« mit Buildah
175
5.2 Trusted Registries und Images
176
5.2.1 Red-Hat-Registry
176
5.2.2 Red Hats Universal Base Image (UBI)
178
5.2.3 Container mit systemd-init und defunct/Zombie-Prozesse
180
5.2.4 Images: Grundlegende Security-relevante Betrachtungen
180
5.2.5 Container und SELinux
181
5.3 Container-Capabilities und Privilegien
182
5.3.1 »Manuelles« Auslesen der Capabilities
183
5.4 Skopeo – der sichere Transportdienstleister
186
5.4.1 Funktionaler Überblick
186
5.4.2 Setup
187
5.4.3 Remote Inspect
188
5.4.4 Skopeo-Transports
190
5.4.5 Image Signing
190
5.4.6 Digests, Manifeste und Signaturen: Mögliche Fehlerquellen minimieren
192
5.4.7 Hands-On: Images beim Kopieren mit Skopeo digital signieren
192
5.4.8 Signed Skopeo Push (Docker-Daemon) in lokalen Nexus/NRM
195
5.4.9 Signed Skopeo Push in lokalen Nexus/NRM aus Containers-storage (Podman/Buildah)
195
5.4.10 Signed Skopeo Copy in Google Cloud Registry (gcr.io)
196
5.4.11 Skopeo (remote) delete
199
5.4.12 Verify
199
5.4.13 Umzugshelfer: Skopeo Sync für den Umzug von einer Registry in eine andere
199
5.5 »Manuelle« Security und CVE-Scans?
200
5.5.1 Image- und Container-Scans
200
5.5.2 Insel-Gefrickel kann und darf keine Lösung sein
201
5.6 TLS/SSL
202
5.6.1 Und auch hier wieder: Scope und Automation
202
6 Die private Trusted Registry
203
6.1 Die Registry im Detail
203
6.1.1 Multi-Purpose-Registry: Auswahlkriterien
204
6.1.2 Docker-Registry – Why not
205
6.1.3 Registry-Architektur
205
6.2 Registries: Vorbereitungen und Betrieb
206
6.2.1 Vorbereitungen: Die Regeln zum Image-Tagging für Registry-Uploads verstehen
206
6.2.2 Upload/Push eines Images in die Registry
207
6.2.3 Löschen von Images in einer privaten, einfachen Docker-Registry
208
6.2.4 Docker-Filesystem-Layer, Manifeste und die Garbage-Collection
208
6.3 Registry-Beispiel: Sonatype Nexus
210
6.3.1 Features und Funktionen
210
6.3.2 Installationsvorbetrachtungen
211
6.3.3 Nexus bzw. Nexus Repository Manager (NRM) 3 als Bare-Metal- bzw. VM-Installation
211
6.3.4 Überblick über die Datenstrukturen des NRM 3
213
6.3.5 Login und Administration des NRM
214
6.3.6 Image-Repo einrichten
214
6.3.7 Nexus Repository Manager: SSL mit integriertem »Jetty«-HTTP-Server
215
6.3.8 Externe Authentifizierungsquellen
220
6.3.9 RBAC
220
6.3.10 Rollen und Privilegien über LDAP bzw. AD
221
6.3.11 HA für NRM
221
6.3.12 Preise für NRM Pro
222
6.4 Quay und weitere Registry-Alternativen
222
7 Slim Container-OS und Infrastruktur-Automation mit IaaS/IaC
225
7.1 Slim Container-OS
225
7.1.1 Überblick
226
7.1.2 Kandidaten?
227
7.2 IaaS, IaC und Infrastruktur-Automation
228
7.2.1 Vorbetrachtungen
228
7.2.2 Cluster auf Knopfdruck
228
7.2.3 Konzepte: IaaS und IaC
229
7.3 IaaS/IaC-Tools am Beispiel von Terraform
230
7.3.1 Terraform (HashiCorp)
230
7.3.2 Konfigurationsimplementierung
230
7.3.3 Terraform-Konzepte
232
7.3.4 Vor- und Nachteile von Terraform
233
7.4 Hands On: Terraform-basierter VM-Rollout auf vSphere
233
7.4.1 Terraform-CLI
233
7.4.2 Terraform-Initialisierung, Plugin und Konfigurationen
234
7.4.3 vSphere-Preflights
236
7.4.4 VM-Template-Preflights
236
7.4.5 Rollout per terraform apply
237
7.4.6 Weitere abzuarbeitende Punkte für das Multi-VM- bzw. Cluster-Rollout
238
7.4.7 OpenShift 4.5 und die Installer Provisioned Infrastructure (IPI) für vSphere
240
TEIL III Skalierbare Container-Cluster und Container-Orchestrierung
243
8 Container-Cluster – von Planern und Orchestern
245
8.1 The Big Picture
245
8.2 World of Tiers – Teil 2
246
8.3 Vorbereitungen (On-Premises-Cluster)
247
8.4 Pre-Flight Requirements: Zeitsynchronisation
248
8.4.1 NTP und die Relativität
248
8.4.2 Chrony
248
8.4.3 NTP-Basics
249
8.4.4 NTP-Setup
249
8.5 Pre-Flight Requirements: pssh
253
8.5.1 Grundsätzliches
253
8.5.2 Setup von pssh auf allen Nodes
254
8.5.3 pssh – korrespondierende Dateien/Einstellungen
255
8.5.4 pssh unter RHCOS/OpenShift
255
9 Schlüsselmeister im Container-Cluster: Key/Value-Stores und Service-Registry/Discovery
257
9.1 Key/Value-Stores
258
9.1.1 Key/Value-Stores – Arbeitsweise
258
9.1.2 Backup- und Verfügbarkeitsstrategien
258
9.2 Key/Value-Stores im Detail
259
9.2.1 Grundsätzliches
259
9.2.2 Konsensfindung – Raft vs. Paxos
260
9.2.3 Raft-Demos
261
9.2.4 etcd im Detail
262
9.3 etcd als Key/Value-Store für Kubernetes/OpenShift
264
9.3.1 Arbeitsweise/Funktionsprinzip von etcd im Zusammenspiel mit Kubernetes
265
9.3.2 Kubernetes und Redundanzen
265
10 Kubernetes (K8s)
269
10.1 Kubernetes im Überblick
269
10.1.1 Vom Borg zum Steuermann
269
10.1.2 VMware, Project Pacific und das böse Kubernetes
270
10.1.3 Aufgaben
270
10.1.4 Kubernetes und CRI-O
270
10.1.5 Releases, Changes und kein Ende
271
10.1.6 Historisches: Kubernetes 1.14 and beyond – velocity increasing und Märchenstunden
272
10.1.7 Der lange Weg zu LTS, wenn er denn gefunden wird ...
273
10.1.8 Skalierbarkeit
273
10.2 Kubernetes-Komponenten
273
10.2.1 Der Master- bzw. Control-Plane-Node
274
10.2.2 Worker
275
10.3 Dienste auf den Kubernetes-Master-Nodes
275
10.3.1 API-Server
275
10.3.2 Controller Manager
276
10.3.3 Der Node Controller (kube-controller-manager) und die Verfügbarkeit der Worker-Nodes
278
10.3.4 Scheduler
280
10.3.5 Scheduler-Algorithmen: Predicates und Priorities
281
10.3.6 Scheduling Policies
281
10.3.7 Cloud Controller Manager
283
10.3.8 etcd
283
10.4 Dienste auf den Kubernetes-Workern aus technischer Sicht
284
10.4.1 Container-Engine
284
10.4.2 Kubelet
284
10.4.3 Achtung: Kubelet und (no) Swap
286
10.4.4 Weitere Kubelet-Konfigurationsdateien
287
10.4.5 kube-proxy und Alternativen
287
10.5 Networking in Kubernetes
288
10.5.1 Vorbetrachtungen
288
10.5.2 Arbeitsweise
289
10.5.3 Kubernetes und IPv6 bzw. IPv4/IPv6-Dual-Stacks
289
10.5.4 kubenet- bzw. CNI-Plugins
290
10.5.5 Netzwerkkommunikation im K8s-Cluster
290
10.5.6 Überblick über einige Kubernetes-Netzwerk-Plugins
291
10.5.7 Performance der Plugins
294
10.6 Kubernetes-Setup-Varianten
294
11 Die Kubernetes-Control-Plane als Microservice-Architektur
297
11.1 Vorbetrachtungen zum Setup einer Pod-basierten Kubernetes-Control-Plane
298
11.2 CRI-O als Container-Engine für Multimaster-Kubernetes-Cluster
299
11.2.1 CRI-O: Das Big Picture und der prozedurale Ablauf
299
11.2.2 CRI-O-Versionen
301
11.2.3 Setup-Voraussetzungen
301
11.2.4 crictl
302
11.2.5 /etc/crio/crio.conf
303
11.2.6 CRI-O und Capabilities
304
11.2.7 Netzwerk
304
11.2.8 CRI-O-Pre-Flight-Tasks – zusammengefasst
305
11.2.9 Achtung: CRI-O, Weave und CoreDNS
307
11.3 Kubernetes-Multimaster-Setup
308
11.3.1 Setup-Voraussetzungen und Vorbetrachtungen
308
11.3.2 Keepalived/Floating-IP
308
11.3.3 dnsmasq
310
11.3.4 kubectl-Bash-Completion einrichten
311
11.3.5 Kubelet ? 1.11 und statische (Pod-)Manifeste
311
11.3.6 Allgemeine Pre-Flight Checks und Tasks
312
11.3.7 Kubernetes-Repositories und -Installation
312
11.3.8 Erforderliche Pakete, alternative Kubernetes-Paketversionen
313
11.3.9 Von der Installation der Pakete erzeugte Files
313
11.3.10 Swap off!
314
11.3.11 Dynamische Kubelet-Konfiguration ab K8s ? 1.10
314
11.3.12 Verfügbare kubeadm-init-Direktiven
316
11.3.13 Kubernetes-Cluster und kubeadm hinter einem Proxy
317
11.3.14 Multimaster-kube-config.yaml und Pod-Debug-Schalter
318
11.3.15 Rollout des ersten Masters
319
11.3.16 Join weiterer Master-Nodes
320
11.3.17 Post-Initialisierungs-Tasks (kubectl)
320
11.3.18 kubectl auf weiteren (bereits gejointen) Nodes gangbar machen
321
11.3.19 Low-Level-Pod/Container-Management mit crictl
321
11.3.20 (Join-)Token-Fragen
323
11.3.21 Add-ons: kube-dns, CoreDNS und kube-proxy
324
11.3.22 Beim Rollout erzeugte Daten
324
11.3.23 Beim Rollout erzeugte bzw. verwendete Konfigurationsdaten auslesen
325
11.3.24 Einzelschritte des kubeadm init
325
11.3.25 Schrittweise Cluster-Generierung per kubeadm init phase
326
11.4 Pod-basiertes Overlay-Netz
326
11.4.1 Weave als Pod-basiertes CNI-Plugin
327
11.5 Arbeiten mit Pod-basiertem etcd
330
11.5.1 Vorbetrachtungen
330
11.5.2 Queries
331
11.6 Erweiterte Hochverfügbarkeitsbetrachtungen (Pacemaker)
333
11.6.1 Ausfallsicherheit der K8s-Komponenten in der Pod-basierten Control-Plane
333
11.6.2 Pacemaker
334
11.6.3 Control-Plane-Pod-Monitoring
335
11.6.4 Nur schauen, nicht anfassen
336
11.6.5 Ein OCF-Agent für kube-apiserver
337
11.6.6 Erweiterungen
339
11.6.7 Failover
340
11.6.8 GUIs und Stonith – ein kurzer Überblick
340
12 Kubernetes-Cluster mit Singularity als Container-Engine
343
12.1 Singularity als HPC-Container-Runtime für Kubernetes
343
12.1.1 Singularity-Container-Runtime und HPC
343
12.1.2 Kubernetes-Integration (konzeptionell)
344
12.1.3 Achtung: Kein Multi-Arch-Support
345
12.1.4 Singularity-CRI als Runtime für Kubernetes (Hands on)
345
12.1.5 Build
346
12.1.6 Systemeinbindung
346
12.1.7 kubeadm init mit Singularity-CRI (Kubernetes 1.17.3)
348
12.1.8 Beispiele mit Singularity und Kubernetes
349
12.1.9 Singularity-Container-Runtime (Standalone)
349
13 Kubernetes-Cluster: Ressourcen verstehen und verwalten
351
13.1 Überblick: Tools zum Deployment von Kubernetes-Ressourcen
351
13.1.1 Die Qual der Wahl? Nicht wirklich
351
13.1.2 kubectl
352
13.1.3 kustomize
352
13.1.4 Helm
352
13.1.5 Operatoren
353
13.2 kubectl
353
13.2.1 kubectl-Bash-Completion und kubectl-Alias
354
13.2.2 Client/Server-Versionen
354
13.2.3 Das kubectl-Kommando
355
13.2.4 kubectl-Konfiguration
355
13.2.5 Die wichtigsten kubectl-Subkommandos in der Übersicht
356
13.2.6 Die kubectl-Manpages
357
13.2.7 Welche Ressourcen bzw. Workloads können im K8s-Cluster via kubectl-CLI verwaltet werden?
358
13.2.8 kubectl api-resources
359
13.2.9 kubectl api-resources mit api-groups und zugehörigen Verbs
360
13.2.10 Das Dickicht der API-Versionierung
360
13.2.11 Arbeitsbeschaffungsmaßnahmen und temporäre Wiederherstellung der Abwärtskompatibilität
361
13.2.12 Die API-Strukturen und der (leider) beständige Wechsel
361
13.2.13 Kubernetes 1.16, apps/v1 und Abwärtskompatibilitäten
363
13.2.14 API-Server-Schubladen/Templates
364
13.2.15 api-versions
364
13.2.16 kubectl explain <Ressource>.<object>.<object>. …
366
13.2.17 Die komplette YAML-Struktur einer Ressource mit kubectl explain anzeigen
367
13.2.18 CRDs und kubectl explain? Ja, da war noch was – oder?
368
13.2.19 K8s-Ressourcen direkt mit kubectl run/create/apply deployen
369
13.2.20 kubectl-Debugging und der Verbose Mode
369
13.2.21 Der Schalter kubectl-run –restart= und seine Auswirkung auf erzeugte Objekte
369
13.2.22 Einfache kubectl-Beispiele im Hinblick auf erzeugte API-Objekte
370
13.2.23 Grundlegende K8s-Cluster-Informationen abfragen
371
13.2.24 kubectl get all ist nicht »ALL«, höchstens »common« (resources)
371
13.2.25 Multiple Ressourcen per Manifest anlegen – und auch wieder per Manifest löschen
372
13.3 Kleine Kubernetes-Cluster und »Taint Nodes«
373
13.3.1 Was sind Taints und Tolerations?
373
13.3.2 Taint-Abfrage unseres Masters
374
13.3.3 Beispiele für das (Un-)Tainten von Nodes
375
13.4 (Worker-)Node-Kapazitäten
375
13.4.1 Analyse
376
13.4.2 Korrespondierende kubelet-Direktiven bzw. Kubelet-Config-File
376
13.4.3 Weitere Node-Informationen abfragen
378
13.4.4 Under Pressure
379
13.5 Ressourcen im Kubernetes-Cluster ausrollen
381
13.5.1 Was passiert beim Ausrollen einer Ressource unter der Haube?
381
13.5.2 Vereinfachter Ablauf
385
13.5.3 ImagePullPolicies
385
13.5.4 Default-Verteilungsstrategien des Schedulers für die Worker-Nodes
387
13.5.5 Unterschiedliche bzw. mehrere Ressourcen in einem YAML-File
388
13.5.6 Manifest-Versionierung
388
13.6 Pods
389
13.6.1 Der Pod – die »Mini-VM«
389
13.6.2 Technische Details
390
13.6.3 Pods und Startup-Orderings der Container?
393
13.6.4 Das »pause«-Image, der Pod und die Namespace-Reservierungen
394
13.7 Pod-Sidecar-Patterns und das Applikations-Design
395
13.7.1 Das Sidecar/Helper-Konzept
395
13.7.2 Klassischer Sidecar-Container
395
13.7.3 Das Ambassador-Pattern
396
13.7.4 Das Adapter-Pattern
397
13.7.5 Das Initializer-Pattern
397
13.7.6 Distributed Sidecar-Container in Pods
398
13.7.7 Das »jetzt schon« gelöste Sidecar-Startup-Problem ab Kubernetes 1.19 ...
399
13.8 Pods per Manifest erstellen und modifizieren
399
13.8.1 Status- und Laufzeitattribute – kubectl get mit YAML-Output
402
13.8.2 Ressourcen nach Namespaces anzeigen lassen
402
13.8.3 kubectl attach
403
13.8.4 Einen laufenden Pod bzw. eine laufende Ressource editieren: kubectl edit
403
13.8.5 kubectl apply
404
13.8.6 kubectl patch
405
13.8.7 kubectl set
405
13.8.8 kubectl replace
406
13.8.9 kubectl create/delete/replace vs. apply/patch
406
13.8.10 Server Side Apply und kubectl apply (managedFields per Default aktiv ab 1.18)
407
13.8.11 Pod mit mehreren Containern/Images
408
13.8.12 Setzen von Kommandos in der Pod-Spezifikation per command und args
409
13.8.13 Logs von Containern eines Pods abfragen
410
13.8.14 Pod-RestartPolicies und Startverzögerung
410
13.8.15 Einfache Pods (ohne Deployments) und Node-Bindings
411
13.8.16 kubectl exec – Remote Kommandos im Pod/Container ausführen
411
13.8.17 Kubelets-Housekeeping: Automatische Bereinigung alter Pods auf den Worker-Nodes
411
13.9 Pod/Container-Phasen und -Zustände, Debugging
412
13.9.1 Pod-Phasen
412
13.9.2 Container-States/Zustände
413
13.9.3 Auszüge einiger Beispiele für mögliche Zustände von Pods
414
13.9.4 Debugging mit kubectl describe
415
13.9.5 Events
417
13.9.6 Debugging mit kubectl (alpha) debug (ab Kubernetes/kubectl 1.18)
417
13.9.7 (Force) Removal eines Pods oder anderer Ressourcen
419
13.10 Pod- und Container-Ressourcen, -Requests und -Limitierungen sowie QoS und Capabilities
420
13.10.1 CPU-Requests und -Limits
421
13.10.2 Memory-Requests und -Limits
422
13.10.3 QoS – Quality-of-Service-Klassen im Bezug auf Limits und Requests
423
13.10.4 QoS-Klassen
424
13.10.5 QoS-Klassen und systemd-Slices
425
13.10.6 Exklusives CPU-Pinning
426
13.10.7 OOM-Scores
428
13.10.8 Capabilities für Container in Pods setzen
429
13.10.9 PodDisruptionBudget
430
13.10.10 Pod-Prioritäten
430
13.10.11 Vereinfacht: Wie verhalten sich QoS-Klassen und Priorities zueinander?
432
13.10.12 Weitere Querbezüge und Wechselwirkungen: QoS-Classes, Prios, Label, OOMscores, PDBs und mehr – viel hilft leider nicht immer viel
433
13.10.13 PodSecurityPolicies
434
13.10.14 Weitere Limitierungen: PID-Limits (seit v1.14, dort noch Alpha)
436
13.11 Attribute von Pods und Containern auslesen, setzen und nutzen
436
13.11.1 Pod- oder Container-Variablen?
436
13.11.2 Print-Out ENVs – Pod/Container-Attribute auslesen und Variablen zuordnen
437
13.11.3 Limits
438
13.11.4 Erzeuge Ordner im Mountpath
440
13.12 Pods und ConfigMaps
441
13.12.1 Wie funktioniert es?
442
13.12.2 ConfigMaps in der Praxis
442
13.12.3 Die erzeugte ConfigMap in einem Pod nutzen
443
13.12.4 Varianten zur Erstellung von ConfigMaps
445
13.12.5 Exkurs: YAML-Multiline-Attribute (in ConfigMaps)
445
13.12.6 Unterschiede: –from-file und –from-env-file
446
13.12.7 Binary Data in ConfigMaps
447
13.12.8 Re-Deploy einer Ressource bei Änderung der ConfigMap
447
13.12.9 Von der Control-Plane verwendete ConfigMaps
451
13.12.10 ConfigMaps mit User-IDs aus dem AD in Pods nutzen
452
13.13 Pods und Init-Container
455
13.13.1 Wie funktioniert es?
455
13.13.2 Anwendungsmöglichkeiten für Init-Container
456
13.13.3 Ein einfaches Beispiel
456
13.13.4 Phasen des Init-Containers
458
13.13.5 Mehrstufiges Init
458
13.14 Health-Checks: Live- und Readiness Probes
460
13.14.1 Die Notwendigkeit der Probes
461
13.14.2 Ready? Live? Welche Probe wofür?
461
13.14.3 Was sind die unterschiedlichen Auswirkungen der Probes?
462
13.14.4 Probe-Verfahren – Wie designe ich sie richtig?
465
13.14.5 Monitoring-Intervalle, Timeouts und Thresholds
465
13.14.6 Failure- und Success-Thresholds
466
13.14.7 Muss ich beide Probe-Verfahren (Ready, Live) zwingend anwenden?
466
13.14.8 Timeouts, Initial Delays und Delays von Init-Containern mit einkalkulieren
467
13.14.9 Liveness Probe – Beispiele
467
13.14.10 Readiness Probe – Beispiele
470
13.14.11 Änderung der Probes im laufenden Pod/Deployment
472
13.14.12 Wann sollte zeitlich welche Probe eingesetzt werden?
473
13.14.13 Startup Probe (ab Kubernetes 1.16 [alpha])
473
13.14.14 Best Practices hinsichtlich der Probes?
475
13.14.15 Pod Readiness Gate
475
13.14.16 Pod-Lifecycle-Management und Hooks
477
13.15 Jobs
479
13.15.1 Failure-Verhalten
480
13.15.2 Job-Beispiel
480
13.15.3 CronJobs
482
13.16 Deployments (und inkludierte ReplicaSets)
484
13.16.1 Scale-Out: Von ReplicationControllern zu ReplicaSets zu Deployments
485
13.16.2 ReplicaSets und Set-based Label Selectors
487
13.16.3 Deployments
489
13.16.4 Kubectl rollout restart <deployment|daemonset|statefulset>?
490
13.16.5 Einfaches Deployment, Pod-Verfügbarkeitserkennung
490
13.16.6 Verfügbarkeiten und Update-Strategien
492
13.16.7 Echte Update-Fehler und minReadySeconds in Deployments
493
13.16.8 Deployment – HA und Verfügbarkeitszonen: Pod-Topology Spread Constraints
494
13.16.9 Umgebungsvariablen in Deployments nutzen (Pod-Name-basierte Log-Ordner)
495
13.16.10 Log-Ordner mit StatefulSet oder DaemonSet anstelle eines Deployments
499
13.16.11 Deployment per kubectl run erzeugen? Das war gestern …
500
13.16.12 Rolling Updates
500
13.16.13 Revisionshistorie? Nicht wirklich
502
13.16.14 Update-Strategien im Detail
503
13.16.15 Alternative Update-Strategie – strategyType: Recreate
503
13.16.16 Resume und Pause
503
13.16.17 Rollback-Verfahren
504
13.16.18 Multiple Release-Tracks und Deployment-Strategien
504
13.17 DaemonSets
507
13.17.1 Vorbetrachtungen
507
13.17.2 Mögliche Anwendungsfälle
509
13.17.3 DaemonSet-Scheduler und Node-Zuordnung
509
13.18 StatefulSets
512
13.18.1 Vorbetrachtungen
512
13.18.2 Die Komponenten des StatefulSets in der Praxis
513
13.18.3 volumeClaimTemplates für StatefulSets
514
13.18.4 Praxisbeispiele
514
13.19 Entscheidungshilfe: Wann Deployment, wann DaemonSet, wann StatefulSet?
514
13.19.1 Leichtgewichtige (Stateless-)Applikationen »irgendwo im Cluster«: Deployments
514
13.19.2 Node-bezogene Applikationsinstanzen (gegebenenfalls mit Persistenzen): DaemonSets
515
13.19.3 Die klassischen Daten-Persistenzen: StatefulSets
515
13.20 Label und Constraints
516
13.20.1 Warum Label?
516
13.20.2 Constraints
517
13.20.3 Aufbau
517
13.20.4 Ein paar einfache praktische Beispiele
518
13.20.5 Labels und Node/Pod-Affinity
518
13.20.6 Annotations
520
13.21 Namespaces: Limits und Quotas
521
13.21.1 Vorbetrachtungen
521
13.21.2 Multi-Tenancy per Default? Nein
524
13.21.3 Uniqueness pro Namespace
524
13.21.4 Objekte mit und ohne Namespace-Zuordnung
525
13.21.5 Praktischer Einsatz
525
13.21.6 Namespaces und Limits: Limit(Range)s vs. Quota
527
13.21.7 Limits für Namespaces in der Praxis
527
13.21.8 Node- und Pod-spezifische Statistiken
530
13.21.9 Namespaces und Resource-Quotas
530
13.21.10 Namespace-Löschung hängt
534
13.22 Namespaces: Multi-Tenancy und Security-Aspekte
534
13.22.1 Mögliche Probleme in Multi-Tenancy-Architekturen
535
13.22.2 Fazit
538
13.23 CustomResourceDefinitions
539
13.23.1 Der Archivar erhält Customer-defined Regale und Schubladen
539
13.23.2 CRDs abfragen
540
13.23.3 CRDs und Operatoren
540
13.23.4 CRDs in Kubernetes 1.15 und Structural Schemas
540
13.23.5 CRD-Evolution
541
13.23.6 Hängende CRDs löschen
541
13.24 Services
542
13.24.1 Arbeitsweise der Service-Ressource
542
13.24.2 Service-Endpoints und Endpoint-Slices (ab 1.16)
545
13.24.3 Die Service-Ressource aus funktionaler Sicht
547
13.24.4 Der Default-kubernetes-Service
548
13.24.5 K8s-Services und DNS
549
13.24.6 kube-dns vs. CoreDNS
549
13.24.7 Einstellbare Pod-DNS-Policies und /etc/resolv.conf
551
13.24.8 Kubelets, DNS-Erbschaft und das ewige Hin und Her mit der resolv.conf
552
13.24.9 Kubernetes-DNS anpassen
553
13.24.10 Service-Namenskonventionen
554
13.24.11 Die Service-Ressource
554
13.24.12 Services und assoziierte Pods
555
13.24.13 Services und Proxy-Modes
556
13.24.14 IPVS, Conntrack – und warum Kubernetes-DNS etwas »broken« ist
565
13.24.15 Service-Typen
566
13.24.16 Warten auf Godot – der Service-Typ »Loadbalancer« in On-Prem-Clustern
567
13.24.17 Beispiel: Service-Bereitstellung via NodePort
567
13.24.18 Service-Bereitstellung in der GKE-Cloud mit dem Typ LoadBalancer
569
13.24.19 Service-Typ LoadBalancer und Fixed IP?
569
13.24.20 MetalLB: Virtueller Loadbalancer für den Service-Typ »LoadBalancer« in On-Premises-Clustern
570
13.24.21 ExternalDNS
574
13.24.22 Headless Services: Weiche Migration von Legacy-Systemen
575
13.24.23 ExternalName-Services
579
13.24.24 Service-Beispiel: K8s-Dashboard und Metrik-Erfassung (metrics-server)
581
13.24.25 K8s-Services, Loadbalancer und der Rest der Welt
590
13.24.26 Services, Service-Proxies, NetworkPolicies & Co.: Kube-Router to the rescue?
591
13.25 Alternative Rollout-Verfahren: Helm (V3)
592
13.25.1 Helm
592
13.25.2 Das Verfahren
593
13.25.3 Die Helm-Architektur und der überfällige Rework
594
13.25.4 Ein kleines Beispiel-Setup
594
13.25.5 Initialisierung
595
13.25.6 Charts finden, inspizieren und managen
597
13.25.7 Vor- und Nachteile
600
13.25.8 Der Paketmanager-Standard unter Kubernetes? Nun ja ...
600
13.26 Alternative Rollout-Verfahren: Kustomize
600
13.26.1 Vorbetrachtungen – und Scope!
600
13.26.2 Der Scope dieses Kapitels
601
13.26.3 Overlay-Manifeste
601
13.26.4 Kustomize-Modifikatoren
602
13.26.5 Kustomize-Beispiele
602
13.26.6 Helloworld mit ConfigMapGenerator
607
13.26.7 Review, weitere Funktionen
611
13.26.8 secretGenerator
612
13.26.9 generatorOptions, Cross-Cutting Fields
612
13.26.10 Noch eine Baustelle: Die Inkompatibilitäten zwischen kustomize und kubectl -k
612
13.27 Kubernetes-Volumes und Datenpersistenzen
613
13.27.1 Kubernetes-Volumes im Unterschied zu einfachen Container-Mounts
613
13.27.2 Block-Storage vs. Cluster/Network-Filesystems
614
13.27.3 Persistente und nicht persistente Volumes
615
13.27.4 emptyDir
617
13.27.5 hostPath
619
13.27.6 Produktivtauglicher hostPath und KISS
619
13.27.7 NFS
621
13.27.8 Ceph
621
13.27.9 PersistentVolumes, PersistentVolumeClaims (statisch) und AccessModes
621
13.27.10 Beispiel: PersistentVolume und Claim-Referenzierung
624
13.27.11 ReclaimPolicies des PV
624
13.27.12 ReclaimPolicy zur Laufzeit patchen
625
13.27.13 PVC für PV erzeugen
625
13.27.14 PVC-Größen und Quotas
626
13.27.15 Claim-Referenzierung in Pods
627
13.27.16 Forcierte Löschung von hängenden (»stuck«) PVCs
628
13.27.17 Mount-Propagation
628
13.27.18 Bindungsfragen zwischen PV und PVC
628
13.27.19 Security relevante Aspekte und SupplementalGroups
630
13.27.20 Storage-Protection – doch schon ab Kubernetes 1.11
631
13.28 Dynamic Storage Classes / Auto-Provisioner
632
13.28.1 Vorbetrachtungen
632
13.28.2 StorageClasses
632
13.28.3 Statisch vs. dynamisch
633
13.28.4 Eine bestimmte StorageClass als Default setzen/löschen
635
13.28.5 Provisioner
635
13.28.6 Beispiel für einen NFS-Provisioner
637
13.28.7 Fazit
640
13.28.8 Topology Aware Dynamic Provisioning für PVs / VolumeBindingMode
641
13.29 Kubernetes CSI – Custom Storage Interface
643
13.29.1 Funktionsweise
643
13.29.2 Vor- und Nachteile
644
13.29.3 Komponenten
644
13.30 EFK: Zentrales Logging mit ElasticSearch, Fluentd und Kibana
645
13.30.1 Der EFK-Stack
645
13.30.2 Pre-Flight Requirements und Setup
648
13.30.3 NFS-Provisioner für das ES-StatefulSet
648
13.30.4 ElasticSearch-Deployment
649
13.30.5 Rollout per ElasticSearch-Operator (inklusive Kibana)
652
13.31 Cluster-Monitoring mit Prometheus
657
13.31.1 Prometheus-Label
660
13.31.2 Unterschiede der Installationsvarianten: Operator vs. kube-prometheus
660
13.31.3 Skalierbarer Prometheus(-Storage)
660
13.31.4 Operatorgestützte(r) Prometheus-Installation/Betrieb mit kube-prometheus
661
13.31.5 Persistenz und Kompaktierung
662
13.31.6 Setup
662
13.31.7 Externer Zugriff
664
13.31.8 Grafana-GUI
667
13.31.9 Installation zusätzlicher Grafana-Plugins
667
13.32 Full-Stack Monitoring: APM mit Dynatrace
668
13.32.1 Darf's etwas mehr sein?
668
13.32.2 Dynatrace
669
13.32.3 Pre-Flight Requirements
670
13.32.4 Setup
671
13.32.5 Monitoring
673
13.33 HPA – Horizontaler Pod-Autoscaler
677
13.33.1 Alternative HPAs: Better with Banzai?
678
13.33.2 Auslastungskontrolle
678
13.33.3 Autoscaler Metrics (CPU) im Detail
679
13.33.4 Parameter zur selektiven Steuerung des Ansprechverhaltens im HPA-Objekt
680
13.33.5 HPA-Setup und Metrics-Server
681
13.33.6 HPA-Scaling über die CPU-Load
682
13.33.7 Last-Test
683
13.33.8 HPA-Scaling-Policies selektiv pro HPA-Objekt einstellen
685
13.33.9 Memory-based HPA-Scaling
687
13.33.10 Horizontales Autoscaling über Custom Metrics (http_requests)
687
13.33.11 Hands-On für Custom-Metrics-HPA per http_requests
689
13.33.12 Prometheus-Custom-Metrics-Adapter anpassen und ausrollen
691
13.33.13 Custom-Metrics-basiertes Autoscaling für Message-Queues
696
13.33.14 Custom-Metrics unter OpenShift 4.5
698
13.33.15 Kubernetes-Addon: Cluster Proportional Autoscaling (Scaling Infra-Deployments)
702
13.34 Vertical Pod Autoscaler (der »Optimierer«)
704
13.34.1 Vorbetrachtungen
704
13.34.2 Vertical Pod Autoscaler im Detail
705
13.34.3 Flexibles Auto-Limit?
706
13.34.4 VPA-Komponenten
706
13.34.5 Hands-On
708
13.34.6 VPA-Recommendations und LimitRanges
712
13.34.7 Single-Pod-Deployments
714
13.34.8 Prometheus als VPA-Verlaufs-Backend
714
13.34.9 Uninstall
714
13.34.10 Weitere Informationen, Roadmap und Limitationen
714
13.34.11 VPA unter OpenShift 4.5
715
13.35 Cluster Autoscaler
715
13.36 Ingress (Konzept)
716
13.36.1 Ingress als Konzept
716
13.36.2 Was ist Ingress?
717
13.36.3 Ingress-Funktionalität und -Komponenten
717
13.36.4 Protokolle und involvierte Komponenten
718
13.36.5 Ingress im Detail
718
13.37 Service-Meshes
721
13.37.1 Achtung: Service vs. »echte« Services vs. »Meshes« – Begriffe
722
13.37.2 kube-proxy und K8s-Services vs. Service-Mesh
722
13.37.3 Service to Service
723
13.37.4 Mrs. Hudson and »The Serverless Computing Case«
723
13.37.5 Service-Mesh: Funktionsweise
724
13.37.6 Der wirkliche Mesh-Benefit
726
13.37.7 Vorhandene Microservices/Applikationen unmodifiziert in das Mesh und gut?
728
13.38 Service-Meshes in der Praxis mit Istio
728
13.38.1 Vorbetrachtungen
728
13.38.2 Die Routing-relevanten Objekte (Istio-spezifisch)
729
13.38.3 Installationsvarianten
730
13.38.4 Pre-Flight Requirements
730
13.38.5 Profilbasierte, automatisierte Installation per istioctl
731
13.38.6 Setup der Istio-Control-Plane mit Demo-Profil
732
13.38.7 Manuelle Anpassung der auszurollenden Istio-Features
733
13.38.8 Achtung: Den Service-Typ für externen Zugriff je nach Plattform nachträglich ändern
734
13.38.9 mTLS nachträglich aktivieren
735
13.38.10 Istioctl
735
13.38.11 Komponenten der Istio-Control-Planes
735
13.38.12 Fehlt das Kiali-Secret?
736
13.38.13 Post-Rollout
737
13.38.14 Die HPAs
737
13.38.15 GUIs
738
13.39 Beispiel für das Mesh-Routing zu einer Applikation mit verschiedenen Release-Tracks
739
13.39.1 Pre-Flights-Requirements: IPv6-Nonsens ab Istio 1.5 und das Beispiel »Bookinfo«
739
13.39.2 Admissionregistration für Auto-Sidecar Inject
739
13.39.3 Rollout der Bookinfo-Applikation zur Demonstration der Mesh-Arbeitsweise
740
13.39.4 Die Bookinfo-Applikation mit Envoy-Proxies ausrollen
741
13.39.5 Funktionsweise der Beispiel-Mesh-Applikation
743
13.39.6 Gateway-Installation und -Konfiguration
744
13.39.7 Enhanced-Routing: Vorbetrachtungen
745
13.39.8 Enhanced Routing: Zielrouting auf eine bestimmte review-Version
746
13.39.9 Gewichteter http-Traffic auf ein Subset von Backends – Traffic-Shifting
749
13.39.10 LB-Settings für DestinationRules
750
13.39.11 Istio-Visualisierung mit Kiali
751
13.39.12 Tracing mit Jaeger
753
13.39.13 Routing auf Basis der User-Identität
754
13.39.14 http Fault Injects (User-basiert)
755
13.39.15 TCP-Traffic-Shifting
758
13.39.16 Egress und Limitierung des Traffics nach außen
760
13.39.17 TCP-Egress auf externe MySQL-Datenbank
762
13.39.18 Istio-Uninstall
770
13.39.19 Fazit
770
13.40 Serverless und Knative
770
13.40.1 Knative
771
13.40.2 Knative Setup: Voraussetzungen
776
13.40.3 Knative-Installation
776
13.40.4 Knative-Custom-(Wildcard-)Domain
778
13.40.5 Observability
779
13.40.6 Einfache Knative-Sample-Applikation
779
13.40.7 Einen kompletten Knative-(Test-)Stack löschen
783
13.40.8 Das etwas schale Fazit
783
13.41 K8s-NetworkPolicies
784
13.41.1 Vorbetrachtungen
784
13.41.2 Pod-Isolation
784
13.41.3 Performance-Impact
786
13.41.4 Achtung: GKE-Cluster und NetworkPolicies
786
13.41.5 Test mit NetworkPolicy für httpd-Deployment
787
13.41.6 ACL-Arten
789
13.41.7 Egress-Limitierung ab Kubernetes 1.12
793
13.42 Kubernetes: Authentifizierung und Autorisierung (Basics)
795
13.42.1 Vorbetrachtungen und Scope
795
13.42.2 Strikte Trennung von Authentifizierung und Autorisierung – und SSO »light«
796
13.42.3 OAuth
797
13.42.4 Kubernetes und ABAC/RBAC
797
13.42.5 RBAC: Konzepte und Objekte
798
13.42.6 ABAC: Berechtigungen (Verbs)
800
13.42.7 Verbs-Varianten
800
13.42.8 Verbs auf der Kommandozeile
801
13.42.9 Berechtigungen/Verbs mit kubectl auth prüfen
802
13.42.10 apiGroups
802
13.42.11 Admission-Controls und der Admission-Controller
803
13.42.12 User- und Systemrollen
806
13.42.13 Generelles zu Accounts
809
13.42.14 Endlich externe Authentifizierungs-Provider?
810
13.42.15 ServiceAccounts
810
13.42.16 Secrets
812
13.42.17 Mountable Secrets
814
13.42.18 Secret-Auto-Rotation
816
13.42.19 User-Accounts, Cluster und Contexts
818
13.42.20 Ein einfaches RBAC-Beispiel mit einem Kubernetes-»User«
818
13.42.21 Authentifizierung an weiteren Clustern
823
13.42.22 Selektives Löschen von Cluster und Kontexten
823
13.42.23 Fazit
823
13.43 Kubernetes: Authentifizierung und Autorisierung (IDM-basiert)
824
13.43.1 Vorbetrachtungen
824
13.43.2 Keycloak SSO-Authentication
825
13.43.3 Setup
826
13.43.4 Login und Keycloak-Einrichtung
827
13.43.5 Kubernetes-Client-Account
827
13.43.6 Active Directory-Anbindung
827
13.43.7 Access-Token abfragen
828
13.43.8 kube-apiserver auf OIDC-Authentifizierung umstellen
828
13.43.9 Manuelles kubectl login via Keycloak/Access-Token per ~/.kube/config
829
13.43.10 OIDC-basiertes Login per kubectl
830
13.43.11 Fazit
832
14 Operatoren: Der Mini-Admin im Container
833
14.1 Vorbetrachtungen zum Thema Operatoren
833
14.1.1 Was ist ein Operator?
833
14.1.2 Controller-Loops
835
14.1.3 Operator-Kategorien
836
14.1.4 Red Hats Operator Framework und Alternativen
836
14.1.5 Kubebuilder
837
14.1.6 Operatorhub.io und OpenShift-Operatoren
837
14.2 Hands-on: etcd-Operator
838
14.2.1 Funktionalitäten
838
14.2.2 Implementierungsdetails und Pre-Flight-Requirements (NFS-Provisioner)
839
14.2.3 Rollout des etcd-Operators: CSV und EtcdCluster-CRDs
840
14.2.4 Konfigurationsmöglichkeiten der EtcdCluster-CR und Rollout
842
14.2.5 Error-Handling
846
14.2.6 Scale-Up
846
14.2.7 Upgrade bzw. Downgrade
847
14.3 Operator-Typen und Maturitäts-Level: Helm vs. Ansible vs. Go
848
14.4 Operator-Typen im funktionalen Vergleich: Helm vs. Ansible vs. Go
849
14.4.1 Der Helm-basierte Operator
849
14.4.2 Der Ansible-basierte Operator
850
14.4.3 Der Go-basierte Operator
853
14.5 Red Hats Operator-SDK
854
14.5.1 Vorbetrachtungen und Pre-Flight-Requirements für alle Operator-Typen
854
14.5.2 Vorbereitungen: Weitere Tasks für alle Operator-Typen (go, operator-sdk-Libs)
855
14.5.3 Vorbereitungen: Installation des OLM (Operator Lifecycle Manager) – nur Vanilla Kubernetes!
855
14.6 Helm-basierter Operator: CockroachDB
856
14.6.1 Vorbetrachtungen: Usability von Helm-Operatoren vs. Helm-Charts
856
14.6.2 Pre-Flight Requirements
857
14.6.3 Erzeugung der Operator-Strukturen aus dem Helm-Chart
857
14.6.4 CRD-Installation
858
14.6.5 Erzeugen des Operator-Images und Verteilung auf die Nodes
858
14.6.6 Anpassen des Operator-Deployments (lokales Image und imagePullPolicy: Never) und Rollout
859
14.6.7 Die Cockroach-DB-Custom-Ressource (CR) implementieren
859
14.6.8 Skalierung
860
14.6.9 Recovery
861
14.7 Ansible-basierter Operator: Memcached
861
14.7.1 Pre-Flight Requirements
861
14.7.2 Die Ansible-Role anpassen
863
14.7.3 CRD importieren, Build des Operator-Images
864
14.7.4 Memcached-Deployment anpassen und ausrollen
865
14.7.5 Memcached-CR ausrollen
866
14.7.6 Enhanced Ansible-Operator: Mcrouter (Memcached Router)
867
14.8 Go-basierter Operator: PodSet
869
14.8.1 Vorbetrachtungen und Pre-Flight Requirements
869
14.8.2 Operator-Ressourcen erzeugen
869
14.8.3 CRD generieren und im API-Server registrieren
871
14.8.4 Typen anpassen
872
14.8.5 Modifizierte CRD importieren, Controller erzeugen
874
14.8.6 Behind the Scenes
874
14.8.7 Operator Logik anpassen, modifizierte CR importieren
875
14.8.8 Erzeugen und Upload/Push/Copy des PodSet-Operator-Images
876
14.8.9 Operator-Images in OpenShifts interner Registry ablegen
877
14.8.10 Das Operator-Deployment anpassen und ausrollen
879
14.8.11 Weitere Quellen zu Operatoren
881
14.9 Fazit
882
15 Federated Cluster
883
15.1 Das Federated-Konzept
883
15.2 Federated Services
884
15.3 Federated Controller Manager und Scheduling
885
15.4 RZ-Failures und andere Punkte, die Sie beachten sollten
886
15.5 Kosten und Latenzen
886
15.6 Setup und andere Kopfschmerzen – Fazit
887
16 K8s: Debugging, Rolling Upgrades, the Road ahead
889
16.1 Debugging und Troubleshooting
889
16.1.1 Grundsätzliches
889
16.1.2 kubectl cluster-info dump
890
16.2 kubeadm-basierte Setups upgraden
891
16.2.1 kubeadm upgrade plan
891
16.3 Kubernetes 1.19 and beyond
894
16.3.1 Long-Term Support?
894
16.3.2 Storage Capacity Tracking und Health Monitoring
894
16.3.3 Structured Logging
895
16.3.4 Weitere Neuerungen
895
TEIL IV High-Level-Setup- und Orchestrierungs-Tools für Kubernetes-basierte Container-Infrastrukturen (On-Premises und in der Cloud)
897
17 OpenShift
899
17.1 Vorbetrachtungen und Historisches
899
17.1.1 All-in-One?
899
17.1.2 Was ist OpenShift?
900
17.1.3 OpenShift und OKD
901
17.2 OpenShift-Flavours
901
17.2.1 OKD
902
17.2.2 OpenShift Online
902
17.2.3 OpenShift Dedicated (Cloud Services)
902
17.2.4 OpenShift Container Platform (OCP)/OpenShift Enterprise
902
17.2.5 OpenShift Kubernetes Engine
903
17.2.6 OpenShift unter Azure
903
17.2.7 OpenShift-Lifecycles, CRI-O- und Kubernetes-Releases im Unterbau
903
17.3 Unterschiede und Ergänzungen zu Kubernetes (Auszüge)
905
17.3.1 Core Concepts
905
17.3.2 OpenShift Projects
906
17.4 OpenShift-Networking im Überblick
907
17.4.1 OVS-Plugins
907
17.4.2 Die Arbeitsweise der OpenShift-SDN-Plugins
908
17.4.3 Netzwerk-Management/Konfiguration per Operator und Namespace-Isolation
910
17.5 Konzept: OpenShift Router – »Ingress deluxe«
912
17.5.1 OpenShift-Router und route – die Funktionsweise im Detail
913
17.5.2 Router und Host-Ports
914
18 OpenShift 4.x and beyond
917
18.1 Behind the scenes
918
18.2 Unterstützte Plattformen
919
18.3 What's new – and what's not
920
18.3.1 Setup
920
18.3.2 Kubernetes under the Hood und die Migration
920
18.3.3 RHEL/CentOS als Host?
920
18.3.4 Machine API
921
18.3.5 GUIs
921
18.3.6 Operatoren
921
18.3.7 Mesh
922
18.3.8 SDN-Provider
922
19 OpenShift-Setup
923
19.1 Setup von OpenShift 4.5 (AWS-Cloud)
923
19.1.1 Vorbetrachtungen
923
19.1.2 Benötigte Internet-Zugriffe
924
19.1.3 DNS-Setup
924
19.1.4 AWS-User und -Berechtigungen
925
19.1.5 Policies, Richtlinien und Berechtigungen
925
19.1.6 Account-Limits/Requests
927
19.1.7 Access-Tracking und Richtlinie simulieren
927
19.1.8 Access Key ID und Access Key Value für User
927
19.1.9 VPCs und IP-Range
927
19.1.10 Setup-Vorbereitungen und die Wahl der zu installierenden OpenShift-Version
928
19.1.11 Der OpenShift-Installer im Detail: Terraform included
928
19.1.12 Variante 1: Setup interaktiv
929
19.1.13 Variante 2: Customisiertes Setup über install-config.yaml (zu präferieren)
931
19.1.14 Anpassungsmöglichkeiten der install-config.yaml
932
19.1.15 Beispielkonfiguration: OpenShift 4.x, Disk-Sizes und Hardware-Hunger
934
19.1.16 AWS-Compute- bzw. Worker-Replicas auf null, zero, nothing – das geht auch ...
935
19.1.17 AWS-Instanz-Typen
936
19.1.18 Instanz-Typen, Leistungs- und Kostenfaktoren, Accelerated Computing
937
19.1.19 Benötigte Credentials und Pull-Secrets für die install-config.yaml
939
19.1.20 Ordner-Strukturen für das Setup
939
19.1.21 Überblick: Bootstrapping- und Installationsprozeduren im Cluster
941
19.2 Setup von OpenShift 4.5 auf Bare Metal oder VM
942
19.2.1 Vorbetrachtungen
942
19.2.2 Assisted Bare Metal Installer
943
19.2.3 Ignition
943
19.2.4 CentOS, RHEL oder CoreOS (RHCOS)
944
19.2.5 Setup-Details: All-in-one-Helper/Bastions-Node
945
19.2.6 Hardware-Requirements – oder: Green-IT war gestern
946
19.2.7 Setup-Details: Vorbereitungen
947
19.2.8 Anpassungen der Ansible-Playbooks und involvierten Dateien
948
19.2.9 Weitere Anpassungen: Überblick
951
19.2.10 Weitere Anpassungen: NFS-Share
951
19.2.11 Weitere Anpassungen: HAProxy-Konfiguration
952
19.2.12 Filetranspiler
953
19.2.13 Weitere optionale Anpassungen: NTP/Chrony
953
19.2.14 Weitere Anpassungen: Pull-Secret hinterlegen
954
19.2.15 Setup-Details: Vorbereitungen für das Auto-Provisioning der RHCOS-Nodes
954
19.2.16 Ignition-Konfigurationen
954
19.2.17 Achtung: ssh-keys, install-config.yaml und der RHCOS-Login
956
19.2.18 Rollout des Helper-Nodes
956
19.2.19 Erzeugen und Bereitstellen der Ignition-Konfigurationen
957
19.2.20 Ausrollen der RHCOS-Nodes: Bootstrapper-Node
958
19.2.21 Login-Credentials
962
19.2.22 Cluster-Status nach dem Bootstrapping und der erfolgreichen Installation aller Master-Nodes
962
19.2.23 Persistent-Storage-Setup zum Abschluss der Provisionierung (Registry)
963
19.2.24 Der Registry-Operator und die gegebenenfalls erforderliche manuelle Status-Änderung
965
19.2.25 Finaler Rollout-Zustand und Login
966
19.2.26 Bug: Console didn't come up
966
19.2.27 Finaler Zustand der Cluster-Operatoren
966
19.2.28 Zusammenfassung der Installationsschritte für die On-Prem-(Online-)Installation
967
19.2.29 GUI-Zugriff auf die OpenShift-Routen und der AIO-Node als zusätzlicher DNS-Server
968
19.3 Post-Install-Tasks bei On-Prem-Installationen
969
19.3.1 Das 25-Stunden-Problem
969
19.3.2 Den EFK-Logging-Stack nachträglich installieren
969
19.3.3 TCP-Routing für VM-basierte Setups mit Helper Node
970
19.4 Exkurs: Full Disconnected Bare-Metal/VM-Install
971
19.4.1 Firewall-Ports
972
19.4.2 Zwei Registry-Secrets
973
19.4.3 Merge der Credentials mit vorhandenem Red-Hat-Pull-Secret
973
19.4.4 FQHN
973
19.4.5 Variablen für das Mirror-Script
974
19.4.6 Den CA-Trust updaten (CA des NRM)
974
19.4.7 Start des Registry-Mirrors
974
19.4.8 Das CA-Zertifikat des NRM und lokale Registry-Credentials in der install-config.yaml
977
19.4.9 Neue openshift-install Binary nach Registry-Mirroring für Offline Installation erzeugen
977
19.4.10 Rollout
978
19.4.11 Debugging auf RHCOS-Ebene
979
19.5 OpenShift 4.5 Installer Provisioned Infrastructure (IPI) mit vSphere
979
19.5.1 Vorbetrachtungen
979
19.5.2 Pre-Flights-Requirements für das folgende Setup
979
19.5.3 Achtung, wichtig: DNS-Settings
980
19.5.4 Helper-Node to the rescue
981
19.5.5 install-config.yaml für eine vSphere-IPI-Installation (Auszüge)
981
19.5.6 Rollout
983
19.5.7 Post-Rollout-Zustand
985
19.5.8 Master-Nodes nach der Installation als schedulable kennzeichnen
986
19.5.9 MachineSets und (Auto-)Scaler
986
20 OpenShift-Administration
989
20.1 CLI-Tools
989
20.1.1 oc – die OpenShift-CLI
989
20.1.2 Aktivierung der Bash-Completion für die oc-*-Tools
990
20.1.3 oc und die kubectl-CLI im Vergleich
990
20.1.4 Die wichtigsten oc-Kommandos im Überblick (Auszüge)
991
20.1.5 Nachträgliches Setzen von Liveness und Readiness Probes
992
20.2 Administration per GUI
994
20.2.1 Admin-View
994
20.2.2 Developer-View
995
20.3 Applikation ausrollen (oc new-app) und externer Zugriff darauf
995
20.3.1 Select/Create Project
996
20.3.2 Login als kubeadmin oder system:admin
996
20.3.3 Applikationsquelle auswählen
997
20.3.4 Rollout der Applikation
998
20.3.5 Die native Remote-Shell für den Zugriff auf den Pod nutzen
999
20.3.6 Externer Zugriff auf die-App, Service-Types für Nicht-HTTP(S)-basierte Anwendungen
1000
20.3.7 TCP-Routing für VM-basierte Setups mit Helper-Node
1002
20.3.8 Observieren und reagieren: oc observe
1002
20.3.9 Debuggen von Applikationen unter OpenShift
1002
20.4 OpenShift-Build-Prozesse (oc new-build)
1003
20.4.1 Build-Input-Varianten
1003
20.4.2 oc new-build (binary)
1004
20.4.3 Docker-Build (start-build)
1004
20.4.4 S2I (Source to Image)
1009
20.4.5 Jenkins-basierter Build via Pipeline-Build-Strategy
1010
20.5 User-, Token- und Role-Management in OpenShift
1012
20.5.1 User-Objekte unter OpenShift, externe Identity-Provider (LDAP/AD)
1013
20.5.2 User-Privilegien und Rollenbindungen
1016
20.5.3 Cluster-Admin erzeugen
1017
20.5.4 Wer darf was?
1018
20.6 Accounts, Berechtigungskonzepte und Constraints
1019
20.6.1 SCC –Security Context Constraints
1019
20.6.2 Default-SCCs, Arbeitsweise und Implementierung
1020
20.6.3 SCCs-Details abfragen
1021
20.6.4 Eigene SCCs definieren und Usern/Gruppen zuordnen
1023
20.6.5 Fehlende Berechtigungen bzw. den System-ServiceAccount zum anyuid-SCC setzen
1024
20.6.6 Benutzung des Default-ServiceAccounts in weiteren Namespaces
1025
20.6.7 Eigener ServiceAccount
1026
20.6.8 Pods und (eingeschränkte) HostPath-SCCs
1026
20.7 Imagestreams
1028
20.7.1 Vorbetrachtungen
1028
20.7.2 Imagestreams im Detail
1030
20.7.3 Beispiel: Manueller Import eines (externen) Images in einen OpenShift-Imagestream
1032
20.7.4 Re-Deployment-Trigger
1034
20.8 DeploymentConfigs (dc)
1037
20.8.1 Automatische Rollbacks und Trigger
1039
20.8.2 Unterschiede im Deployment- bzw. DeploymentConfig-Prozess
1039
20.8.3 Update und Rollback einer DeploymentConfig
1039
20.9 OpenShift-Router und der Ingress-Operator
1040
20.9.1 Vorbetrachtungen
1040
20.9.2 Services
1041
20.9.3 Ports
1041
20.9.4 Konfiguration des Routers per Ingress-Operator bzw. Kern-Parameter
1042
20.9.5 Ingress-Operator: Die Konfigurationsparameter im Überblick
1043
20.9.6 HAProxy-Router: Strict SNI
1044
20.9.7 Routen-Typen
1044
20.9.8 OpenShift-Routen und NodePort-Services für Nicht-HTTP(S)-basierte Anwendungen
1045
20.9.9 Routenspezifische Annotations: Überblick
1045
20.9.10 Routenspezifische Annotations: Setzen der LB-Modi
1046
20.9.11 Routenspezifische Annotations: Sticky Sessions
1046
20.9.12 Routenspezifische Annotations: IP-Whitelist für Routen
1048
20.9.13 Router-Sharding
1048
20.9.14 Weightings in Routen
1051
20.9.15 Alternate (Route-)Backends und Weightings
1051
20.9.16 Egress (IPs)
1052
20.10 DNS-Customizing
1053
20.10.1 Hintergrund
1053
20.10.2 Umsetzung
1053
20.11 Knative unter OpenShift via Operator
1054
20.11.1 Knative-Setup
1054
20.12 Istio-Mesh per Operator
1056
20.12.1 Auto-Route-Creation für Istio
1058
20.13 MachineSets, MachineConfigs und Cluster-Autoscaler unter OpenShift
1059
20.13.1 MachineConfigs
1060
20.13.2 MachineConfig Operator
1061
20.13.3 Komponenten des MCO
1061
20.13.4 MachineConfigPool
1062
20.13.5 Machines vs. MachineSets, manuelle Skalierung
1063
20.13.6 Cluster-Autoscaler
1064
20.14 OpenShift Infrastructure-Nodes
1064
20.14.1 Die wichtige Rolle der Infra-Nodes
1064
20.14.2 Umsetzung
1065
20.14.3 Erzeugen eines Custom-Pools für die Infra-Node-Templates
1066
20.14.4 Umzug
1067
20.15 AWS Dynamic Storage Provisioning (EBS/EFS) unter OpenShift
1067
20.15.1 EBS: Elastic Block Storage (mit Auto-Provisioner)
1068
20.15.2 EBS: Test für das EBS-Auto-Provisioning
1068
20.15.3 EBS: NFS-Provisioner mit OpenShift auf AWS
1069
20.15.4 EFS: Elastic Filesystem (das Amazon-NFS)
1071
20.15.5 EFS: Security-Group-Einstellungen setzen
1072
20.15.6 EFS: EC2-Instanzen auf die passenden Security Groups einstellen
1072
20.15.7 EFS: Anlegen des Dateisystems
1073
20.15.8 EFS: FS-ID
1074
20.15.9 EFS: Auto-Provisioner unter OpenShift einrichten
1074
21 Container-Security (2) – Full-Featured Security Stack
1079
21.1 Vorbetrachtungen
1079
21.1.1 Grundsätzliche Aspekte
1079
21.1.2 All-in-one-Security
1080
21.2 NeuVector
1081
21.2.1 Federation-Management-/Multi-Cluster
1082
21.2.2 Architektur der NeuVector-Security-Lösung
1082
21.2.3 Pipeline-Integration
1083
21.3 Bereitstellung der benötigten Images
1084
21.3.1 Bereitstellungsvarianten
1084
21.3.2 Variante 1 (Direkter Pull)
1085
21.3.3 Variante 2 (Bereitstellung der Images über die interne OpenShift-Registry)
1085
21.3.4 Storage
1087
21.4 Setup
1087
21.4.1 Setup-Varianten
1088
21.4.2 Post-Rollout-Zustand
1089
21.4.3 Login, Lizenzierung und Verwaltung
1089
21.4.4 LDAP/AD und IDM-Kopplung
1096
22 Cloud-Hosted Kubernetes am Beispiel von GKE
1097
22.1 Kubernetes, Google und der Rest der Welt
1097
22.1.1 GKE – Google Kubernetes Engine im Überblick
1098
22.1.2 Regionen, Zonen und Verfügbarkeiten
1098
22.1.3 GKE-Setup-Varianten
1099
22.1.4 Mindestangaben für das Setup
1100
22.1.5 Googles Node-OS – und weit und breit kein CRI-O
1100
22.1.6 Sonstige einstellbare Features
1101
22.2 gcloud – CLI-basierte Cluster-Installation
1102
22.2.1 gcloud-Repo einbinden, gcloud-SDK installieren
1102
22.2.2 gcloud init für den Provisioner-Node
1102
22.2.3 gcloud-Bash-Completion
1104
22.2.4 Installierte und verfügbare gcloud-Komponenten auflisten und nachinstallieren
1104
22.2.5 Bei neuem Projekt Container-API und Billing aktivieren
1105
22.2.6 Cluster-Setup mit gcloud
1106
22.2.7 Cluster-Installation mit Anpassungen
1106
22.2.8 Achtung: GKE-Cluster und NetworkPolicies
1108
22.2.9 Cluster löschen
1108
22.2.10 Auth-Entries/Kontexte fetchen/switchen, Projekt setzen
1109
22.2.11 X509-Zertifikatsfehler bei der Ausführung von kubectl
1109
22.2.12 Projektspezifische GKE-Registry aktivieren/nutzen
1110
22.3 GKE-Storage
1110
22.3.1 Vorbetrachtungen: Block, NFS oder Object?
1110
22.3.2 Setup von Local NFS (Static & Dynamic Provisioning)
1110
22.3.3 Erzeugen eines containerisierten NFS-Servers mit statischer PV-Bindung
1111
22.3.4 Regional/Replicated GCE-Disk
1112
22.3.5 GKE-Filestore/Fileshare (RWX) und das Dynamic Provisioning
1113
22.3.6 Löschen des Filestores und Deaktivierung der API
1114
22.4 Direkter Zugriff auf GKE-(CoS-)Nodes
1115
22.4.1 GUI
1115
22.4.2 Direkter ssh-Zugriff vom Bastions/Client Host
1116
23 CI/CD-Pipelines und GitOps
1117
23.1 Vorbetrachtungen zu CI/CD in der Praxis
1118
23.1.1 Nice-to-haves
1118
23.2 GitOps?
1119
23.2.1 Und da war es ... das nächste Buzzword
1119
23.2.2 GitOps-Prinzipien
1120
23.2.3 Die Vorteile von GitOps zusammengefasst
1121
23.3 GitOps-Pipeline-Modelle
1121
23.3.1 Pull- vs. Push-based
1121
23.3.2 Push-based
1122
23.3.3 Pull-based
1123
23.3.4 Multiple Stages/Applications
1124
23.3.5 Weitere Tools, um GitOps zu implementieren
1124
23.4 GitOps-Demo (CI/CD) unter GKE mit Cloud Build
1125
23.4.1 Setup
1125
23.4.2 Erstellung der CI-Pipeline
1129
23.4.3 Pushen des veränderten Codes per Git und das (Auto-)Triggern des Builds
1130
23.4.4 Erstellung der CD-Pipeline
1132
23.4.5 Das Repo hello-cloudbuild-env initialisieren und die CD-Pipeline in Betrieb nehmen
1133
23.4.6 Triggern der kompletten CI/CD-Pipeline
1136
23.4.7 Löschen der verwendeten Ressourcen
1137
23.5 GitOps mit Tekton (CI-Fokus) – Vorbetrachtungen
1139
23.5.1 Tekton und Co. – die Architektur
1139
23.5.2 Tektons Building-Blocks
1140
23.5.3 Webhooks
1141
23.5.4 CD-Automation
1142
23.5.5 Pre-Flight Requirements
1142
23.5.6 Aufbau und Struktur der folgenden Beispiele
1142
23.6 Tekton Setup
1143
23.6.1 Pre-Flight Requirements und verwendete Versionen
1143
23.6.2 Installation der Tekton-Pipeline
1143
23.6.3 Das Tekton-Dashboard installieren
1144
23.6.4 Step1: Ein simples Tekton-Beispiel, um die CR(D)s und die Arbeitsweise kennenzulernen
1144
23.6.5 Setup der ersten Tasks
1145
23.6.6 Erstellung der Tekton-Pipeline-Ressource
1148
23.6.7 Pipeline-Assembly
1152
23.7 Beispiel: Tekton Pipeline (Build, Push & Deploy)
1153
23.7.1 Vorbetrachtungen
1154
23.7.2 Achtung: Verwendete Registry und davon abhängige Secret-Konfiguration
1154
23.7.3 Achtung: SCCs unter OpenShift
1156
23.7.4 Die Post-Deploy-Pipeline (noch kein run)
1156
23.7.5 Start des PipelineRuns
1157
23.7.6 OpenShift-GUI-Integration von Tekton
1159
23.8 Pipeline-Trigger mit Tekton
1160
23.8.1 Die CRD-Komponenten
1160
23.8.2 Ziel-Setup und Pre-Flight Requirements
1162
23.8.3 Pipeline-Setup mit Triggern
1162
23.8.4 Installation der Trigger
1163
23.8.5 Fazit
1166
23.9 GitOps mit ArgoCD (CD-Fokus)
1167
23.9.1 Vorbetrachtungen
1167
23.9.2 GUI-Login
1169
23.9.3 ArgoCD-Server-Login
1169
23.9.4 Hinzufügen von Repos
1170
23.9.5 Änderungen am CD-Teil und Git-Divergenzen mit lokalen Daten/Branches
1170
23.9.6 Repo mit »Post-Deploy«-Branch als Applikation unter ArgoCD einrichten
1172
23.10 GitOps (CD) mit FluxCD
1173
23.10.1 Flux-Setup (GKE)
1174
23.10.2 fluxctl-Binary
1175
23.10.3 SSH-Keys für Flux und GitHub
1176
23.10.4 Interaktiver Test für Change-Requests
1177
23.10.5 Deeper Control mit fluxctl
1179
23.10.6 Flux und Argo?
1179
23.11 Fazit
1180
TEIL V Software-Defined Storage für verteilte Container-Infrastrukturen
1181
24 Software-Defined Storage für Container-Cluster
1183
24.1 SDS-Funktionsprinzipien
1184
24.1.1 Die Abstraktion
1184
24.1.2 SDS und Storage-Tiers
1185
24.1.3 Multi-Purpose-SDS für jeden Anwendungsfall: Block, File, Object
1185
24.2 Ceph
1185
24.2.1 Ceph und RADOS
1186
24.2.2 Librados und Crushmaps
1187
24.2.3 Die Ceph-Daemons im Kurzüberblick: MON, OSD, MDS, MGR
1188
24.3 Ceph-Bereitstellungsverfahren für Container-Cluster
1189
24.3.1 RBD
1189
24.3.2 CephFS
1189
24.3.3 ObjectStore (RGW) – und kein RWX
1190
24.4 Containerisiertes Setup des Ceph-Clusters (cephadm/Podman)
1190
24.4.1 Vorbereitungen
1190
24.4.2 Zeit-Synchro und Podman
1191
24.4.3 Containerized – Ceph? cephadm vs. Rook
1191
24.5 Rollout des Ceph-Clusters
1191
24.5.1 Erzeugen der neuen Ceph-Cluster-Konfiguration
1191
24.5.2 Bootstrap von ceph1
1192
24.5.3 Deployment weiterer Nodes (inklusive MONs und OSDs)
1194
24.5.4 Aktivierung des k8sevents-Moduls für Ceph-MGR (Optional)
1195
24.5.5 OSDs aktivieren
1196
24.5.6 Deployment von CephFS
1197
24.5.7 Pool für RBD erzeugen und Placement Groups (PGs)
1198
24.5.8 RGW- und Object-Store-Bereitstellung
1199
24.5.9 Ceph als SDS für Kubernetes – Vorbetrachtungen zu den folgenden Abschnitten
1200
24.6 Ceph-RBD-Provisioner via ceph-csi
1200
24.6.1 Setup der Ceph-Client-Authentication (Kubernetes-Nodes), CSI-Configmap
1201
24.6.2 Anlegen des ceph-csi-cephx-Secrets
1202
24.6.3 Erzeugen der ceph-csi-Plugin-Ressourcen
1203
24.6.4 Anlegen der RBD-CSI-StorageClass
1203
24.6.5 Rollout eines Test-Pods mit einem PVC
1204
24.6.6 Löschung des PV und Troubleshooting
1205
24.7 CephFS-Provisioner via ceph-csi
1206
24.7.1 Benötigte Secrets für die CephFS-Provisionierung
1206
24.7.2 Rollout von RBAC-Objekten, Provisioner, NodePlugin und ConfigMap
1206
24.7.3 StorageClass und Secret für CephFS-Provisioner
1207
24.7.4 Den CSI-CephFS-Provisioner testen
1208
24.7.5 Volume-Struktur auf dem CephFS-Cluster
1209
24.7.6 CephFS per NFS-Ganesha zur Verfügung stellen
1210
24.7.7 Vollständige Löschung des Clusters
1211
24.8 Containerized Ceph mit Rook
1211
24.8.1 Wer überwacht den Wächter?
1211
24.8.2 How it works
1212
24.8.3 Abstraktion
1214
24.8.4 Rook, Ceph, NooBaa – und OpenShift?
1214
24.8.5 Setup: Pre-Flight Requirements
1215
24.8.6 Setup: Common Ressources (CRDs, RBAC etc.)
1215
24.8.7 Setup: Rook-Operator
1216
24.8.8 Rollout des Ceph-Clusters
1217
24.8.9 Dashboard
1219
24.8.10 Rook-Toolbox für Ceph-Cluster
1220
24.8.11 Neue Pools anlegen
1220
24.8.12 CephFS (MDS) einrichten
1221
24.8.13 Einen Ceph-Object-Store einrichten und darauf zugreifen
1222
24.8.14 User für den direkten S3-Zugriff anlegen
1224
24.8.15 Einfaches S3-Handling mit unserem Object Store
1227
24.8.16 Prometheus-Monitoring für Rook
1227
24.8.17 Zugriff von innen und außen
1227
24.8.18 Nachträgliche Erweiterung, Anpassung und Upgrades
1227
24.9 Quay-Registry mit NooBaa-Object-Store
1228
24.9.1 Vorbetrachtungen und Pre-Flight Requirements
1228
24.9.2 Noobaa-Setup via Operator
1229
24.9.3 Quay-Setup via Operator unter OpenShift mit NooBaa-S3-Backing-Store
1233
24.9.4 Zugriff und Einrichtung der Quay-Registry
1236
24.10 OCS – OpenShift Container Storage
1238
24.10.1 Internal, Internal-attached, External
1239
24.10.2 Additional Storage Disks (RHCOS)
1240
24.10.3 Local Volumes und Local Storage Operator
1241
24.11 Weitere Storage-Anbieter für Kubernetes-basierte Cluster
1243
24.11.1 StorageOS
1243
24.11.2 MinIO
1244
25 Was war, was ist, was sein wird
1245
25.1 Container-Cluster und Microservices als Allheilmittel?
1245
25.2 The Road Ahead
1245
Index
1247