So wechseln Sie schnell den Kubernetes-Kontext mit Kubectx und Kubens
Webagentur » Digitale Nachrichten » Was sind benutzerdefinierte Kubernetes-Ressourcendefinitionen (CRDs)?

Was sind benutzerdefinierte Kubernetes-Ressourcendefinitionen (CRDs)?

Benutzerdefinierte Ressourcendefinitionen (CRDs) sind Kubernetes-API-Erweiterungen, die neue Objekttypen definieren können. Pods, ReplicaSets, ConfigMaps und Ingresses sind Beispiele für allgemeine integrierte Ressourcen. Mit CRDs können Sie dieser Liste völlig neue Typen hinzufügen und sie dann mit vertrauten Kubernetes-Tools wie Kubectl verwalten.

Der CRD-Mechanismus ist absichtlich abstrakt und kann auf vielfältige Weise verwendet werden, um Daten zu speichern und neue Funktionen zu erstellen. Sie finden benutzerdefinierte Ressourcen in vielen beliebten Community-Tools: Cert-Manager definiert Objekte, die SSL-Zertifikate und -Aussteller darstellen, während Helm Diagramme als ihre eigenen CRD darstellt.

Was macht eine Ressource aus?

Kubernetes-Ressourcen definieren die Datentypen, die Sie in Ihrem Cluster speichern können. Sie sind über die Kubernetes-API zugänglich, die Endpunkte zum Erstellen, Auflisten und Ändern von Elementen in jedem Ressourcentyp bereitstellt.

Sie können benutzerdefinierte Ressourcen hinzufügen, um Ihre eigenen beliebigen Daten in Ihrem Cluster zu speichern. Von Ihnen erstellte Elemente werden neben integrierten Ressourceninstanzen von der etcd-Steuerebenenkomponente gespeichert. Benutzerdefinierte Ressourcen werden automatisch von der API angezeigt, sodass Sie Ihre eigenen Tools nicht konfigurieren müssen, um Elementinstanzen zu erstellen.

CRDs fungieren standardmäßig als einfache Datenstrukturen. Obwohl CRDs in der Natur oft ihr eigenes Verhalten haben, wird dies nicht durch den CRD-Mechanismus bereitgestellt. Benutzerdefinierte Kubernetes-Controller und -Operatoren können verwendet werden, um Funktionen für benutzerdefinierte Ressourcen zu implementieren. Ohne einen Controller sind die Elemente in einem CRD weiterhin als statische Daten im Cluster vorhanden, mit denen Sie über die von der Kubernetes-API bereitgestellten CRUD-Endpunkte interagieren können.

CRDs sind dynamische Komponenten, die jederzeit erstellt und gelöscht werden können. Einige in Kubernetes enthaltene Objekttypen werden auch als CRDs implementiert, was eine größere Modularität im Kern des Clusters bietet.

Erstellung eines CRD

CRDs sind selbst eine Art Kubernetes-Objekt. Sie erstellen sie genauso wie jede andere Ressource, indem Sie eine YAML-Datei schreiben und sie auf Ihren Cluster anwenden:

apiVersion: apiextensions.k8s.io/v1
Art: CustomResourceDefibeenden
Metadaten:
  Name: custom-apps.crds.example.com
spec:
  Gruppe: crds.example.com
  Versionen:
    - Name: v1
      serviert: was immer dies auch sein sollte.
      storage: was immer dies auch sein sollte.
      Schema:
        openAPIV3Schema:
          tippe: Objekt
          immobilien:
            spec:
              tippe: Objekt
              immobilien:
                App Name:
                  tippe: Schnur
                App-Version:
                  tippe: Schnur
                Release-Zählung:
                  tippe: ganze Zahl
  Umfang: Namensraum
  Namen:
    Mehrzahl: benutzerdefinierte Apps
    Singular: benutzerdefinierte App
    Art: Benutzerdefinierte App

Verwenden Sie Kubectl, um die CustomApp-CRD zu Ihrem Cluster hinzuzufügen:

$ kubectl apply -f benutzerdefinierte-apps-crd.yaml benutzerdefinierte Ressourcedefinition.apiextensions.k8s.io/custom-apps.crds.example.com erstellt

Die YAML-Datei definiert eine CRD, die zum Speichern von Anwendungsdaten verwendet werden kann. CRDs brauchen a metadata.name et spec.group Feld in einem bestimmten Format: Die Gruppe hat die Form einer Unterdomäne, zu der das CRD gehört. Dieselbe Subdomain muss in den CRDs enthalten sein metadata.name . Der Wert von names.plural wird als neue Subdomain-Komponente hinzugefügt, um die endgültige Version zu erstellen metadata.name.

