Heim >Backend-Entwicklung >Golang >Kubernetes als Datenbank? Was Sie über CRDs wissen müssen

Kubernetes als Datenbank? Was Sie über CRDs wissen müssen

WBOY
WBOYOriginal
2024-07-19 12:32:22326Durchsuche

Kubernetes as a Database? What You Need to Know About CRDs

Im sich schnell entwickelnden Bereich der Cloud-nativen Technologien hat sich Kubernetes zu einem leistungsstarken Werkzeug für die Orchestrierung von Containeranwendungen entwickelt. Aber unter Entwicklern und IT-Spezialisten: „Ist Kubernetes eine Datenbank?“ ist eine häufig gestellte Frage. Dieser Beitrag geht dieser Frage nach und bietet eine ausführliche Beschreibung von Custom Resource Definitions (CRDs) sowie deren Verwendung im Kubernetes-Ökosystem. Wir hoffen, diese Ideen klar zu machen und die Anpassungsfähigkeit und Leistungsfähigkeit von Kubernetes im Stateful Application Management anhand ausführlicher Codebeispiele und realer Anwendungen zu veranschaulichen.

Einführung in Kubernetes

Kubernetes, oft als K8s abgekürzt, ist eine Open-Source-Plattform zur Automatisierung der Bereitstellung, Skalierung und des Betriebs von Anwendungscontainern. Kubernetes wurde ursprünglich von Google entwickelt und hat sich zum De-facto-Standard für die Container-Orchestrierung entwickelt, der von einer lebendigen Community und einer breiten Palette an Tools und Erweiterungen unterstützt wird.

Kernkonzepte von Kubernetes

Bevor wir uns mit den Besonderheiten von CRDs und der Frage nach Kubernetes als Datenbank befassen, ist es wichtig, einige Kernkonzepte zu verstehen:

Pods: Die kleinsten bereitstellbaren Einheiten in Kubernetes, die eine einzelne Instanz eines laufenden Prozesses in einem Cluster darstellen.

Knoten: Die Arbeitsmaschinen in Kubernetes, die entweder virtuell oder physisch sein können.

Cluster: Eine Reihe von Knoten, die vom Kubernetes-Master gesteuert werden.

Dienste: Eine Abstraktion, die einen logischen Satz von Pods und eine Richtlinie für den Zugriff darauf definiert.

Kubernetes als Datenbank: Mythos oder Realität?

Kubernetes selbst ist keine Datenbank. Es handelt sich um eine Orchestrierungsplattform, die containerisierte Anwendungen, einschließlich Datenbanken, verwalten kann. Allerdings kommt es oft zu Verwirrung, weil Kubernetes zur effektiven Bereitstellung und Verwaltung von Datenbankanwendungen verwendet werden kann.

Benutzerdefinierte Ressourcendefinitionen (CRDs) verstehen

Custom Resource Definitions (CRDs) erweitern die Kubernetes-API, um Benutzern die Verwaltung ihrer eigenen anwendungsspezifischen benutzerdefinierten Ressourcen zu ermöglichen. Diese Fähigkeit macht Kubernetes in hohem Maße erweiterbar und anpassbar, um es an verschiedene Anwendungsfälle anzupassen.

Was sind CRDs?

CRDs ermöglichen es Benutzern, benutzerdefinierte Objekte zu definieren, die sich wie integrierte Kubernetes-Ressourcen verhalten. Während Kubernetes beispielsweise über integrierte Ressourcen wie Pods, Dienste und Bereitstellungen verfügt, können Sie benutzerdefinierte Ressourcen wie „MySQLCluster“ oder „PostgreSQLBackup“ erstellen.

Erstellen eines CRD

Um ein CRD zu erstellen, müssen Sie es in einer YAML-Datei definieren und auf Ihren Kubernetes-Cluster anwenden. Hier ist ein einfaches Beispiel:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: myresources.example.com
spec:
  group: example.com
  versions:
    - name: v1
      served: true
      storage: true
  scope: Namespaced
  names:
    plural: myresources
    singular: myresource
    kind: MyResource
    shortNames:
      - mr

Durch Anwenden dieser YAML-Datei mit kubectl apply -f myresource-crd.yaml wird die benutzerdefinierte Ressourcendefinition in Ihrem Cluster erstellt.

Benutzerdefinierte Ressourcen verwalten

Sobald das CRD erstellt ist, können Sie mit der Verwaltung benutzerdefinierter Ressourcen beginnen, wie Sie es mit nativen Kubernetes-Ressourcen tun würden. Hier ist ein Beispiel einer benutzerdefinierten Ressourceninstanz:

