10 Manifest in Kubernetes

Manifeste sind die Grundlage für die deklarative Verwaltung der Konfiguration in Kubernetes. Sie dienen der Festlegung des gewünschten Zustands für Ressourcen im Cluster. Die Definition dieser Konfigurationsdateien erfolgt üblicherweise im YAML-Format, wobei auch JSON unterstützt wird.

10.1 Funktionen und Einsatzbereiche

Ein Kubernetes-Manifest ermöglicht die Deklaration von gewünschten Eigenschaften und Beziehungen von Clusterressourcen in einem formatierten, menschenlesbaren Textdokument. Kubernetes strebt anschließend danach, den tatsächlichen Zustand des Clusters an diesen gewünschten Zustand anzupassen.

10.2 Manifeststruktur

Jedes Kubernetes-Manifest beinhaltet die folgenden Schlüsselelemente:

Ein exemplarisches Manifest in YAML-Struktur sieht wie folgt aus:

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  labels:
    purpose: demonstrate-manifest
spec:
  containers:
  - name: example-container
    image: nginx:1.14.2
    ports:
    - containerPort: 80

Dieses Format standardisiert die Cluster-Konfiguration und erleichtert sowohl die manuelle als auch maschinelle Bearbeitung.

10.3 apiVersion in Kubernetes Spec

Die apiVersion in einer Kubernetes-Spezifikation ist entscheidend, da sie die Version der Kubernetes-API angibt, mit der das Objekt erstellt wird. Diese Information ist notwendig, um die Kompatibilität zwischen den Objekten und dem Cluster zu gewährleisten.

10.3.1 Zweck der apiVersion

Die apiVersion stellt die Kompatibilität sicher und definiert, welche Version der Kubernetes-API für das Erstellen des Objekts verwendet wird.

10.3.2 Struktur der apiVersion

Die apiVersion wird in zwei Teile unterteilt: apiGroup und version.

Schlüssel Beschreibung
apiGroup Die API-Gruppe des Objekts, wie apps, batch, extensions, etc.
version Die spezifische Version der API in der Gruppe, z.B. v1, v1beta1, v1alpha1.

10.3.3 Beispiele

apiVersion Beschreibung
apiVersion: v1 Die erste stabile Version der Kubernetes-API; umfasst viele Kernobjekte.
apiVersion: apps/v1 Teil der apps API-Gruppe; beinhaltet Kernobjekte wie Deployments, RollingUpdates und ReplicaSets.
apiVersion: autoscaling/v1 API-Gruppe und Version für Autoscaling-Ressourcen.

10.3.4 Wie man die richtige apiVersion findet

Um die richtige apiVersion für eine Ressource zu finden, kann man den Befehl

kubectl api-versions

verwenden, um eine Liste aller auf dem Cluster verfügbaren API-Versionen zu erhalten

10.3.5 Neue apiVersion bei API-Änderungen

Wenn Kubernetes eine Veröffentlichung hat, die das, was für die Verwendung verfügbar ist, aktualisiert oder etwas in seiner API ändert, wird eine neue apiVersion erstellt

Die Wahl der richtigen apiVersion ist entscheidend, da sie beeinflusst, welche Eigenschaften und Methoden in den Objektspezifikationen verwendet werden können.

