Inhaltsverzeichnis
1. Verstehen Sie das Operatormuster
2. Verwenden Sie Kubebuilder und Controller-Runtime
Werkzeuge installieren:
Erstellen Sie ein neues Projekt:
3. Definieren Sie Ihre benutzerdefinierte Ressource
4. Implementieren Sie die Versöhnungslogik
5. RBAC hinzufügen und bereitstellen
6. Best Practices
7. Tests
Heim Backend-Entwicklung Golang Entwicklung von Kubernetes -Betreibern in Go

Entwicklung von Kubernetes -Betreibern in Go

Jul 25, 2025 am 02:38 AM
go

Der effizienteste Weg, um einen Kubernetes-Operator zu schreiben, besteht darin, GO zu verwenden, um Kubebuilder und Controller-Runtime zu kombinieren. 1. Verstehen Sie das Bedienermuster: Definieren Sie benutzerdefinierte Ressourcen über CRD, schreiben Sie einen Controller, um auf Ressourcenänderungen zu hören und Versöhnungsschleifen durchzuführen, um den erwarteten Zustand aufrechtzuerhalten. 2. Initialisieren Sie das Projekt mit Kubebuilder und erstellen Sie APIs, um automatisch CRDs, Controller und Konfigurationsdateien zu generieren. 3. Definieren Sie die Spezifikations- und Statusstrukturen von CRD in API/v1/myapp_types.go und rennen Sie Manifests, um CRD YAML zu generieren. 4. Implementieren Sie die Geschäftslogik in der Versöhnungsmethode des Controllers und verwenden Sie R.Create, R.Update und andere Methoden zur Verwaltung von Kubernetes -Ressourcen. 5. Definieren Sie die RBAC-Berechtigungen durch GO-Anmerkungen, erstellen Sie Bilder mithilfe von Manifests und machen Sie Docker-Build und stellen Sie sie über Kubectl ein oder machen Sie Bereitstellung. 6. Best Practices folgen: Stellen Sie die Abstimmung der logischen Idempotenz sicher, verarbeiten Sie Fehler angemessen und verwenden Sie Requeua, um Wiederholung zu steuern, Protokolle und Ereignisse hinzuzufügen und bei Bedarf Finalizer und Webhooks zu verwenden. 7. Verwenden Sie Envtest für Integrationstests und Fakeclient für Unit -Tests. Letztendlich besteht der Kern der Bedienerentwicklung darin, CRD zu definieren, harmonische Logik zu schreiben, die Controller-Runtime zu verwenden, um die K8s-Interaktion zu vereinfachen und Tests und Bereitstellungen durch reife Toolchains zu vervollständigen.

Entwicklung von Kubernetes -Betreibern in Go

Das Schreiben von Kubernetes -Operatoren in Go ist eine der effektivsten Möglichkeiten, um die Kubernetes -Steuerebene für die Verwaltung komplexer, staatlicher Anwendungen zu erweitern. Ein Bediener verwendet benutzerdefinierte Ressourcen (CRS) und Controller, um Aufgaben zu automatisieren, die ein menschlicher Bediener sonst ausführen würde - wie Backups, Skalierung, Upgrades und Failover. Go ist die natürliche Wahl, da Kubernetes selbst in Go geschrieben ist und das Ökosystem (wie Client-Go und Controller-Runtime) reif und gut dokumentiert ist.

Entwicklung von Kubernetes -Betreibern in Go

Hier ist ein praktischer Leitfaden, mit dem Sie anfangen und die Schlüsselkomponenten verstehen können.


1. Verstehen Sie das Operatormuster

Ein Operator kombiniert eine benutzerdefinierte Ressourcendefinition (CRD) mit einem Controller , der nach Änderungen dieser Ressource beobachtet und Maßnahmen ergriffen, um den gewünschten Zustand mit dem tatsächlichen Zustand des Clusters in Einklang zu bringen.

Entwicklung von Kubernetes -Betreibern in Go
  • Benutzerdefinierte Ressource (CR) : Ein YAML -Manifest, das den gewünschten Zustand Ihrer Anwendung definiert (z. B. MyAppDatabase ).
  • Controller : Ein GO -Programm, mit MyAppDatabase -Objekte beobachtet und Kubernetes -Ressourcen (z. B. Statefuls Sets, Services) mit der Spezifikation übereinstimmt.

Dies basiert auf der Informanten-Muster- und Versöhnungsschleife .