apiVersion: example.com/v1
kind: MyResource
metadata:
  name: myresource-sample
spec:
  foo: bar
  count: 10

Sie können diese benutzerdefinierte Ressource erstellen mit:

kubectl apply -f myresource-instance.yaml

CRDs für zustandsbehaftete Anwendungen verwenden

Benutzerdefinierte Ressourcendefinitionen sind besonders nützlich für die Verwaltung zustandsbehafteter Anwendungen, einschließlich Datenbanken. Sie ermöglichen Ihnen, den gewünschten Status eines Datenbankclusters, Sicherungsrichtlinien und andere benutzerdefinierte Verhaltensweisen zu definieren.

Beispiel: Verwalten eines MySQL-Clusters mit CRDs

Stellen Sie sich ein Szenario vor, in dem Sie einen MySQL-Cluster mit Kubernetes verwalten müssen. Sie können eine benutzerdefinierte Ressource definieren, um die MySQL-Clusterkonfiguration darzustellen:

apiVersion: example.com/v1
kind: MySQLCluster
metadata:
  name: my-mysql-cluster
spec:
  replicas: 3
  version: "5.7"
  storage:
    size: 100Gi
    class: standard

Mit diesem CRD können Sie MySQL-Cluster mit Standard-Kubernetes-Befehlen erstellen, aktualisieren und löschen, wodurch die Datenbankverwaltung einfacher und in den Rest Ihrer Infrastruktur integriert wird.

Erweiterte CRD-Funktionen

CRDs bieten mehrere erweiterte Funktionen, die ihre Funktionalität und Integration in das Kubernetes-Ökosystem verbessern.

Validierungsschemata

Sie können Validierungsschemata für benutzerdefinierte Ressourcen definieren, um sicherzustellen, dass nur gültige Konfigurationen akzeptiert werden. Hier ist ein Beispiel für das Hinzufügen eines Validierungsschemas zum MySQLCluster CRD:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: mysqlclusters.example.com
spec:
  group: example.com
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                replicas:
                  type: integer
                  minimum: 1
                version:
                  type: string
                storage:
                  type: object
                  properties:
                    size:
                      type: string
                    class:
                      type: string
  scope: Namespaced
  names:
    plural: mysqlclusters
    singular: mysqlcluster
    kind: MySQLCluster
    shortNames:
      - mc

Benutzerdefinierte Controller

Um die Verwaltung benutzerdefinierter Ressourcen zu automatisieren, können Sie benutzerdefinierte Controller schreiben. Diese Controller achten auf Änderungen an benutzerdefinierten Ressourcen und ergreifen Maßnahmen, um den tatsächlichen Zustand mit dem gewünschten Zustand abzugleichen.

Hier ist eine Übersicht, wie Sie einen Controller für die MySQLCluster-Ressource schreiben könnten:

package main

import (
    "context"
    "log"

    mysqlv1 "example.com/mysql-operator/api/v1"
    "k8s.io/apimachinery/pkg/runtime"
    "k8s.io/client-go/kubernetes/scheme"
    ctrl "sigs.k8s.io/controller-runtime"
    "sigs.k8s.io/controller-runtime/pkg/client"
    "sigs.k8s.io/controller-runtime/pkg/manager"
)

type MySQLClusterReconciler struct {
    client.Client
    Scheme *runtime.Scheme
}

func (r *MySQLClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    var mysqlCluster mysqlv1.MySQLCluster
    if err := r.Get(ctx, req.NamespacedName, &mysqlCluster); err != nil {
        return ctrl.Result{}, client.IgnoreNotFound(err)
    }

    // Reconciliation logic goes here

    return ctrl.Result{}, nil
}

func main() {
    mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
        Scheme: scheme.Scheme,
    })
    if err != nil {
        log.Fatalf("unable to start manager: %v", err)
    }

    if err := (&MySQLClusterReconciler{
        Client: mgr.GetClient(),
        Scheme: mgr.GetScheme(),
    }).SetupWithManager(mgr); err != nil {
        log.Fatalf("unable to create controller: %v", err)
    }

    if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
        log.Fatalf("unable to run manager: %v", err)
    }
}

Versionierung

CRDs unterstützen die Versionierung, sodass Sie verschiedene Versionen Ihrer benutzerdefinierten Ressourcen verwalten und reibungslos zwischen ihnen migrieren können. Dies ist entscheidend für die Aufrechterhaltung der Abwärtskompatibilität und die Weiterentwicklung Ihrer APIs im Laufe der Zeit.