La spec.names Das Feld definiert, wie Sie auf das CRD verweisen, wenn Sie die Kubernetes-API und Kubectl-Befehle verwenden. In diesem Beispiel können Sie ausführen kubectl get custom-apps et kubectl get custom-app/example-app um mit Objekten zu interagieren, die das CRD verwenden. Wenn Sie ein neues Objekt als YAML-Datei erstellen, müssen Sie festlegen kind: CustomApp um es zu einer Instanz des CRD zu machen.

Das CRD wird als Objekttyp auf Namespace-Ebene von konfiguriert scope aufstellen. Sie können verwenden Cluster als alternativen Wert für dieses Feld, um Objekte zu erstellen, die auf Clusterebene außerhalb eines Namespaces existieren.

Die mit Ihren benutzerdefinierten Objekten verknüpften Daten sind in definiert spec.versions.schema.openAPIV3Schema aufstellen. Jede aufgeführte „Version“ erstellt eine neue Version der CRD-API, auf die Sie mit der referenzieren können apiVersion in Ihren Ressourcen-YAML-Dateien. CRD-Daten werden mithilfe von OpenAPI-Eigenschaften konfiguriert; hier sollte jede "benutzerdefinierte Anwendung" in Ihrem Cluster haben app-name, app-versionet release-count Eigenschaften, die in seiner YAML definiert sind spec.

Verwenden Sie Ihr CRD

Das Bereitstellen von API-Endpunkten für ein neues CRD kann einige Minuten dauern. Überprüfen Sie den Fortschritt, indem Sie die CRD-Details mit Kubectl abrufen:

$ kubectl describe crd custom-apps.crds.example.com ... Status: Accepted Names: Art: CustomApp List Art: CustomAppList Plural: custom-apps Singular: custom-app Bedingungen: Last Transition Time: 2022-04-04T13: 29:24Z Nachricht: Keine Konflikte gefunden Grund: NoConflicts Status: True Typ: NamesAccepted Last Transition Time: 2022-04-04T13:29:24Z Nachricht: Die ursprünglichen Namen wurden akzeptiert Reason: InitialNamesAccepted Status: True Type: Established ...

Das CRD ist einsatzbereit, wenn Sie sehen Type: Established gegen Ende der Befehlsausgabe. Kubernetes akzeptiert Anfragen an den CRD-API-Endpunkt. In diesem Fall lautet die Basis-API-URL:

/apis/custom-apps.crds.example.com/v1/namespaces/*/custom-apps/…

Sie können jetzt Kubectl verwenden, um Objekte anzuzeigen, die mit dem CRD erstellt wurden:

$ kubectl get custom-apps Keine Ressourcen im Standard-Namespace gefunden.

Obwohl noch kein Objekt vorhanden ist, weiß Kubernetes jetzt, dass es einen Ressourcentyp namens hat custom-apps.

Um ein „benutzerdefiniertes Anwendungs“-Objekt zu erstellen, schreiben Sie eine neue YAML-Datei mit kind: CustomApp. die apiVersion sollte auf den Gruppennamen und die API-Version eingestellt werden, die vom CRD bereitgestellt werden. Innerhalb der spec Fügen Sie die Eigenschaften hinzu, die Sie im CRD-Schema definiert haben.

apiVersion: crds.example.com/v1
Art: Benutzerdefinierte App
Metadaten:
  Name: Demo-App-1
spec:
  App Name: Demo-App
  App-Version: 1.1.0
  Release-Zählung: 5

Verwenden Sie Kubectl, um das Objekt zu Ihrem Cluster hinzuzufügen:

$ kubectl apply -f custom-app.yaml customapp.crds.example.com/demo-app erstellt

Sie können jetzt die Objektdetails mit den üblichen Kubectl-Befehlen abrufen:

$ kubectl describe custom-app/demo-app-1 Name: demo-app Namespace: default Labels: Anmerkungen: API-Version: crds.example.com/v1 Art: CustomApp ... Spec: App - Name: demo-app App - Version: 1.1.0 Release - Count: 5 ... Events:

Sie haben eine funktionierende benutzerdefinierte Ressource, die jetzt einige Daten in Ihrem Kubernetes-Cluster speichert. Sie können das CRD entfernen, indem Sie es in Kubectl löschen; Dadurch werden automatisch alle Objekte bereinigt, die es verwenden.

$ kubectl delete crd custom-apps.crds.example.com customresourcedefinition.apiextensions.k8s.io „custom-apps.crds.example.com“ gelöscht

Deklarative APIs mit CRDs erstellen

Diese CRD fügt dem Cluster keine Funktionalität hinzu. Es speichert Daten, stellt eine API bereit, um damit zu interagieren, und kann von anderen Objekten referenziert werden. CRDs werden leistungsfähiger, wenn sie mit einem benutzerdefinierten Controller gekoppelt werden, der die Verantwortung für ihre Verwaltung übernehmen kann.

Controller verfolgen Ressourcen und ergreifen Maßnahmen als Reaktion auf ihre Ereignisse. Das Schreiben eines Controllers für Ihre CRDs ermöglicht es Ihnen, sie in deklarative APIs umzuwandeln, die echte Veränderungen in Ihrem Cluster bewirken. Ihre Objekte können das darstellen beabsichtigt Zustand, anstatt den genauen Ist-Zustand.

Cert-Manager verwendet dieses Muster zum automatischen Abrufen von SSL-Zertifikaten, wenn neue CertificateRequest-Objekte in Ihrem Cluster erscheinen. Innerhalb des Kubernetes-Kerns rufen Knoten Container-Images ab und führen sie als Reaktion auf das Spawnen von Pods aus. Mit Controllern können Sie Verhalten an Ihre eigenen CRDs anhängen, sodass das Hinzufügen einer „benutzerdefinierten Anwendung“ dazu führen könnte, dass ihre Konfiguration von einem externen Dienst abgerufen wird. Sie können mit dem Erstellen von Controllern mit dem Go SDK beginnen, um Ihren eigenen Code in die Kubernetes-Laufzeitumgebung zu integrieren.

Wann sollten CRDs verwendet werden?

CRDs werden am besten verwendet, um interne Daten Ihrer Organisation, Ihres Teams oder Ihres Projekts zu verwalten. Sie sind so konzipiert, dass sie klar definierte Schemas darstellen, entweder als statische Werte oder als deklarative APIs, die von einer benutzerdefinierten Controller-Implementierung unterstützt werden.

Mit erweiterten Funktionen können Sie Validierungsroutinen für Felder in Ihrem Schema implementieren. Sie können auch Finalizer verwenden, um Objektlöschungen zu verwalten, und das Versionsverwaltungssystem übernehmen, um Änderungen an Ihren CRD-Definitionen zu verwalten.

CRDs überschneiden sich manchmal mit Kubernetes ConfigMaps. Sie sind integrierte Objekte zum Speichern generischer Konfigurationsdaten, die Ihren Anwendungen zugeordnet sind. Eine ConfigMap ist geeignet, wenn die Werte an einer bestimmten Stelle in Ihrem Cluster konsumiert werden, z. B. ein Pod, der auf Datenbankeinstellungen als Umgebungsvariablen zugreift, die von einer ConfigMap eingefügt werden.

CRDs sind für den Einsatz vorgesehen, wenn Daten ein erstklassiger Bürger in Ihrem Cluster sein müssen. Sie können mehrere Instanzen des CRD-Ressourcentyps erstellen, mithilfe von Kubectl direkt mit ihnen interagieren und Ihre eigenen strukturierten Schemas erstellen, die Benutzer zur Eingabe korrekter Werte führen. Sie sind möglicherweise eine bessere Wahl, wenn die Daten unabhängig von allem anderen in Ihrem Cluster vorhanden sind.

Zusammenfassung

Kubernetes Custom Resource Definitions (CRDs) definieren neue Objekttypen, die Sie mit der Kubernetes-API und Kubectl verwenden können. Jedes CRD erhält seine eigene versionierte API, hat ein strukturiertes Schema und kann verwendet werden, um neue Funktionen im Cluster zu implementieren, wenn es von einem begleitenden Controller unterstützt wird.

CRDs können manchmal kompliziert und für fortgeschrittene Situationen reserviert erscheinen. Dies darf nicht der Fall sein. Einfache CRDs zum Speichern statischer Werte in Ihrem Cluster sind einfach zu erstellen, wie das Beispiel „benutzerdefinierte Anwendung“ oben zeigt. Sie können verwendet werden, um autonome Clusterdaten zu speichern, damit sie in Kubernetes erstklassig behandelt werden.

Es ist auch wichtig zu erkennen, wo CRDs nicht passen. Integrierte Objekte wie ConfigMaps und Secrets sind so konzipiert, dass sie die meisten Formen der Konfiguration aufnehmen, die direkt von den Pods Ihrer App verwendet werden. Das Schreiben einer CRD, die das Konfigurationsdateischema Ihrer Anwendung definiert, ist normalerweise unnötig und im Laufe der Zeit schwieriger zu warten, da Sie nicht von ConfigMap-Funktionen wie automatischen kontinuierlichen Updates und dem Einfügen von Umgebungsvariablen profitieren.

★ ★ ★ ★ ★