Kubernetes-Architektur Teil 2 - API-Server, API Objects

Dies ist der zweite Teil des Artikels über Kubernetes Komponenten. In diesem Teil geht es hauptsächlich um den Kubernetes API Server und die dazugehörigen Komponenten; RESTful API, API Objects, API Group, API Versioning. 

API Server

Der API-Server ist eine Komponente eines Kubernetes-Clusters, die als zentrale Steuereinheit zwischen den verschiedenen Komponenten des Clusters und den Benutzern/Administratoren agiert. Die Konfiguration und Steuerung des Kubernetes-Clusters ist nur über den API-Server möglich. Der Kubernetes API-Server ist ein typisches Beispiel für die Client-Server-Architektur.

Kubernetes API-Server Architecture

Der API-Server selbst ist ein einzelner, in der Programmiersprache Go geschriebener Prozess. Der API-Server stellt eine RESTful API bereit, die für Authentifizierung, Autorisierung, Validierung, Zulassung, Ressourcenspeicherung, Informationsabruf sowie CRUD-Operationen (Create, Read, Update, Delete) verantwortlich ist.

Hier sind die Kernfunktionen der RESTful im erweiterten Überblick:

RESTful API

Im Allgemeinen ist eine RESTful API (Representational State Transfer) eine Softwarearchitektur, die es Systemen ermöglicht, über das Internet/Intranet per http miteinander zu kommunizieren und Ressourcen auszutauschen.

RESTful APIs basieren auf dem Konzept von Ressourcen. Eine Ressource ist ein Objekt (oft als Entität bezeichnet), auf das über eine eindeutige URL zugegriffen werden kann.

Der Client kann eine Anwendung, ein Skript oder ein System sein, das die API-Anfragen sendet. Der Kubernetes API-Server verarbeitet diese Anfragen. Dabei ist die RESTful API zustandslos, das bedeutet, dass keine Informationen über vorherige Anfragen speichert werden.

In einem Kubernetes-Cluster gibt es viele verschiedene Arten von Ressourcen, wie z.B. Pods, Deployments, Services und ConfigMaps. Jede dieser Ressourcen hat ihre eigene spezielle URL, über die man sie in der API aufrufen kann.

Die häufigsten http-Methoden in Kubernetes sind (die kursiv markierten Methoden gelten als speziell):

  • GET - eine Ressource abrufen oder Informationen darüber erhalten
  • POST - eine neue Ressource erstellen
  • PUT - eine vorhandene Ressource aktualisieren oder ersetzen
  • DELETE - eine vorhandene Ressource löschen
  • PATCH - die angegebenen Felder einer Ressource ändern
  • LOG - abrufen von Protokollen aus einem Container in einem Pod
  • EXEC - ausführen eines Befehls in einem Container und Abrufen der Ausgabe
  • WATCH - Änderungsbenachrichtigungen für eine Ressource mit Streaming-Ausgabe

kubectl api-resources

kubectl api-resources - zeigt die Ressourcen zusammen mit ihren Kurznamen, API-Gruppen und ob sie in einem bestimmten Namespace verfügbar oder clusterweit verfügbar sind.

kubectl api resources

 

Authentifizierung, Autorisierung, Validierung und Zulassung

Authentifizierung

Der API-Server ist verantwortlich für die Authentifizierung von Benutzern und Komponenten, die auf den Kubernetes Cluster zugreifen möchten. Der API-Server stellt sicher, dass nur authentifizierte Benutzer und Komponenten auf die Ressourcen zugreifen dürfen.

Autorisierung

Nach der Authentifizierung eines Benutzers oder einer Komponente prüft der API-Server, ob diese berechtigt sind, die angeforderte Aktion auf der angegebenen Ressource auszuführen. Der API-Server kann sowohl Role-Based Access Control (RBAC) als auch Attribute-Based Access Control (ABAC) verwenden, wobei RBAC die empfohlene und standardmäßige Methode ist.

Validierung

Der API-Server validiert eingehende API-Anfragen, nachdem diese authentifiziert und autorisiert wurden. Der API-Server überprüft, ob die in der Anfrage enthaltenen Daten korrekt formatiert sind und alle erforderlichen Felder enthalten. Wenn die Anfrage die Validierung nicht besteht, wird sie abgelehnt und der Client erhält eine Fehlermeldung.

Zulassung

Nachdem eine Anfrage die Validierung bestanden hat, durchläuft sie den Zulassungsprozess. Der API-Server kann auch zusätzlichen Kontrollen durchführen und möglicherweise die Anpassungen vornehmen. z.B. an dieser Stelle sind die "Admission Webhooks" (ValidatingAdmissionWebhook, MutatingAdmissionWebhook) integriert.

Anschließend werden die Anfragen, die  authentifiziert, autorisiertvalidiert und zugelassen wurden, die Ressourcen und ihr Status in der ETCD gespeichert.

 

Informationsaustausch mit ETCD

Die Kommunikation mit der Datenbank (ETCD) gehört ebenfalls zu der Kernaufgaben der API-Server. In diesem Fall ist der API-Server für diese Aufgaben verantwortlich:  Lesen von Daten, Schreiben von Daten und Beobachten von Änderungen.

