Kubernetes in Action - Anwendungen in Kubernetes-Clustern bereitstellen und verwalten

Marko Lukša

Kubernetes in Action

Kubernetes in Action - Anwendungen in Kubernetes-Clustern bereitstellen und verwalten

2018

670 Seiten

Format: PDF

E-Book: €  39,99

E-Book kaufen

E-Book kaufen

ISBN: 9783446456020

 

Inhalt

9

Vorwort

23

Der Autor

24

Danksagung zur englischsprachigen Ausgabe

25

Über dieses Buch

27

Zielgruppe

27

Der Aufbau dieses Buches

28

Der Code

29

Das Forum zum Buch

30

Sonstige Onlinequellen

30

Teil I: Überblick

31

1 Einführung in Kubernetes

33

1.1 Der Bedarf für ein System wie Kubernetes

34

1.1.1 Von monolithischen Anwendungen zu Microservices

34

1.1.2 Eine konsistente Umgebung für Anwendungen bereitstellen

38

1.1.3 Übergang zu Continuous Delivery: DevOps und NoOps

38

1.2 Containertechnologien

40

1.2.1 Was sind Container?

40

1.2.2 Die Containerplattform Docker

44

1.2.3 Die Docker-Alternative rkt

48

1.3 Kubernetes

49

1.3.1 Die Ursprünge

49

1.3.2 Kubernetes im Überblick

49

1.3.3 Die Architektur eines Kubernetes-Clusters

51

1.3.4 Anwendungen auf Kubernetes ausführen

52

1.3.5 Vorteile der Verwendung von Kubernetes

54

1.4 Zusammenfassung

57

2 Erste Schritte mit Docker und Kubernetes

59

2.1 Containerimages mit Docker erstellen, ausführen und teilen

59

2.1.1 Docker installieren und einen Hello-world-Container ausführen

60

2.1.2 Eine triviale Node.js-Anwendung erstellen

62

2.1.3 Eine Docker-Datei für das Image erstellen

63

2.1.4 Das Containerimage erstellen

63

2.1.5 Das Containerimage ausführen

66

2.1.6 Das Innenleben eines laufenden Containers untersuchen

67

2.1.7 Container anhalten und entfernen

69

2.1.8 Das Image zu einer Registry hochladen

69

2.2 Kubernetes-Cluster einrichten

71

2.2.1 Einen lokalen Kubernetes-Cluster mit einem Knoten mithilfe von Minikube ausführen

71

2.2.2 Gehostete GKE-Cluster

73

2.2.3 Einen Alias und die Befehlszeilenvervollständigung für kubectl einrichten

76

2.3 Eine erste Anwendung in Kubernetes ausführen

77

2.3.1 Die Node.js-Anwendung bereitstellen

78

2.3.2 Auf die Webanwendung zugreifen

81

2.3.3 Die logischen Bestandteile des Systems

82

2.3.4 Anwendungen horizontal skalieren

84

2.3.5 Auf welchen Knoten läuft die Anwendung?

87

2.3.6 Das Kubernetes-Dashboard

88

2.4 Zusammenfassung

89

Teil II: Grundlagen

91

3 Pods: Container in Kubernetes ausführen

93

3.1 Einführung in Pods

93

3.1.1 Wozu benötigen wir Pods?

94

3.1.2 Grundlagen von Pods

95

3.1.3 Container auf Pods verteilen

96

3.2 Pods aus YAML- und JSON-Deskriptoren erstellen

99

3.2.1 Den YAML-Deskriptor eines bestehenden Pods untersuchen

99

3.2.2 Einen einfachen YAML-Deskriptor für einen Pod schreiben

101

3.2.3 Einen Pod mit kubectl create erstellen

103

3.2.4 Anwendungsprotokolle anzeigen

104

3.2.5 Anforderungen an den Pod senden

105

3.3 Pods mithilfe von Labels ordnen

106

3.3.1 Einführung in Labels

107

3.3.2 Labels beim Erstellen eines Pods angeben

108

3.3.3 Labels vorhandener Pods ändern

109

3.4 Eine Auswahl der Pods mithilfe von Labelselektoren auflisten

110

3.4.1 Pods anhand eines Labelselektors auflisten

110

3.4.2 Labelselektoren mit mehreren Bedingungen

112

3.5 Die Podzuweisung mithilfe von Labels und Selektoren einschränken

112

3.5.1 Labels zur Klassifizierung von Arbeitsknoten

113

3.5.2 Pods bestimmten Knoten zuweisen

114

3.5.3 Zuweisung zu einem einzelnen Knoten

114

3.6 Pods mit Anmerkungen versehen

115

3.6.1 Die Anmerkungen zu einem Objekt einsehen

115

3.6.2 Anmerkungen hinzufügen und ändern

116

3.7 Ressourcen mithilfe von Namespaces gruppieren

116

3.7.1 Der Bedarf für Namespaces

117

3.7.2 Andere Namespaces und die zugehörigen Pods finden

117

3.7.3 Namespaces erstellen

118

3.7.4 Objekte in anderen Namespaces verwalten

119

3.7.5 Die Trennung der Namespaces

120

3.8 Pods stoppen und entfernen

120

3.8.1 Pods unter Angabe des Namens löschen

120

3.8.2 Pods mithilfe von Labelselektoren löschen

121

3.8.3 Pods durch Entfernen eines ganzen Namespaces löschen

121

3.8.4 Alle Pods in einem Namespace löschen und den Namespace erhalten

122

3.8.5 (Fast) alle Ressourcen in einem Namespace löschen

122

3.9 Zusammenfassung

123

4 Replikationscontroller & Co.: Verwaltete Pods bereitstellen

125

4.1 Pods funktionsfähig halten

126

4.1.1 Aktivitätssonden

126

4.1.2 HTTP-Aktivitätssonden erstellen

127

4.1.3 Eine Aktivitätssonde in Aktion

128

4.1.4 Weitere Eigenschaften der Aktivitätssonde festlegen

129

4.1.5 Wirkungsvolle Aktivitätssonden erstellen

130

4.2 Replikationscontroller

132

4.2.1 Die Funktionsweise von Replikationscontrollern

133

4.2.2 Einen Replikationscontroller erstellen

135

4.2.3 Der Replikationscontroller in Aktion

136

4.2.4 Pods in den Gültigkeitsbereich eines Replikationscontrollers bringen und daraus entfernen

141

4.2.5 Das Pod-Template ändern

144

4.2.6 Pods horizontal skalieren

145

4.2.7 Einen Replikationscontroller löschen

147

4.3 Replikationssätze anstelle von Replikationscontrollern verwenden

148

4.3.1 Replikationssätze und Replikationscontroller im Vergleich

148

4.3.2 Einen Replikationssatz definieren

149

4.3.3 Einen Replikationssatz erstellen und untersuchen

150

4.3.4 Die ausdrucksstärkeren Labelselektoren des Replikationssatzes

151

4.3.5 Zusammenfassung: Replikationssätze

152

4.4 Daemonsets zur Ausführung einer Instanz eines Pods auf jedem Knoten

152

4.4.1 Einen Pod auf allen Knoten ausführen

152

4.4.2 Einen Pod nur auf einigen Knoten ausführen

153

4.5 Pods für endliche Aufgaben

156

4.5.1 Jobs

157

4.5.2 Einen Job definieren

158

4.5.3 Ein Job in Aktion

158

4.5.4 Mehrere Podinstanzen in einem Job ausführen

159

4.5.5 Die Zeit zum Abschließen eines Job-Pods begrenzen

160

4.6 Jobs regelmäßig oder zu einem späteren Zeitpunkt ausführen

161

4.6.1 Einen Cron-Job erstellen

161

4.6.2 Die Ausführung geplanter Jobs

162

4.7 Zusammenfassung

163

5 Dienste: Pods finden und mit ihnen kommunizieren

165

5.1 Dienste

166

5.1.1 Dienste erstellen

167

5.1.2 Dienste finden

173

5.2 Verbindungen zu Diensten außerhalb des Clusters

177

5.2.1 Dienstendpunkte

177

5.2.2 Manuell eingerichtete Dienstendpunkte

178

5.2.3 Einen Alias für einen externen Dienst erstellen

180

5.3 Dienste für externe Clients verfügbar machen

181

5.3.1 Einen NodePort-Dienst verwenden

181

5.3.2 Einen Dienst über einen externen Load Balancer verfügbar machen

185

5.3.3 Besondere Eigenschaften von externen Verbindungen

187

5.4 Dienste über eine Ingress-Ressource extern verfügbar machen

189

5.4.1 Eine Ingress-Ressource erstellen

191

5.4.2 Über den Ingress auf den Dienst zugreifen

