Maison> développement back-end> Golang> le corps du texte

Création d'un contrôleur Kubernetes personnalisé dans Go

PHPz
Libérer: 2024-08-25 08:30:33
original
940 Les gens l'ont consulté

Avant d'implémenter un contrôleur personnalisé dans Go, comprenons d'abord ce qu'est le contrôleur Kubernetes et la définition des ressources client (CRD)

Contrôleur Kubernetes

Un contrôleur Kubernetes est un composant du plan de contrôle qui surveille en permanence l'état du cluster Kubernetes et prend des mesures pour garantir que l'état réel du cluster correspond à l'état souhaité. Il apporte des modifications en tentant de rapprocher l'état actuel de l'état souhaité.

Définition des ressources client (CRD)

La définition de ressources personnalisées (CRD) est un moyen d'étendre l'API Kubernetes pour créer nos propres ressources personnalisées. Ces ressources personnalisées peuvent représenter tout type d'objet que nous souhaitons gérer au sein de notre cluster Kubernetes.

Création de votre propre définition de ressource personnalisée (CRD)

apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: my-crds.com.shivam.kumar spec: group: com.shivam.kumar names: kind: my-crd plural: my-crds scope: Namespaced versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: apiVersion: type: string kind: type: string metadata: type: object spec: type: object properties: description: type: string
Copier après la connexion

Appliquez ce fichier à l'aide de la commande kubectl et lorsque nous voyons les crd disponibles dans notre cluster, nous pouvons voir le crd que nous avons créé-

Creating custom kubernetes controller in Go

Création d'une ressource personnalisée (CR)

apiVersion: com.shivam.kumar/v1 kind: my-crd metadata: name: my-custom-resource spec: description: "My CRD instance"
Copier après la connexion

Appliquez ce fichier à l'aide de la commande kubectl

Passons maintenant à la création de notre propre contrôleur personnalisé

Création d'un contrôleur Kubernetes personnalisé

package main import ( "context" "fmt" "path/filepath" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/dynamic" "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir" ) func main() { var kubeconfig string if home := homedir.HomeDir(); home != "" { kubeconfig = filepath.Join(home, ".kube", "config") } config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) if err != nil { fmt.Println("Falling back to in-cluster config") config, err = rest.InClusterConfig() if err != nil { panic(err.Error()) } } dynClient, err := dynamic.NewForConfig(config) if err != nil { panic(err.Error()) } thefoothebar := schema.GroupVersionResource{Group: "com.shivam.kumar", Version: "v1", Resource: "my-crds"} informer := cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { return dynClient.Resource(thefoothebar).Namespace("").List(context.TODO(), options) }, WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { return dynClient.Resource(thefoothebar).Namespace("").Watch(context.TODO(), options) }, }, &unstructured.Unstructured{}, 0, cache.Indexers{}, ) informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { fmt.Println("Add event detected:", obj) }, UpdateFunc: func(oldObj, newObj interface{}) { fmt.Println("Update event detected:", newObj) }, DeleteFunc: func(obj interface{}) { fmt.Println("Delete event detected:", obj) }, }) stop := make(chan struct{}) defer close(stop) go informer.Run(stop) if !cache.WaitForCacheSync(stop, informer.HasSynced) { panic("Timeout waiting for cache sync") } fmt.Println("Custom Resource Controller started successfully") <-stop }
Copier après la connexion

Maintenant, lorsque nous construisons ce programme Go et l'exécutons-
allez build -o k8s-controller .
./k8s-contrôleur

Maintenant, chaque fois que nous ajoutons, mettons à jour ou supprimons une ressource personnalisée créée ci-dessus, nous obtenons des journaux actifs dans notre terminal. cela signifie donc que notre contrôleur surveille notre CRD.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!