kubectl api-versions
acme.cert-manager.io/v1
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
authentication.k8s.io/v1
authorization.k8s.io/v1
.
.
.
traefik.containo.us/v1alpha1
v1
Group Version Erläuterung
acme.cert-manager.io v1 Spezifische API-Gruppe und Version für ACME im Cert-Manager.
admissionregistration.k8s.io v1 API-Gruppe für die Registrierung von Admission Controllern in Kubernetes.
apiextensions.k8s.io v1 API-Gruppe für die Erweiterung der Kubernetes-API.
apiregistration.k8s.io v1 API-Gruppe für die Registrierung von APIs in Kubernetes.
apps v1 Häufig verwendete API-Gruppe in Kubernetes für Kernobjekte wie Deployments und ReplicaSets.
authentication.k8s.io v1 API-Gruppe für Authentifizierungsprozesse in Kubernetes.
authorization.k8s.io v1 API-Gruppe für Autorisierungsprozesse in Kubernetes.
autoscaling v1 API-Gruppe für Autoscaling-Funktionen in Kubernetes.
autoscaling v2 Erweiterte oder aktualisierte Version der Autoscaling-API in Kubernetes.
batch v1 API-Gruppe für Batch-Prozess-Ressourcen wie Jobs und CronJobs.
cert-manager.io v1 API-Gruppe für die Verwaltung von Zertifikaten in Kubernetes.
certificates.k8s.io v1 API-Gruppe für die Verwaltung von Zertifikatanfragen in Kubernetes.
coordination.k8s.io v1 API-Gruppe für Koordinationsprozesse in Kubernetes.
discovery.k8s.io v1 API-Gruppe für Discovery-Prozesse in Kubernetes.
events.k8s.io v1 API-Gruppe für Ereignisberichterstattung in Kubernetes.
flowcontrol.apiserver.k8s.io v1beta2 Beta-Version der API-Gruppe für Flow-Control-Funktionen im API-Server.
flowcontrol.apiserver.k8s.io v1beta3 Weiterentwickelte Beta-Version der API-Gruppe für Flow-Control-Funktionen im API-Server.
helm.cattle.io v1 Spezifische API-Gruppe und Version für Helm in der Cattle-Plattform.
k3s.cattle.io v1 Spezifische API-Gruppe und Version für K3s in der Cattle-Plattform.
longhorn.io v1beta1 Beta-Version der API-Gruppe für Longhorn, eine Cloud-native Speicherplattform.
longhorn.io v1beta2 Weiterentwickelte Beta-Version der API-Gruppe für Longhorn.
metrics.k8s.io v1beta1 Beta-Version der API-Gruppe für Metrik-Daten in Kubernetes.
monitoring.coreos.com v1 API-Gruppe für Monitoring-Funktionen in der CoreOS-Plattform.
monitoring.coreos.com v1alpha1 Alpha-Version der API-Gruppe für Monitoring-Funktionen in der CoreOS-Plattform.
networking.k8s.io v1 API-Gruppe für Netzwerkfunktionalitäten in Kubernetes.
node.k8s.io v1 API-Gruppe für Node-bezogene Operationen in Kubernetes.
policy v1 API-Gruppe für Policy-bezogene Ressourcen und Operationen in Kubernetes.
rbac.authorization.k8s.io v1 API-Gruppe für RBAC (Role-Based Access Control) in Kubernetes.
scheduling.k8s.io v1 API-Gruppe für Scheduling-Operationen in Kubernetes.
storage.k8s.io v1 API-Gruppe für Speicherressourcen und -operationen in Kubernetes.
storage.k8s.io v1beta1 Beta-Version der API-Gruppe für Speicherressourcen und -operationen in Kubernetes.
traefik.containo.us v1alpha1 Alpha-Version der API-Gruppe für Traefik, einen modernen HTTP-Reverse-Proxy und Load-Balancer.
v1 Kernversion der Kubernetes-API, enthält viele Kernobjekte und -funktionen.

10.4 kind in Kubernetes Spec

Das Feld kind in der Spezifikation eines Kubernetes-Objekts definiert den Typ des Objekts, das erstellt oder manipuliert werden soll. Es ist eines der erforderlichen Felder in jedem Kubernetes-Manifest.

10.4.1 Zweck von kind

Das kind-Feld gibt den Typ der Ressource an, die in dem Manifest definiert ist. Es sagt Kubernetes, welche Art von Objekt Sie erstellen oder anderweitig manipulieren möchten.

10.4.2 Häufige Werte für kind

kind Beschreibung
Pod Definiert einen Pod, der eine oder mehrere Container enthält.
Service Definiert einen Service, der den Zugriff auf Pods ermöglicht.
Deployment Definiert ein Deployment, das Pods und ReplicaSets verwaltet.
ReplicaSet Definiert ein ReplicaSet, das die Replikation von Pods gewährleistet.
StatefulSet Definiert ein StatefulSet für stateful Anwendungen.
DaemonSet Definiert ein DaemonSet, das sicherstellt, dass alle Nodes einen Kopie eines bestimmten Pods ausführen.
Namespace Definiert einen Namespace, der zur Trennung von Ressourcen in einem Cluster dient.
Node Definiert einen Knoten im Cluster.

10.4.3 Beispiele

10.4.3.1 Pod

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: nginx

10.4.3.2 Service

apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376

10.4.3.3 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydeployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: mycontainer
        image: nginx

10.4.4 Wo wird kind verwendet

Das kind-Feld wird in allen Kubernetes-Manifesten verwendet und ist erforderlich, um den Typ des Objekts anzugeben, das erstellt oder manipuliert werden soll. Das ermöglicht es Kubernetes, die notwendige Logik anzuwenden, um die gewünschte Ressource korrekt zu behandeln.

Um alle verfügbaren kinds in einem Kubernetes-Cluster aufzulisten, können Sie den folgenden Befehl verwenden:

kubectl api-resources --verbs=list -o name

Der Befehl kubectl api-resources gibt eine Liste aller Ressourcentypen im Cluster zurück. Die Option --verbs=list filtert die Ausgabe auf Ressourcentypen, die gelistet werden können. Die Option -o name formatiert die Ausgabe, um nur die Namen der Ressourcentypen anzuzeigen.

Durch Ausführen des obigen Befehls erhalten Sie eine Liste aller Ressourcentypen, die im Cluster verfügbar sind, was Ihnen einen Hinweis auf die verschiedenen kinds gibt, die Sie in Ihren Kubernetes-Spezifikationen verwenden können.

Durch das Verständnis des kind-Feldes und seiner Verwendung können Sie effektiv mit verschiedenen Ressourcentypen in Kubernetes arbeiten und verstehen, wie Sie sie in Ihren Manifesten definieren können.

Die vollständige Auflistung der Resourcen sieht in einem k3s Cluster z.B. so aus:

kubectl api-resources --verbs=list
NAME SHORTNAMES APIVERSION NAMESPACED KIND
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
podtemplates v1 true PodTemplate
replicationcontrollers rc v1 true ReplicationController
resourcequotas quota v1 true ResourceQuota
secrets v1 true Secret
serviceaccounts sa v1 true ServiceAccount
services svc v1 true Service
challenges acme.cert-manager.io/v1 true Challenge
orders acme.cert-manager.io/v1 true Order
mutatingwebhookconfigurations admissionregistration.k8s.io/v1 false MutatingWebhookConfiguration
validatingwebhookconfigurations admissionregistration.k8s.io/v1 false ValidatingWebhookConfiguration
customresourcedefinitions crd,crds apiextensions.k8s.io/v1 false CustomResourceDefinition
apiservices apiregistration.k8s.io/v1 false APIService
controllerrevisions apps/v1 true ControllerRevision
daemonsets ds apps/v1 true DaemonSet
deployments deploy apps/v1 true Deployment
replicasets rs apps/v1 true ReplicaSet
statefulsets sts apps/v1 true StatefulSet
horizontalpodautoscalers hpa autoscaling/v2 true HorizontalPodAutoscaler
cronjobs cj batch/v1 true CronJob
jobs batch/v1 true Job
certificaterequests cr,crs cert-manager.io/v1 true CertificateRequest
certificates cert,certs cert-manager.io/v1 true Certificate
clusterissuers cert-manager.io/v1 false ClusterIssuer
issuers cert-manager.io/v1 true Issuer
certificatesigningrequests csr certificates.k8s.io/v1 false CertificateSigningRequest
leases coordination.k8s.io/v1 true Lease
endpointslices discovery.k8s.io/v1 true EndpointSlice
events ev events.k8s.io/v1 true Event
flowschemas flowcontrol.apiserver.k8s.io/v1beta3 false FlowSchema
prioritylevelconfigurations flowcontrol.apiserver.k8s.io/v1beta3 false PriorityLevelConfiguration
helmchartconfigs helm.cattle.io/v1 true HelmChartConfig
helmcharts helm.cattle.io/v1 true HelmChart
addons k3s.cattle.io/v1 true Addon
backingimagedatasources lhbids longhorn.io/v1beta2 true BackingImageDataSource
backingimagemanagers lhbim longhorn.io/v1beta2 true BackingImageManager

10.5 Metadata in Kubernetes Spec

Die metadata-Sektion in der Spezifikation eines Kubernetes-Objekts enthält Informationen, die zur Identifizierung und Organisation des Objekts verwendet werden.

10.5.1 Zweck der metadata

Die metadata-Sektion ist für die Speicherung von Informationen über die Ressource verantwortlich, wie z.B. Name, Labels, Annotations usw. Diese Informationen sind wichtig für die Erstellung, Aktualisierung und Verwaltung von Objekten in einem Kubernetes-Cluster.

10.5.2 Hauptfelder in metadata

Schlüssel Beschreibung
name Der eindeutige Name des Objekts im Kubernetes-Cluster.
labels Schlüssel-Wert-Paare, die zur Identifizierung und Gruppierung von Objekten verwendet werden.
annotations Schlüssel-Wert-Paare, die dazu dienen, zusätzliche Informationen zu speichern, die nicht zur eindeutigen Identifizierung dienen.

10.5.3 Beispiele

10.5.3.1 Name

Im folgenden Beispiel wird ein Deployment mit dem Namen nginx-deployment erstellt, das im Feld .metadata.name angegeben wird:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
...

10.5.3.2 Labels

Labels können zur Klassifizierung und Auswahl von Objekten verwendet werden. Im folgenden Beispiel wird dem Deployment ein Label app: nginx zugewiesen:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
...

10.5.3.3 Annotations

Annotations können verwendet werden, um nicht identifizierende Informationen zu speichern. Sie können beliebige Daten speichern, die nützlich sind, aber nicht zur Identifizierung des Objekts verwendet werden:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  annotations:
    description: This is a sample pod.
...

10.5.4 Wo wird metadata verwendet

Die metadata-Sektion wird in vielen verschiedenen Arten von Kubernetes-Objekten verwendet, einschließlich Pods, Deployments, Services, ReplicaSets und vielen anderen. Sie ist ein kritischer Teil der Objektdefinition und wird verwendet, um das Objekt im Cluster zu identifizieren und zu organisieren.

Die metadata-Sektion in Kubernetes-Objektspezifikationen ist ein mächtiges Werkzeug zur Verwaltung und Organisation von Ressourcen im Cluster.

10.6 spec in Kubernetes Spec

Die spec-Sektion ist ein wesentlicher Bestandteil der Spezifikation eines Kubernetes-Objekts, in dem die gewünschten Zustände und Eigenschaften der Ressource definiert werden.

10.6.1 Zweck der spec

10.6.2 Häufig verwendete Felder in spec

Feld Beschreibung
replicas Die Anzahl der gewünschten Instanzen eines Pods.
selector Ein Ausdruck, der verwendet wird, um die Pods zu identifizieren, die von der Ressource verwaltet werden.
template Die Pod-Spezifikation, die verwendet wird, um neue Pods zu erstellen.
ports Die Port-Konfiguration für einen Service.
volumes Die Volumen-Konfiguration für einen Pod.

10.6.3 Beispiele

10.6.3.1 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

10.6.3.2 Service

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

10.6.3.3 Pod

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: nginx

10.6.4 Wo wird spec verwendet

Die spec-Sektion wird in vielen verschiedenen Arten von Kubernetes-Objekten verwendet, einschließlich Pods, Deployments, Services, ReplicaSets, und vielen anderen. Sie ist ein zentraler Bestandteil der Objektdefinition und wird verwendet, um die gewünschten Zustände und Eigenschaften der Ressource anzugeben.

Die spec-Sektion ist entscheidend für die Definition des gewünschten Zustands einer Ressource in Kubernetes und bietet eine flexible und umfangreiche Konfiguration, um die Betriebsanforderungen zu erfüllen.