Fallstudie: Kubernetes-Operatoren für Datenbanken

Kubernetes Operators leverage CRDs and custom controllers to automate the management of complex stateful applications like databases. Let's explore a real-world example: the MySQL Operator.

The MySQL Operator

The MySQL Operator simplifies the deployment and management of MySQL clusters on Kubernetes. It uses CRDs to define the desired state of the MySQL cluster and custom controllers to handle tasks like provisioning, scaling, and backups.

Defining the MySQLCluster CRD

The MySQL Operator starts by defining a CRD for the MySQLCluster resource, as shown earlier. This CRD includes fields for specifying the number of replicas, MySQL version, storage requirements, and more.

Writing the MySQLCluster Controller

The controller for the MySQLCluster resource continuously watches for changes to MySQLCluster objects and reconciles the actual state with the desired state. For example, if the number of replicas is increased, the controller will create new MySQL instances and configure them to join the cluster.

Code Example: Scaling a MySQL Cluster

Here’s a simplified version of the controller logic for scaling a MySQL cluster:

func (r *MySQLClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    var mysqlCluster mysqlv1.MySQLCluster
    if err := r.Get(ctx, req.NamespacedName, &mysqlCluster); err != nil {
        return ctrl.Result{}, client.IgnoreNotFound(err)
    }

    // Fetch the current number of MySQL pods
    var pods corev1.PodList
    if err := r.List(ctx, &pods, client.InNamespace(req.Namespace), client.MatchingLabels{
        "app":  "mysql",
        "role": "master",
    }); err != nil {
        return ctrl.Result{}, err
    }

    currentReplicas := len(pods.Items)
    desiredReplicas := mysqlCluster.Spec.Replicas

    if currentReplicas < desiredReplicas {
        // Scale up
        for i := currentReplicas; i < desiredReplicas; i++ {
            newPod := corev1.Pod{
                ObjectMeta: metav1.ObjectMeta{
                    Name:      fmt.Sprintf("mysql-%d", i),
                    Namespace: req.Namespace,
                    Labels: map[string

]string{
                        "app":  "mysql",
                        "role": "master",
                    },
                },
                Spec: corev1.PodSpec{
                    Containers: []corev1.Container{
                        {
                            Name:  "mysql",
                            Image: "mysql:5.7",
                            Ports: []corev1.ContainerPort{
                                {
                                    ContainerPort: 3306,
                                },
                            },
                        },
                    },
                },
            }
            if err := r.Create(ctx, &newPod); err != nil {
                return ctrl.Result{}, err
            }
        }
    } else if currentReplicas > desiredReplicas {
        // Scale down
        for i := desiredReplicas; i < currentReplicas; i++ {
            podName := fmt.Sprintf("mysql-%d", i)
            pod := &corev1.Pod{
                ObjectMeta: metav1.ObjectMeta{
                    Name:      podName,
                    Namespace: req.Namespace,
                },
            }
            if err := r.Delete(ctx, pod); err != nil {
                return ctrl.Result{}, err
            }
        }
    }

    return ctrl.Result{}, nil
}

Benefits of Using Kubernetes Operators

Kubernetes Operators, built on CRDs and custom controllers, provide several benefits for managing stateful applications:

Automation: Operators automate routine tasks such as scaling, backups, and failover, reducing the operational burden on administrators.

Consistency: By encapsulating best practices and operational knowledge, Operators ensure that applications are managed consistently and reliably.

Extensibility: Operators can be extended to support custom requirements and integrate with other tools and systems.

Conclusion

Although Kubernetes is not a database in and of itself, it offers a strong framework for installing and administering database applications. A strong addition to the Kubernetes API, bespoke Resource Definitions (CRDs) allow users to design and manage bespoke resources that are suited to their particular requirements.

You may build Kubernetes Operators that automate the administration of intricate stateful applications, such as databases, by utilizing CRDs and custom controllers. This method offers more flexibility and customization, improves consistency, and streamlines processes.

This article has covered the foundations of CRDs, shown comprehensive code examples, and shown how stateful applications may be efficiently managed with CRDs. To fully utilize Kubernetes, you must comprehend and make use of CRDs, regardless of whether you are implementing databases or other sophisticated services on this potent orchestration platform.

As Kubernetes develops further, its adaptability to a variety of use cases and needs is ensured by its expansion through CRDs and Operators. Keep investigating and experimenting with these functionalities as you progress with Kubernetes to open up new avenues for your infrastructure and apps.

Das obige ist der detaillierte Inhalt vonKubernetes als Datenbank? Was Sie über CRDs wissen müssen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn