Buchen Sie Kubernetes für DevOps

BildHallo habrozhiteli! Kubernetes ist eines der Schlüsselelemente des modernen Cloud-Ökosystems. Diese Technologie bietet die Zuverlässigkeit, Skalierbarkeit und Ausfallsicherheit der Containervirtualisierung. John Arundel und Justin Domingus sprechen über das Kubernetes-Ökosystem und stellen bewährte Lösungen für alltägliche Probleme vor. Schritt für Schritt erstellen Sie Ihre eigene Cloud-basierte Anwendung und erstellen die Infrastruktur, um diese zu unterstützen, konfigurieren die Entwicklungsumgebung und die Pipeline für die kontinuierliche Bereitstellung, die für Sie bei der Arbeit an den folgenden Anwendungen hilfreich ist.

• Beginnen Sie mit Containern und Kubernetes von Grund auf neu: Zum Erlernen des Themas sind keine besonderen Vorkenntnisse erforderlich. • Starten Sie Ihre eigenen Cluster oder wählen Sie einen verwalteten Kubernetes-Dienst von Amazon, Google usw. aus. • Verwenden Sie Kubernetes, um den Containerlebenszyklus und den Ressourcenverbrauch zu verwalten. • Optimieren Sie Cluster hinsichtlich Kosten, Leistung, Ausfallsicherheit, Leistung und Skalierbarkeit. • Lernen Sie die besten Tools zum Entwickeln, Testen und Bereitstellen Ihrer Anwendungen kennen. • Nutzen Sie die aktuellen Branchenpraktiken für Sicherheit und Kontrolle. • Implementieren Sie DevOps-Prinzipien in Ihrem Unternehmen, damit Entwicklungsteams flexibler, schneller und effizienter werden.

Für wen ist das Buch?


Das Buch ist am relevantesten für Mitarbeiter der Verwaltungsabteilungen, die für Server, Anwendungen und Dienste verantwortlich sind, sowie für Entwickler, die entweder neue Cloud-Dienste erstellen oder vorhandene Anwendungen auf Kubernetes und die Cloud migrieren. Machen Sie sich keine Sorgen, Sie müssen nicht wissen, wie Sie mit Kubernetes und Containern arbeiten - wir bringen Ihnen alles bei.

Erfahrene Kubernetes-Benutzer werden ebenfalls viel zu entdecken finden: Themen wie RBAC, kontinuierliche Bereitstellung, Verwaltung sensibler Daten und Beobachtbarkeit werden ausführlich behandelt. Wir hoffen, dass die Seiten des Buches sicherlich etwas Interessantes für Sie haben, unabhängig von Ihren Fähigkeiten und Erfahrungen.

Welche Fragen beantwortet das Buch?


Während der Planung und des Schreibens des Buches diskutierten wir mit Hunderten von Menschen über Cloud-Technologien und Kubernetes, sprachen mit Führungskräften und Experten der Branche sowie mit absoluten Anfängern. Im Folgenden finden Sie einzelne Fragen, auf die sie in dieser Veröffentlichung Antworten erhalten möchten.

  • „Ich bin daran interessiert, warum Zeit für diese Technologie aufgewendet werden sollte. Welche Probleme wird sie mir und meinem Team bei der Lösung helfen? “
  • „Kubernetes scheint interessant zu sein, hat aber eine ziemlich hohe Einstiegsschwelle. Das Vorbereiten eines einfachen Beispiels ist nicht schwierig, aber die weitere Verwaltung und das Debuggen sind beängstigend. "Wir möchten verlässliche Ratschläge dazu erhalten, wie Menschen Kubernetes-Cluster im wirklichen Leben verwalten und auf welche Probleme wir wahrscheinlich stoßen."
  • „Subjektive Ratschläge wären hilfreich. Das Kubernetes-Ökosystem bietet Anfängerteams zu viele Optionen zur Auswahl. Wenn dasselbe auf verschiedene Arten getan werden kann, wie kann man dann verstehen, welches besser ist? Wie treffe ich eine Wahl? “

Und wahrscheinlich die wichtigste aller Fragen:

  • "Wie kann ich Kubernetes verwenden, ohne mein Unternehmen zu stören?"

Auszug. Konfiguration und geheime Objekte


Die Möglichkeit, die Logik der Kubernetes-Anwendung von ihrer Konfiguration zu trennen (dh von Werten oder Einstellungen, die sich im Laufe der Zeit ändern können), ist sehr nützlich. Zu den Konfigurationswerten gehören normalerweise Einstellungen für eine bestimmte Umgebung, DNS-Adressen von Diensten von Drittanbietern und Anmeldeinformationen für die Authentifizierung.

Natürlich kann all dies direkt in den Code eingefügt werden, aber dieser Ansatz ist nicht flexibel genug. Um beispielsweise den Konfigurationswert zu ändern, müssen Sie Ihren Code neu zusammenstellen und bereitstellen. Eine viel bessere Lösung wäre, die Konfiguration vom Code zu trennen und sie aus den Datei- oder Umgebungsvariablen zu lesen.

Kubernetes bietet verschiedene Möglichkeiten zur Verwaltung Ihrer Konfiguration. Zunächst können Sie Werte über die in der Spezifikation der Pod-Shell angegebenen Umgebungsvariablen an die Anwendung übergeben (siehe Abschnitt "Umgebungsvariablen" auf Seite 219). Zweitens können Konfigurationsdaten mithilfe der Objekte ConfigMap und Secret direkt in Kubernetes gespeichert werden.

In diesem Kapitel werden wir diese Objekte im Detail untersuchen und einige praktische Ansätze zum Verwalten von Konfigurations- und vertraulichen Daten anhand einer Beispiel-Demo-Anwendung betrachten.

Aktualisieren von Pod-Shells beim Ändern von Konfigurationen


Stellen Sie sich vor, Ihr Cluster verfügt über eine Bereitstellung und Sie möchten einige Werte in der ConfigMap ändern. Wenn Sie das Helm-Diagramm verwenden (siehe Abschnitt „Helm: Paketmanager für Kubernetes“ auf Seite 102), können Sie eine Konfigurationsänderung erkennen und Ihre Pod-Shells automatisch mit einem eleganten Trick neu starten. Fügen Sie Ihrer Bereitstellungsspezifikation die folgende Anmerkung hinzu:

checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") .
       | sha256sum }}

Jetzt enthält die Bereitstellungsvorlage die Prüfsumme der Konfigurationsparameter: Wenn die Parameter geändert werden, wird die Summe aktualisiert. Wenn Sie den Befehl helm upgrade ausführen, stellt Helm fest, dass sich die Bereitstellungsspezifikation geändert hat, und startet alle Pod-Shells neu.

Vertrauliche Daten bei Kubernetes


Wir wissen bereits, dass das ConfigMap-Objekt einen flexiblen Mechanismus zum Speichern und Zugreifen auf Konfigurationsdaten in einem Cluster bietet. Die meisten Anwendungen verfügen jedoch über geheime und vertrauliche Informationen, z. B. Kennwörter oder API-Schlüssel. Es kann auch in ConfigMap gespeichert werden, eine solche Lösung ist jedoch nicht ideal.

Stattdessen bietet Kubernetes einen speziellen Objekttyp zum Speichern vertraulicher Daten an: Secret. Als nächstes betrachten wir ein Beispiel, wie dieses Objekt in unserer Demo-Anwendung angewendet werden kann.

Schauen Sie sich zunächst das Kubernetes-Manifest für das Secret-Objekt an (siehe hello-secret-env / k8s / secret.yaml):

apiVersion: v1
kind: Secret
metadata:
    name: demo-secret
stringData:
    magicWord: xyzzy

In diesem Beispiel lautet der private Schlüssel von magicWord xyzzy (en.wikipedia.org/wiki/Xyzzy_(computing)). Das Wort xyzzy ist in der Welt der Computer im Allgemeinen sehr nützlich. Ähnlich wie bei ConfigMap können Sie viele Schlüssel und Werte in ein geheimes Objekt einfügen. Hier verwenden wir der Einfachheit halber nur ein Schlüssel-Wert-Paar.

Geheime Objekte als Umgebungsvariablen verwenden


Wie ConfigMap kann das Secret-Objekt im Container als Umgebungsvariablen oder als Datei auf seiner Festplatte verfügbar gemacht werden. Im folgenden Beispiel weisen wir der Umgebungsvariablen den Wert von Secret zu:

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-env
          ports:
             - containerPort: 8888
          env:
             - name: GREETING
               valueFrom:
               secretKeyRef:
                  name: demo-secret
                  key: magicWord


Führen Sie den folgenden Befehl im Demo-Repository aus, um Manifeste anzuwenden:

kubectl apply -f hello-secret-env/k8s/
deployment.extensions "demo" configured
secret "demo-secret" created

Leiten Sie den lokalen Port wie zuvor zur Bereitstellung um, um das Ergebnis in Ihrem Browser anzuzeigen:

kubectl port-forward deploy/demo 9999:8888
Forwarding from 127.0.0.1:9999 -> 8888
Forwarding from [::1]:9999 -> 8888

Wenn Sie die localhost- Adresse öffnen : 9999 / sollte Folgendes angezeigt werden:

The magic word is "xyzzy"

Geheime Objekte in Dateien schreiben


In diesem Beispiel hängen wir das Secret-Objekt als Datei an den Container an. Der Code befindet sich im Ordner "Hello-Secret-File" des Demo-Repositorys.

Um Secret als Datei zu verbinden, verwenden wir die folgende Bereitstellung:

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-file
          ports:
              - containerPort: 8888
          volumeMounts:
              - name: demo-secret-volume
                mountPath: "/secrets/"
                readOnly: true
   volumes:
      - name: demo-secret-volume
        secret:
           secretName: demo-secret

Wie im Unterabschnitt „Konfigurationsdateien aus ConfigMap-Objekten erstellen“ auf S. 22. 240 erstellen wir ein Volume (in diesem Fall das Demo-Secret-Volume) und verbinden es mit dem Container im Abschnitt "volumeMounts-Spezifikation". MountPath ist / Secrets, daher erstellt Kubernetes eine Datei für jedes Schlüssel-Wert-Paar, das im Secret-Objekt in diesem Ordner definiert ist.

In unserem Beispiel haben wir nur ein Schlüssel-Wert-Paar mit dem Namen magicWord definiert, sodass das Manifest eine einzelne Datei / secret / magicWord mit vertraulichen Daten in dem schreibgeschützten Container erstellt.

Wenn Sie dieses Manifest auf dieselbe Weise wie im vorherigen Beispiel anwenden, sollten Sie dasselbe Ergebnis erhalten:

The magic word is "xyzzy"

Geheime Objekte lesen


Im vorherigen Abschnitt haben wir den Befehl kubectl description verwendet, um den Inhalt von ConfigMap anzuzeigen. Kannst du dasselbe mit Secret machen?

kubectl describe secret/demo-secret
Name:          demo-secret

Namespace:      default
Labels:             <none>
Annotations:
Type:               Opaque

Data
====
magicWord: 5   bytes

Bitte beachten Sie, dass die Daten selbst nicht angezeigt werden. Geheime Objekte in Kubernetes sind vom Typ Opaque: Dies bedeutet, dass ihr Inhalt nicht in der Ausgabe von kubectl description, Journaleinträgen und dem Terminal angezeigt wird, sodass es unmöglich ist, vertrauliche Informationen versehentlich offenzulegen.

Verwenden Sie den Befehl kubectl get, um die codierte Version vertraulicher Daten im YAML-Format anzuzeigen:

kubectl get secret/demo-secret -o yaml
apiVersion: v1
data:
   magicWord: eHl6enk=
kind: Secret
metadata:
...
type: Opaque

base64


Was ist eHl6enk =, was sich völlig von unserem ursprünglichen Wert unterscheidet? Dies ist eigentlich ein geheimes Objekt, das in der Base64-Codierung dargestellt wird. Base64 ist ein Codierungsschema für beliebige Binärdaten als Zeichenfolge.

Da vertrauliche Informationen möglicherweise binär sind und für die Ausgabe nicht zugänglich sind (wie beispielsweise im Fall des TLS-Verschlüsselungsschlüssels), werden geheime Objekte immer im base64-Format gespeichert.

Der Text beHl6enk = ist die base64-codierte Version unseres geheimen Wortes xyzzy. Sie können dies überprüfen, wenn Sie den Befehl base64 --decode im Terminal ausführen:

echo "eHl6enk=" | base64 --decode
xyzzy

Trotz der Tatsache, dass Kubernetes Sie vor dem versehentlichen Anzeigen vertraulicher Daten in einem Terminal oder in Protokolldateien schützt, können diese Daten im base64-Format empfangen und anschließend dekodiert werden, wenn Sie das Recht haben, geheime Objekte in einem bestimmten Namespace zu lesen.

Wenn Sie Text in base64 codieren müssen (z. B. um ihn geheim zu halten), verwenden Sie den Befehl base64 ohne Argumente:

echo xyzzy | base64
eHl6enkK

Zugriff auf geheime Objekte


Wer kann geheime Objekte lesen und bearbeiten? Dies wird durch RBAC, den Zugriffskontrollmechanismus, festgelegt (wir werden dies im Abschnitt „Einführung in die rollenbasierte Zugriffskontrolle“ auf Seite 258 ausführlich erläutern). Wenn Sie einen Cluster verwenden, in dem das RBAC-System fehlt oder nicht aktiviert ist, können Benutzer und Container auf alle Ihre geheimen Objekte zugreifen (wir werden später erklären, dass Sie keinen industriellen Cluster ohne RBAC haben sollten).

Passive Datenverschlüsselung


Was ist mit denen, die Zugriff auf die etcd-Datenbank haben, in der Kubernetes alle Informationen speichert? Können sie vertrauliche Daten lesen, ohne das Recht zu haben, geheime Objekte über die API zu lesen?

Ab Version 1.7 unterstützt Kubernetes die passive Datenverschlüsselung. Dies bedeutet, dass die vertraulichen Informationen in etcd in verschlüsselter Form auf der Festplatte gespeichert sind und auch von Personen, die direkten Zugriff auf die Datenbank haben, nicht gelesen werden können. Zum Entschlüsseln benötigen Sie einen Schlüssel, über den nur der Kubernetes-API-Server verfügt. In einem ordnungsgemäß konfigurierten Cluster muss die passive Verschlüsselung aktiviert sein.

Überprüfen Sie Folgendes, ob die passive Verschlüsselung in Ihrem Cluster funktioniert:

kubectl describe pod -n kube-system -l component=kube-apiserver |grep encryption
        --experimental-encryption-provider-config=...

Wenn das Flag "Experimental-Encryption-Provider-Config" nicht angezeigt wird, ist die passive Verschlüsselung nicht aktiviert. Wenn Sie die Google Kubernetes Engine oder andere Kubernetes-Verwaltungsdienste verwenden, werden Ihre Daten mit einem anderen Mechanismus verschlüsselt, sodass das Flag fehlt. Erkundigen Sie sich bei Ihrem Kubernetes-Anbieter, ob der Inhalt von etcd verschlüsselt ist.

Vertrauliche Datenspeicherung


Es gibt Kubernetes-Ressourcen, die niemals aus einem Cluster entfernt werden sollten: zum Beispiel besonders wichtige geheime Objekte. Sie können die Ressource mithilfe der von Helm Manager bereitgestellten Anmerkung vor dem Löschen schützen:

kind: Secret
metadata:
    annotations:
        "helm.sh/resource-policy": keep

Strategien zur Verwaltung geheimer Objekte


Im Beispiel aus dem vorherigen Abschnitt wurden vertrauliche Daten unmittelbar nach dem Speichern im Cluster vor unbefugtem Zugriff geschützt. In den Manifestdateien wurden sie jedoch im Klartext gespeichert.

Sie sollten niemals vertrauliche Informationen in Dateien ablegen, die sich im Versionskontrollsystem befinden. Wie können diese Informationen sicher verwaltet und gespeichert werden, bevor sie auf einen Kubernetes-Cluster angewendet werden?

Sie können beliebige Tools oder Strategien für die Arbeit mit vertraulichen Daten in Ihren Anwendungen auswählen, müssen jedoch mindestens die folgenden Fragen beantworten.

  • Wo sollen sensible Daten gespeichert werden, damit sie leicht zugänglich sind?
  • Wie stellen Sie vertrauliche Daten Ihren aktiven Anwendungen zur Verfügung?
  • , ?


John Arundel ist ein Berater mit 30 Jahren Erfahrung in der Computerindustrie. Er hat mehrere Bücher geschrieben und arbeitet mit vielen Unternehmen aus verschiedenen Ländern zusammen, um sie in Bezug auf Cloud-basierte Infrastruktur und Kubernetes zu beraten. In seiner Freizeit surft er gerne, schießt eine gute Pistole und spielt amateurhaft Klavier. Lebt in einem fabelhaften Häuschen in Cornwall, England.

Justin Domingus ist ein Systemadministrator, der in einer DevOps-Umgebung mit Kubernetes und Cloud-Technologien arbeitet. Er verbringt gerne Zeit im Freien, trinkt Kaffee, fängt Krabben und sitzt am Computer. Lebt in Seattle, Washington, zusammen mit einer wundervollen Katze und einer noch wundervolleren Frau und Teilzeit-besten Freundin Adrienne.

»Weitere Informationen zum Buch finden Sie auf der Website des Herausgebers.
» Inhalt
» Auszug

für Khabrozhiteley 25% Rabatt auf den Gutschein - Kubernetes

Nach Zahlung der Papierversion des Buches wird ein E-Book per E-Mail verschickt.

All Articles