Lesen von Daten

Wenn eine Komponente (oder ein Benutzer über kubectl) den Zustand einer Ressource abfragen möchte, sendet sie eine Anfrage an den API-Server. Der API-Server liest dann die entsprechenden Daten aus ETCD und sendet sie an den Anfragenden zurück.

Schreiben von Daten

Wenn eine Komponente den Zustand einer Ressource ändern möchte, sendet sie eine Anfrage an den API-Server. Der API-Server validiert die Anfrage und schreibt die Änderungen in der ETCD.

Beobachten von Änderungen

Viele Komponenten in Kubernetes müssen auf Änderungen an bestimmten Ressourcen reagieren. Dies passiert, indem sie den API-Server auffordern, sie über Änderungen zu informieren. Der API Server hält eine Verbindung zu ETCD und wird über Änderungen informiert, die er danach an die beobachtenden Komponenten weiterleitet.

 

Skalierbarkeit, Erweiterbarkeit, Versionskontrolle

Skalierbarkeit, Erweiterbarkeit und Versionskontrolle sind weitere Eigenschaften des API-Servers.

Skalierbarkeit. Die Architektur des API-Servers ermöglicht eine horizontale Skalierung, um sowohl die Leistung als auch die Verfügbarkeit zu erhöhen. 

Erweiterbarkeit. Der API-Server ist erweiterbar und kann mit zusätzlichen Funktionen ausgestattet werden, ohne dass der Kern des API-Servers verändert werden muss. Die wohl bekannteste Möglichkeit ist die Verwendung von Custom Resource Definitions (CRDs). Die CRDs bieten die Möglichkeit, neue Ressourcentypen zu definieren, die der API-Server verstehen kann. Weitere Methoden sind Aggregated APIs, Admission Controllers, API Extensions und Webhooks.

Versionskontrolle. Der API-Server unterstützt die Versionskontrolle für die APIs, und ermöglicht damit die Abwärtskompatibilität. Mehr dazu unten im Abschnitt: API Groups

 

API Objects

Die API-Objekte sind die grundlegenden Einheiten (in der offiziellen Dokumentation als Persistent Entities bezeichnet), mit denen Kubernetes interagiert und die den Zustand des Kubernetes-Clusters repräsentieren. 

Die API Objekte: 

  • repräsentieren und definieren den Zustand des Kubernetes-Clusters
  • stellen alles dar, was in einem Kubernetes-Cluster existiert
  • dienen als Basis, um den aktuellen Zustand mit dem gewünschten Zustand zu vergleichen
  • dienen als Schnittstelle zwischen dem Benutzer und dem Kubernetes-System
  • werden im YAML- oder JSON-Format beschrieben
  • können über die Kubernetes API oder über kubectl erstellt, aktualisiert und gelöscht werden

"Kubernetes API-Objekte sind auf drei Arten organisiert" bezieht sich auf die Struktur und Kategorisierung von API-Objekten innerhalb von Kubernetes. Hier sind die drei Arten, wie sie organisiert sind: Kind, API-Group und API-Version

Kind

Kind - ist ein String-Wert, der den Typ des API-Objekts darstellt. In Kubernetes gibt es keine feste Anzahl von Kind-Typen. Die Anzahl der verfügbaren Ressourcentypen hängt von den installierten Erweiterungen, benutzerdefinierten Ressourcen und der verwendeten Version von Kubernetes ab.

Hier sind die häufig verwendete "Kind"-Typen, die in den meisten Kubernetes-Clustern vorhanden sind:

Pod DaemonSet  PersistentVolume  Node
Service Job PersistentVolumeClaim  Role
Deployment  CronJob StorageClass ClusterRole
ReplicaSet ConfigMap Ingress RoleBinding
StatefulSet Secret Namespace ClusterRoleBinding 

 

API Groups

API-Gruppen ermöglichen eine bessere Organisation von Ressourcen in der Kubernetes-API, d.h. eine logische Strukturierung und Trennung voneinander.

Es gibt zwei Organisationsmethoden für API-Gruppen in Kubernetes: Core API-Gruppen und Named API-Gruppen.

Core-API-Groups

Die erste ist die Core API Group oder Legacy API Group. Diese Gruppe enthält Objekte, die zum Aufbau der grundlegendsten Ressourcen (wie Pods, Services und Nodes) verwendet werden. Als Kubernetes entwickelt wurde, gab es noch kein Konzept für API-Gruppen.

Named API-Groups

Mit der Weiterentwicklung von Kubernetes wuchs die Notwendigkeit, die neuen Objekte zu klassifizieren. So entstanden die „Named API Groups“. Ein typisches Beispiel für eine Named API Group finden Sie in der folgenden Tabelle. Sie werden auch feststellen, dass bei den neueren Named API Groups der Name der API Group auch Teil des URL Pfades wird.

API-Gruppe API-Objekte
Core-API (v1) Pod, Service, Volume, Namespace, Node, Event, Secret, ConfigMap, PersistentVolume, PersistentVolumeClaim
Named-API-Groups:
apps Deployment, DaemonSet, ReplicaSet, StatefulSet
batch Job, CronJob
extensions Ingress
rbac.authorization.k8s.io Role, RoleBinding, ClusterRole, ClusterRoleBinding
admissionregistration.k8s.io MutatingWebhookConfiguration, ValidatingWebhookConfiguration
apiextensions.k8s.io CustomResourceDefinition
networking.k8s.io NetworkPolicy
storage.k8s.io StorageClass, VolumeAttachment

Um die API-Gruppen und ihre Versionen zu verwenden, müssen Sie den vollständigen Pfad einer API-Ressource angeben. Der Pfad setzt sich aus der API-Gruppe, der Version und der Ressource selbst zusammen. Zum Beispiel: /apis/apps/v1/deployments

Weitere Information: https://kubernetes.io/docs/reference/kubernetes-api/

API Resource Location - Beispiele

Beispiele für URL-Pfade für Ressourcen in der Kubernetes-API:

Core API - URLs

  • Pod:  http://apiserver:port/api/v1/namespaces/{namespace}/pods/{pod-name}
  • Service:  http://apiserver:port/api/v1/namespaces/{namespace}/services/{service-name}
  • Volume: http://apiserver:port/api/v1/persistentvolumes/{volume-name}

Named API Groups - URLs

  • Deployment
    • Gruppe "apps"
    • http://apiserver:port/apis/apps/v1/namespaces/{namespace}/deployments/{deployment-name}
  • NetworkPolicy
    • Gruppe "networking.k8s.io"
    • http://apiserver:port/apis/networking.k8s.io/v1/namespaces/{namespace}/networkpolicies/{networkpolicy-name}
  • Role
    • Gruppe "rbac.authorization.k8s.io"
    • http://apiserver:port/apis/rbac.authorization.k8s.io/v1/namespaces/{namespace}/roles/{role-name}

{namespace} steht für den Namen des Namespaces
{pod-name}, {service-name}, {volume-name}, {deployment-name}, {networkpolicy-name} und {role-name} stehen für die Namen der Ressourcen

 

API Versioning

Die Kubernetes-API unterstützt verschiedene API-Versionen. Mehrere Versionen der Kubernetes-API können gleichzeitig auf einem Server vorhanden sein. Die API-Versionierung ermöglicht sowohl Abwärts- als auch Aufwärtskompatibilität, d.h. wir können die API-Version des Objekts, mit dem wir arbeiten wollen, in unserem YAML-Manifest angeben.

Während der Entwicklung durchläuft die API-Version drei Phasen des Entwicklungsprozesses: Alpha (V1alpha1) > Beta (V1beta1) > Stable (v1):

Alpha. Die Alpha-Version (experimental) ist die erste Entwicklungsstufe und enthält neue Funktionen, die sich noch in der Entwicklung befinden. Diese Funktionen können noch fehlerhaft sein und werden im Laufe der Zeit geändert oder entfernt.

Beta. Die Beta-Version (pre release) ist die zweite und stabilere Entwicklungsstufe als die Alpha-Version. In der Beta-Version wurden die Funktionen bereits getestet und verbessert. Änderungen an den Funktionen sind noch möglich.

Stable. Die stabile Version (General Availability (GA)) ist die letzte Entwicklungsstufe und enthält ausführlich getestete Funktionen. In dieser Version gibt es in der Regel keine Änderungen mehr, sondern nur noch Fehlerbehebungen oder Sicherheitsupdates.

Die API-Versionen werden in der YAML-Konfigurationsdatei für Ressourcen und Workloads angegeben. Wenn eine Funktion als Alpha oder Beta gekennzeichnet ist, sollte sie verständlicherweise nur zu Entwicklungs- oder Testzwecken verwendet werden.

 

HTTP-Antwortcodes vom API-Server

Die folgende Tabelle enthält einige der häufigsten HTTP-Antwortcodes, die von einem Kubernetes-API-Server empfangen werden können:

HTTP-StatuscodeBedeutung
200 OK Die Anfrage war erfolgreich. Die Antwort des Servers enthält die angeforderten Daten.
201 Created Die Anfrage war erfolgreich. Eine neue Ressource wurde erstellt.
202 Accepted Die Anfrage wurde akzeptiert und wird verarbeitet. Die Verarbeitung ist noch nicht abgeschlossen.
204 No Content Die Anfrage war erfolgreich. Kein Inhalt vom Server zurückgegeben.
400 Bad Request Die Anfrage konnte aufgrund einer ungültigen Syntax nicht verstanden werden.
401 Unauthorized Die Anfrage erfordert eine Benutzerauthentifizierung.
403 Forbidden Der Server hat die Anfrage verstanden. Er weigert sich jedoch, sie auszuführen.
404 Not Found Die angeforderte Ressource wurde auf dem Server nicht gefunden.
409 Conflict Anfrage konnte aufgrund eines Konflikts mit dem aktuellen Ressourcenstatus nicht abgeschlossen werden.
500 Internal Server Error Ein allgemeiner Fehler ist aufgetreten.

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern (Tracking Cookies). Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.