192

5.4.3 Mehrere Dienste über denselben Domänennamen verfügbar machen

193

5.4.4 Einen Ingress für TLS-Datenverkehr einrichten

194

5.5 Die Bereitschaft eines Pods zur Annahme von Verbindungen signalisieren

196

5.5.1 Bereitschaftssonden

197

5.5.2 Einem Pod eine Bereitschaftssonde hinzufügen

198

5.5.3 Bereitschaftssonden in der Praxis

200

5.6 Headless-Dienste zur Ermittlung einzelner Pods

202

5.6.1 Einen headless-Dienst erstellen

202

5.6.2 Pods über DNS finden

203

5.6.3 Alle Pods finden – auch diejenigen, die nicht bereit sind

204

5.7 Fehlerbehebung bei Diensten

205

5.8 Zusammenfassung

206

6 Volumes: Festplattenspeicher zu Containern hinzufügen

207

6.1 Volumes

208

6.1.1 Ein Beispiel

208

6.1.2 Arten von Volumes

210

6.2 Gemeinsame Datennutzung durch die Container

211

6.2.1 emptyDir-Volumes

211

6.2.2 Ein Git-Repository als Ausgangspunkt für ein Volume verwenden

214

6.3 Zugriff auf Dateien im Dateisystem des Arbeitsknotens

217

6.3.1 HostPath-Volumes

218

6.3.2 Systempods mit hostPath-Volumes

218

6.4 Dauerhafte Speicherung

220

6.4.1 Eine GCE Persistent Disk in einem Pod-Volume

220

6.4.2 Andere Arten von Volumes mit zugrunde liegendem persistenten Speicher

223

6.5 Pods von der zugrunde liegenden Speichertechnologie entkoppeln

225

6.5.1 Persistente Volumes und Claims

225

6.5.2 Ein persistentes Volume erstellen

226

6.5.3 Mit einem Claim ein persistentes Volume beanspruchen

228

6.5.4 Einen Claim in einem Pod verwenden

230

6.5.5 Vorteile der Verwendung von persistenten Volumes und Claims

231

6.5.6 Persistente Volumes wiederverwenden

232

6.6 Persistente Volumes dynamisch bereitstellen

234

6.6.1 Die verfügbaren Speichertypen mit Speicherklassen definieren

234

6.6.2 Die Speicherklasse in einem Claim angeben

235

6.6.3 Dynamische Bereitstellung ohne Angabe einer Speicherklasse

237

6.7 Zusammenfassung

240

7 Konfigurationszuordnungen und Secrets: Anwendungen konfigurieren

243

7.1 Konfiguration von Anwendungen im Allgemeinen

243

7.2 Befehlszeilenargumente an Container übergeben

245

7.2.1 Den Befehl und die Argumente in Docker definieren

245

7.2.2 Den Befehl und die Argumente in Kubernetes überschreiben

247

7.3 Umgebungsvariablen für einen Container einrichten

249

7.3.1 Eine Umgebungsvariable in einer Containerdefinition festlegen

250

7.3.2 Im Wert einer Variablen auf andere Umgebungsvariablen verweisen

250

7.3.3 Die Nachteile hartkodierter Umgebungsvariablen

251

7.4 Die Konfiguration mit einer Konfigurationszuordnung entkoppeln

251

7.4.1 Einführung in Konfigurationszuordnungen

251

7.4.2 Eine Konfigurationszuordnung erstellen

253

7.4.3 Einen Konfigurationseintrag als Umgebungsvariable an einen Container übergeben

256

7.4.4 Alle Einträge einer Konfigurationszuordnung auf einmal als Umgebungsvariablen übergeben

257

7.4.5 Einen Konfigurationseintrag als Befehlszeilenargument übergeben

258

7.4.6 Konfigurationsdateien mithilfe eines configMap-Volumes verfügbar machen

259

7.4.7 Die Konfiguration einer Anwendung ohne Neustart ändern

265

7.5 Sensible Daten mithilfe von Geheimnissen an Container übergeben

267

7.5.1 Einführung in Geheimnisse

268

7.5.2 Das Geheimnis default-token

268

7.5.3 Ein Geheimnis erstellen

270

7.5.4 Unterschiede zwischen Konfigurationszuordnungen und Geheimnissen

271

7.5.5 Das Geheimnis in einem Pod verwenden

273

7.5.6 Geheimnisse zum Abrufen von Images