2. Verwenden Sie Kubebuilder und Controller-Runtime

Der einfachste Weg, einen Betreiber in Go zu bauen, besteht darin, Kubebuilder , Teil der Kubernetes Sigs, zu verwenden, die Projekte mit der Verwendung von Controller-Runtime -Projekten-eine Bibliothek, die Details auf niedrigem Niveau wie Client-Setup, Ereignisbearbeitung und Versöhnung übernimmt.

Entwicklung von Kubernetes -Betreibern in Go

Werkzeuge installieren:

 # Kubebuilder installieren
curl -l -o https://go.kubebuilder.io/dl/latest/$(go env Goos)/$ (Go Env Goarch)
tar -xzf kubebuilder _*_ $ (go env Goos) _ $ (go env goarch) .tar.gz
sudo mv kubebuilder _*_ $ (go env goos) _ $ (go env goarch)/usr/local/kubebuilder
Exportpfad = $ path:/usr/local/kubebuilder/bin

Erstellen Sie ein neues Projekt:

 Mkdir MyApp-Operator
CD MyApp-Operator
Kubebuilder init ---domain example.com ---repo example.com/myapp-operator
Kubebuilder erstellen API -Gruppen -Apps --version v1 -Kind MyApp

Dies erzeugt:

  • api/v1/myapp_types.go - Definieren Sie Ihr CRD -Schema.
  • controllers/myapp_controller.go - wo Sie eine Versöhnungslogik schreiben.
  • config/ - Kustomize Manifests für die Bereitstellung von CRD und RBAC.

3. Definieren Sie Ihre benutzerdefinierte Ressource

api/v1/myapp_types.go bearbeiten:

 Geben Sie MyAppspec struct {ein
    Replicas int32 `JSON:" Replicas "`
    Bildzeichenfolge `JSON:" Bild "`
    Port Int32 `JSON:" Port "`
}

Geben Sie MyAppstatus struct {ein {
    ReadyReplicas int32 `JSON:" ReadyReplicas "`
    Bedingungen [] metav1.Kondition `JSON:" Bedingungen, OmitEMpty "`
}

Run make manifests um CRD Yaml aus GO -Annotationen zu erzeugen.


4. Implementieren Sie die Versöhnungslogik

In controllers/myapp_controller.go wird die Reconcile aufgerufen, wenn sich eine MyApp -Ressource ändert.

 func (r *myAtreconciler) conc) (ctx context.context, req ctrl.request) (ctrl.result, error) {
    log: = r.log.withValues ("myapp", req.namespaceName)

    var myapp myapp
    wenn er err: = r.get (ctx, req.namespaceName, & myapp); err! = nil {
        return ctrl.result {}, client.ignorenotfound (err)
    }

    // Stellen Sie sicher, dass eine Bereitstellung vorliegt
    WANNEDDEP: = & appsv1.Deployment {
        Objektmeta: metav1.objectmeta {
            Name: myapp.name,
            Namespace: myapp.namespace,
        },
        Spec: Appsv1.DeploymentSpec {
            Repliken: & myapp.spec.replicas,
            Selector: & metav1.labelSelector {
                MatchLabels: Karte [String] String {"App": myapp.name},
            },
            Vorlage: corev1.podtemPlateSpec {
                Objektmeta: metav1.objectmeta {
                    Labels: Karte [String] String {"App": myapp.name},
                },
                Spec: corev1.podspec {
                    Container: [] corev1.container {
                        {
                            Name: "App",
                            Bild: myapp.spec.image,
                            Ports: [] corev1.containerport {{containerport: myapp.spec.port}},
                        },
                    },
                },
            },
        },
    }

    // Verwenden Sie den Client von Controller-Runtime, um zu erstellen oder zu aktualisieren
    wenn er err: = r.create (ctx, gewünschtdep); err! = nil {
        if! fehler.isalreadyexists (err) {
            return ctrl.result {}, err
        }
    }

    // Status aktualisieren
    MyApp.Status.Readyreplicas = 0 // Aktualisieren Sie aus der tatsächlichen Bereitstellung
    wenn er err: = r.Status (). Update (CTX, & myApp); err! = nil {
        return ctrl.result {}, err
    }

    return ctrl.result {}, nil
}

Verwenden Sie r.Create , r.Update , r.Patch oder r.Delete , um Objekte zu verwalten.


5. RBAC hinzufügen und bereitstellen

Kubebuilder verwendet GO -Anmerkungen, um RBAC -Regeln zu generieren:

 // Kubebuilder: RBAC: Gruppen = Apps.Example.com, Ressourcen = MyApps, Verbs = Get; Liste; Watch; creating; Update; Patch; Patch; löschen
// KUBEBUILD: RBAC: Gruppen = Apps, Ressourcen = Bereitstellungen, Verben = Get; List; Watch; creating; Update; Patch; löschen
// Kubebuilder: RBAC: Gruppen = Core, Ressourcen = Pods, Verben = Liste

Laufen:

 Manifests machen
Machen Sie Docker-Build IMG = MyApp-Operator: v0.0.1
kubectl anwenden -f -config/crd/bases/Apps.example.com_myapps.yaml
kubectl erstellen BereitstellungsmyApp-Operator-IMage = MyApp-Operator: v0.0.1

Oder verwenden Sie make deploy IMG=myapp-operator:v0.0.1 wenn das Standard-Kustomize-Setup verwendet wird.


6. Best Practices

  • Idempotenz : Stimmen Loops können mehrmals ausgeführt werden - die Operationen können sicher wiederholt werden.
  • Fehlerbehandlung : Rückgabefehler zur Anfrage zurück; Verwenden Sie ctrl.Result{RequeueAfter: time.Second} für periodische Überprüfungen.
  • Protokollierung & Ereignisse : Verwenden Sie r.Log und r.Recorder.Event() um Kubernetes -Ereignisse zu emittieren.
  • Finalizers : Verwenden Sie sie, wenn Sie die Reinigung durchführen müssen, bevor ein CR gelöscht wird.
  • Webhooks : Fügen Sie die Validierung (ValidatingAdmissionWebhook) oder Standardeinstellungen (MutatingAdmissionWebhook) über kubebuilder create webhook hinzu.

7. Tests

  • Verwenden Sie envtest für Integrationstests, die usw. und kube-apiserver lokal beginnen.
  • Schreiben Sie Unit -Tests für Ihre Versöhnungslogik mit fakeclient .

Beispiel -Test -Setup:

 importieren (
    "sigs.k8s.io/controller-runtime/pkg/envtest"
)

var Testenv *envTest. -Environment

Grundsätzlich läuft der Bau von Kubernetes -Betreibern in Go auf:

  • Definieren einer CRD mit kubebuilder
  • Schreiben eines Controllers, der den gewünschten und den tatsächlichen Zustand versöhnt
  • Verwenden von controller-runtime , um Kubernetes-Interaktionen zu verarbeiten
  • Testen mit envtest und Bereitstellung mit Standardmanifits

Es ist nicht trivial, aber das Werkzeug ist viel gereift-Kubebuilder und Controller-Runtime tun den größten Teil des schweren Hebens. Beginnen Sie klein, automatisieren Sie eine Sache gut und erweitern Sie von dort aus.

Das obige ist der detaillierte Inhalt vonEntwicklung von Kubernetes -Betreibern in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

PHP-Tutorial
1527
276
Wie kann man einen Go -Service anmutig beenden? Wie kann man einen Go -Service anmutig beenden? Aug 05, 2025 pm 08:21 PM

Usesignal.notify () tolistenforsigint/sigtermandtriggershutdown; 2.runtheHttpserverinagoroutineAndblocktilasignalisReced;

Wie man die aktuelle Zeit in Go bekommt Wie man die aktuelle Zeit in Go bekommt Aug 06, 2025 am 11:28 AM

Usetime.now () TogetTheScurrentLoclecimeasatime.TimeObject; 2.FormatThE-UNTERTHEFORMATMETHODWITHLAYOUTS LIEBEN "2006-01-0215: 04: 05";

So analysieren Sie XML -Daten in Go So analysieren Sie XML -Daten in Go Aug 05, 2025 pm 07:24 PM

Das Parsen von XML-Daten ist in GO sehr einfach. Verwenden Sie einfach das integrierte Codierungs-/XML-Paket. 1. Definieren Sie eine Struktur mit XML -Tag, um XML -Elemente und -attribute wie XML: "Name" entsprechende untergeordnete Elemente, XML: "Contact> E -Mail" zu verarbeiten, XML: "ID, Attr" liest Attribute; 2. Verwenden Sie XML.unmarshal, um XML -Zeichenfolgen in Strukturen zu analysieren. 3. Verwenden Sie für Dateien os.open, um sie zu öffnen und über XML.NewDeCoder zu dekodieren, was zum Streaming der Verarbeitung großer Dateien geeignet ist. 4. Bei der Verarbeitung doppelter Elemente in der Struktur

Erstellen einer serverlosen API mit Go und Cloud -Funktionen Erstellen einer serverlosen API mit Go und Cloud -Funktionen Aug 05, 2025 pm 01:21 PM

Um eine serverlose API zu erstellen, müssen Sie eine GO -Umgebung einrichten und GoogleCloudsDK installieren, dann eine HTTP -Funktion schreiben, um die Anforderung zu verarbeiten, und schließlich über GCLOUDCLI für CloudFunktionen bereitgestellt werden. 1. Installieren Sie Go1.18 und GoogleCloudsDK und konfigurieren Sie das Projekt. 2. Erstellen Sie GO -Module und schreiben Sie HTTP -Verarbeitungsfunktionen, unterstützen Sie Get- und Post -Methoden, verarbeiten Sie JSON -Eingaben und Rückgabeantwort. 3. Vereinfachen Sie den Code und behalten Sie nur die Handler -Funktion bei, entfernen Sie die lokale Serverlogik. 4. Verwenden Sie den Befehl gCloud, um die Funktion bereitzustellen, die Laufzeit-, Einstiegspunkt- und Triggermethode anzugeben. 5. Testen Sie die Get and Post -Schnittstellen der API, überprüfen Sie die Rückgabe

So erstellen und verwenden Sie benutzerdefinierte Fehlertypen in Go So erstellen und verwenden Sie benutzerdefinierte Fehlertypen in Go Aug 11, 2025 pm 11:08 PM

In GO kann das Erstellen und Gebrauch von benutzerdefinierten Fehlertypen die Ausdruckskraft und Debugierbarkeit des Fehlerbehandlung verbessern. Die Antwort besteht darin, einen benutzerdefinierten Fehler zu erstellen, indem eine Struktur definiert wird, die die METHOR () () implementiert. Beispielsweise enthält ValidationError Feld- und Nachrichtenfelder und gibt formatierte Fehlerinformationen zurück. Der Fehler kann dann in der Funktion zurückgegeben werden, wodurch bestimmte Fehlertypen durch Typbehandlungen oder Fehler erfasst werden. Sie können auch Verhaltensmethoden wie Iscritical zu benutzerdefinierten Fehlern hinzufügen, die für Szenarien geeignet sind, für die strukturierte Daten, differenzierte Verarbeitung, Bibliotheksexport oder API -Integration erforderlich sind. In einfachen Fällen können Fehler. Neue und vordefinierte Fehler wie ErrnotFound für vergleichbar verwendet werden

Wie kompilieren Sie eine Go-Anwendung? Wie kompilieren Sie eine Go-Anwendung? Aug 06, 2025 am 05:52 AM

Cross-compilingagoAnlicationisStraInightForwardusedBuilt-Insupportviagoosandgoarch.1.SetGoosForthetargetoperatingsystem (z

Wie man mit Panik umgeht und sich in Go erholt Wie man mit Panik umgeht und sich in Go erholt Aug 06, 2025 pm 02:08 PM

Die Wiederherstellungsfunktion muss in Verschiebung aufgerufen werden, um Panik zu erfassen. 2. Verwenden Sie die Wiederherstellung in langlebigen Programmen wie Goroutine oder Server, um zu verhindern, dass das gesamte Programm abstürzt. 3. Wiederherstellung sollte nicht missbraucht werden, nur bei der Behandlung verwendet werden, um zu vermeiden, dass das normale Fehlerbehebung ersetzt wird. 4. Best Practices umfassen die Aufzeichnung von Panikinformationen mit Debug.Stack (), um Stapelspuren zu erhalten und sich auf angemessener Ebene zu erholen. Wiederherstellung ist nur innerhalb von Aufschub gültig und sollte zum Debuggen mit Protokollen verwendet werden. Potenzielle Fehler können nicht ignoriert werden. Am Ende sollte der Code eher durch Rückgabefehler als in Panik ausgelegt werden.

So verwenden Sie Pfad/Filepath für die plattformübergreifende Pfadmanipulation in Go So verwenden Sie Pfad/Filepath für die plattformübergreifende Pfadmanipulation in Go Aug 08, 2025 pm 05:29 PM

UseFilepath.join () tosafelyconstructpathswithCorrectos-spezifische Sperrateure

See all articles