277

7.6 Zusammenfassung

278

8 Von Anwendungen aus auf Podmetadaten und andere Ressourcen zugreifen

279

8.1 Metadaten über die Downward-API übergeben

279

8.1.1 Die verwendbaren Metadaten

280

8.1.2 Metadaten über Umgebungsvariablen verfügbar machen

281

8.1.3 Metadaten über Dateien in einem downwardAPI-Volume übergeben

284

8.2 Kommunikation mit dem Kubernetes-API-Server

287

8.2.1 Die REST-API von Kubernetes

288

8.2.2 Von einem Pod aus mit dem API-Server kommunizieren

292

8.2.3 Botschaftercontainer zur Vereinfachung der Kommunikation mit dem API-Server

298

8.2.4 Clientbibliotheken zur Kommunikation mit dem API-Server

300

8.3 Zusammenfassung

303

9 Deployments: Anwendungen deklarativ aktualisieren

305

9.1 Anwendungen in Pods aktualisieren

306

9.1.1 Alte Pods löschen und anschließend durch neue ersetzen

307

9.1.2 Neue Pods starten und danach die alten löschen

307

9.2 Automatische schrittweise Aktualisierung mit einem Replikationscontroller

309

9.2.1 Die ursprüngliche Version der Anwendung ausführen

309

9.2.2 Die schrittweise Aktualisierung mit kubectl durchführen

311

9.2.3 Warum ist kubectl rolling-update veraltet?

315

9.3 Deployments zur deklarativen Verwaltung von Anwendungen

317

9.3.1 Ein Deployment erstellen

317

9.3.2 Ein Deployment aktualisieren

320

9.3.3 Eine Bereitstellung zurücknehmen

324

9.3.4 Die Rolloutrate festlegen

327

9.3.5 Den Rolloutvorgang anhalten

329

9.3.6 Das Rollout fehlerhafter Versionen verhindern

331

9.4 Zusammenfassung

336

10 StatefulSets: Replizierte statusbehaftete Anwendungen bereitstellen

337

10.1 Statusbehaftete Pods replizieren

337

10.1.1 Mehrere Replikate mit jeweils eigenem Speicher ausführen

338

10.1.2 Eine unveränderliche Identität für jeden Pod bereitstellen

339

10.2 Statussätze

341

10.2.1 Statussätze und Replikationssätze im Vergleich

341

10.2.2 Unveränderliche Netzwerkidentität

342

10.2.3 Eigenen beständigen Speicher für jede Podinstanz zuweisen

344

10.2.4 Garantien von Statussätzen

346

10.3 Statussätze nutzen

347

10.3.1 Die Anwendung und das Containerimage erstellen

347

10.3.2 Die Anwendung mithilfe eines Statussatzes bereitstellen

348

10.3.3 Die Pods untersuchen

353

10.4 Peers im Statussatz finden

357

10.4.1 Die Peer-Ermittlung über DNS einrichten

359

10.4.2 Einen Statussatz aktualisieren

360

10.4.3 Den Clusterdatenspeicher ausprobieren

361

10.5 Umgang mit Knotenausfällen

362

10.5.1 Die Trennung eines Knotens vom Netzwerk simulieren

362

10.5.2 Den Pod manuell löschen

364

10.6 Zusammenfassung

366

Teil III: Fortgeschrittene Themen

367

11 Interne Mechanismen von Kubernetes

369

11.1 Die Architektur

369

11.1.1 Die verteilte Natur der Kubernetes-Komponenten

370

11.1.2 Verwendung von etcd

373

11.1.3 Aufgaben des API-Servers

376

11.1.4 Benachrichtigungen des API-Servers über Ressourcenänderungen

378

11.1.5 Der Scheduler

380

11.1.6 Die Controller im Controller-Manager

382

11.1.7 Die Rolle des Kubelets

387

11.1.8 Die Rolle des Kubernetes-Dienstproxys

388

11.1.9 Kubernetes-Add-ons

389

11.1.10 Zusammenfassung

391

11.2 Kooperation der Controller

391

11.2.1 Die betroffenen Komponenten

391

11.2.2 Die Abfolge der Ereignisse

392

11.2.3 Clusterereignisse beobachten

394

11.3 Laufende Pods

395

11.4 Das Podnetzwerk

396

11.4.1 Anforderungen an das Netzwerk

396

11.4.2 Funktionsweise des Netzwerks

398

11.4.3 CNI

400

11.5 Implementierung von Diensten

400

11.5.1 Der Kube-Proxy

400

11.5.2 Iptables-Regeln

401

11.6 Cluster mit hoher Verfügbarkeit

403

11.6.1 Anwendungen hochverfügbar machen

403

11.6.2 Die Komponenten der Kubernetes-Steuerebene hochverfügbar machen

404

11.7 Zusammenfassung

407

12 Sicherheit des Kubernetes-API-Servers

409

12.1 Authentifizierung

409

12.1.1 Benutzer und Gruppen

410

12.1.2 Dienstkonten

411

12.1.3 Dienstkonten erstellen

412

12.1.4 Ein Dienstkonto mit einem Pod verknüpfen

414

12.2 Rollengestützte Zugriffssteuerung

416

12.2.1 Das RBAC-Autorisierungs-Plug-in

416

12.2.2 RBAC-Ressourcen

418

12.2.3 Rollen und Rollenbindungen

421

12.2.4 Clusterrollen und Clusterrollenbindungen

425

12.2.5 Standardclusterrollen und -clusterrollenbindungen

434

12.2.6 Berechtigungen bedachtsam gewähren

436

12.3 Zusammenfassung

437

13 Sicherheit der Clusterknoten und des Netzwerks

439

13.1 Die Namespaces des Hostknotens in einem Pod verwenden

439

13.1.1 Den Netzwerknamespace des Knotens in einem Pod verwenden

440

13.1.2 Bindung an einen Hostport ohne Verwendung des Host-Netzwerknamespace

441

13.1.3 Den PID- und den IPC-Namespace des Knotens verwenden

443

13.2 Den Sicherheitskontext eines Containers einrichten

444

13.2.1 Einen Container unter einer bestimmten Benutzer-ID ausführen

445

13.2.2 Die Ausführung eines Containers als root verhindern

446

13.2.3 Pods im privilegierten Modus ausführen

447

13.2.4 Einem Container einzelne Kernelfähigkeiten hinzufügen

448

13.2.5 Fähigkeiten von einem Container entfernen

450

13.2.6 Prozesse am Schreiben im Dateisystem des Containers hindern

451

13.2.7 Gemeinsame Nutzung von Volumes durch Container mit verschiedenen Benutzer-IDs

452

13.3 Die Bearbeitung der Sicherheitsmerkmale in einem Pod einschränken

454

13.3.1 Podsicherheitsrichtlinien

454

13.3.2 Die Richtlinien runAsUser, fsGroup und supplementalGroups

457

13.3.3 Zulässige, unzulässige und Standardfähigkeiten festlegen

459

13.3.4 Die verwendbaren Arten von Volumes einschränken

460

13.3.5 Benutzern und Gruppen unterschiedliche Podsicherheitsrichtlinien zuweisen

461

13.4 Das Podnetzwerk isolieren

464

13.4.1 Die Netzwerkisolierung in einem Namespace aktivieren

465

13.4.2 Einzelnen Pods im Namespace die Verbindung zu einem Serverpod erlauben

465

13.4.3 Das Netzwerk zwischen Kubernetes-Namespaces isolieren

466

13.4.4 Verwendung der CIDR-Schreibweise zur Isolierung

468

13.4.5 Den ausgehenden Datenverkehr von Pods einschränken

468

13.5 Zusammenfassung

469

14 Die Computerressourcen eines Pods verwalten

471

14.1 Ressourcen für die Container eines Pods anfordern

471

14.1.1 Pods mit Ressourcenanforderungen erstellen

472

14.1.2 Einfluss der Ressourcenanforderungen auf die Zuteilung zu Knoten

473

14.1.3 Der Einfluss der CPU-Anforderungen auf die CPU-Zeitzuteilung

478

14.1.4 Benutzerdefinierte Ressourcen definieren und anfordern

478

14.2 Die verfügbaren Ressourcen für einen Container einschränken

479

14.2.1 Harte Grenzwerte für die von einem Container verwendeten Ressourcen festlegen

479

14.2.2 Überschreiten der Grenzwerte

481

14.2.3 Grenzwerte aus der Sicht der Anwendungen in den Containern

482

14.3 QoS-Klassen für Pods

484

14.3.1 Die QoS-Klasse eines Pods festlegen

484

14.3.2 Auswahl des zu beendenden Prozesses bei zu wenig Speicher

487

14.4 Standardanforderungen und -grenzwerte für die Pods in einem Namespace festlegen

488

14.4.1 Der Grenzwertbereich

489

14.4.2 Einen Grenzwertbereich erstellen

490

14.4.3 Die Grenzwerte durchsetzen

491

14.4.4 Standardanforderungen und -grenzwerte anwenden

492

14.5 Die in einem Namespace insgesamt verfügbaren Ressourcen beschränken

493

14.5.1 Ressourcenkontingente

493

14.5.2 Kontingente für persistenten Speicher festlegen

495

14.5.3 Die Höchstzahl der Objekte in einem Namespace beschränken

496

14.5.4 Kontingente für einzelne Podstatus und QoS-Klassen festlegen

497

14.6 Die Ressourcennutzung der Pods überwachen

498

14.6.1 Die tatsächliche Ressourcennutzung erfassen

498

14.6.2 Verlaufsdaten des Ressourcenverbrauchs speichern und analysieren

500

14.7 Zusammenfassung

504

15 Automatische Skalierung von Pods und Clusterknoten

505

15.1 Automatische horizontale Podskalierung

506

15.1.1 Der Vorgang der automatischen Skalierung

506

15.1.2 Skalierung auf der Grundlage der CPU-Nutzung

509

15.1.3 Skalierung auf der Grundlage der Speichernutzung

516

15.1.4 Skalierung auf der Grundlage anderer Messgrößen

516

15.1.5 Geeignete Messgrößen für die automatische Skalierung auswählen

518

15.1.6 Herunterskalieren auf null Replikate

519

15.2 Automatische vertikale Podskalierung

519

15.2.1 Ressourcenanforderungen automatisch einrichten

519

15.2.2 Ressourcenanforderungen von laufenden Pods ändern

520

15.3 Horizontale Skalierung von Clusterknoten

520

15.3.1 Der Cluster-Autoskalierer

520

15.3.2 Den Cluster-Autoskalierer aktivieren

522

15.3.3 Die Unterbrechung von Diensten beim Herunterskalieren des Clusters minimieren

523

15.4 Zusammenfassung

525

16 Erweiterte Planung

527

16.1 Pods mithilfe von Mängeln und Tolerierungen von bestimmten Knoten fernhalten

527

16.1.1 Mängel und Tolerierungen

528

16.1.2 Einem Knoten benutzerdefinierte Mängel hinzufügen

530

16.1.3 Tolerierungen zu Pods hinzufügen

530

16.1.4 Verwendungszwecke für Mängel und Tolerierungen

531

16.2 Knotenaffinität

532

16.2.1 Feste Knotenaffinitätsregeln aufstellen

533

16.2.2 Knotenprioritäten bei der Zuteilung eines Pods

535

16.3 Pods mit Affinitäts- und Antiaffinitätsregeln auf denselben Knoten unter­bringen

538

16.3.1 Podaffinitätsregeln zur Bereitstellung von Pods auf demselben Knoten

539

16.3.2 Pods im selben Schaltschrank, in derselben Verfügbarkeitszone oder derselben geografischen Region bereitstellen

541

16.3.3 Präferenzen statt fester Regeln für die Podaffinität angeben

543

16.3.4 Pods mit Antiaffinitätsregeln voneinander getrennt halten

544

16.4 Zusammenfassung

546

17 Best Practices für die Anwendungsentwicklung

549

17.1 Das Gesamtbild

549

17.2 Der Lebenszyklus eines Pods

551

17.2.1 Beendigung und Verlegung von Anwendungen

551

17.2.2 Tote oder teilweise tote Pods neu bereitstellen

554

17.2.3 Pods in einer bestimmten Reihenfolge starten

555

17.2.4 Lebenszyklushooks

557

17.2.5 Pods herunterfahren

561

17.3 Die ordnungsgemäße Verarbeitung aller Clientanforderungen sicherstellen

565

17.3.1 Unterbrechungen von Clientverbindungen beim Hochfahren eines Pods verhindern

565

17.3.2 Unterbrechungen von Clientverbindungen beim Herunterfahren eines Pods verhindern

565

17.4 Einfache Ausführung und Handhabung von Anwendungen in Kubernetes

570

17.4.1 Einfach zu handhabende Containerimages erstellen

570

17.4.2 Images sauber kennzeichnen

571

17.4.3 Mehrdimensionale statt eindimensionaler Labels

571

17.4.4 Ressourcen mit Anmerkungen beschreiben

572

17.4.5 Gründe für die Beendigung eines Prozesses angeben

572

17.4.6 Anwendungsprotokolle

574

17.5 Empfohlene Vorgehensweisen für Entwicklung und Tests

576

17.5.1 Anwendungen während der Entwicklung außerhalb von Kubernetes ausführen

576

17.5.2 Minikube für die Entwicklung

577

17.5.3 Versionssteuerung und Manifeste zur automatischen Bereitstellung von Ressourcen

579

17.5.4 Ksonnet als Alternative zu YAML- und JSON-Manifesten

579

17.5.5 Continuous Integration und Continuous Delivery (CI/CD)

580

17.6 Zusammenfassung

581

18 Kubernetes erweitern

583

18.1 Eigene API-Objekte definieren

583

18.1.1 Eigene Ressourcendefinitionen

584

18.1.2 Benutzerdefinierte Ressourcen mit benutzerdefinierten Controllern automatisieren

588

18.1.3 Benutzerdefinierte Objekte validieren

592

18.1.4 Einen benutzerdefinierten API-Server für benutzerdefinierte Objekte bereitstellen

592

18.2 Kubernetes mit dem Kubernetes-Dienstkatalog erweitern

594

18.2.1 Der Dienstkatalog

595

18.2.2 Der API-Server des Dienstkatalogs und der Controller-Manager

596

18.2.3 Dienstbroker und die API OpenServiceBroker

597

18.2.4 Dienste bereitstellen und nutzen

598

18.2.5 Aufheben der Bindung und der Bereitstellung

601

18.2.6 Vorteile des Dienstkatalogs

601

18.3 Plattformen auf der Grundlage von Kubernetes

602

18.3.1 Die Containerplattform Red Hat OpenShift

602

18.3.2 Deis Workflow und Helm

605

18.4 Zusammenfassung

608

Anhang A: Verwendung von kubectl für mehrere Cluster

609

A.1 Umschalten zwischen Minikube und Google Kubernetes Engine

609

A.1.1 Umschalten zu Minikube

609

A.1.2 Umschalten zu GKE

609

A.2 Verwendung von kubectl für mehrere Cluster oder Namespaces

610

A.2.1 Den Speicherort der Konfigurationsdatei festlegen

610

A.2.2 Der Inhalt der Konfigurationsdatei

610

A.2.3 Konfigurationseinträge auflisten, hinzufügen und ändern

611

A.2.4 Verwendung von kubectl mit verschiedenen Clustern, Benutzern und Kontexten

613

A.2.5 Umschalten zwischen Kontexten

613

A.2.6 Kontexte und Cluster auflisten

614

A.2.7 Kontexte und Cluster löschen

614

Anhang B: Einen Cluster mit mehreren Knoten mit kubeadm erstellen

615

B.1 Das Betriebssystem und die erforderlichen Pakete einrichten

615

B.1.1 Die virtuelle Maschine erstellen

615

B.1.2 Den Netzwerkadapter für die VM einrichten

616

B.1.3 Das Betriebssystem installieren

617

B.1.4 Docker und Kubernetes installieren

620

B.1.5 Die VM klonen

621

B.2 Den Master mit kubeadm konfigurieren

623

B.2.1 Ausführung der Komponenten durch kubeadm

624

B.3 Arbeitsknoten mit kubeadm einrichten

625

B.3.1 Das Containernetzwerk einrichten

626

B.4 Vom lokalen Computer auf den Cluster zugreifen

627

Anhang C: Andere Containerlaufzeitumgebungen verwenden

629

C.1 Docker durch rkt ersetzen

629

C.1.1 Kubernetes zur Verwendung von rkt einrichten

629

C.1.2 rkt in Minikube ausprobieren

630

C.2 Andere Containerlaufzeiten über die CRI verwenden

632

C.2.1 CRI-O

632

C.2.2 Anwendungen in VMs statt in Containern ausführen

632

Anhang D: Clusterverbund

633

D.1 Der Kubernetes-Clusterverbund

633

D.2 Die Architektur

634

D.3 Verbund-API-Objekte

635

D.3.1 Verbundversionen der Kubernetes-Ressourcen

635

D.3.2 Funktionsweise von Verbundressourcen

636

Anhang E: Kubernetes-Ressourcen in diesem Buch

639

Index

643

 

© 2009-2018 ciando GmbH