CustomResourceDefinitions (CRD) 允許使用者使用自己的 API 資源擴充 Kubernetes。監視這些資源的變化對於控制器和應用程式至關重要。但是,標準 client-go 函式庫預設無法辨識 CRD。
要使用 client-go 監視 CRD,請產生可識別您的特定 CRD 的自訂用戶端。這涉及使用 Kubernetes 提供的程式碼產生工具為 CRD 的 API 建立結構體和用戶端。
產生客戶端設定和控制器的建議方法是使用 kubebuilder。此工具可自動執行程式碼產生過程,簡化自訂客戶端的建立。
以下是來自範例控制器的簡化程式碼片段,用於監視CRD 的變更:
<code class="go">import ( "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/remotecommand" ) // watchCRD watches for new/changed CustomResourceDefinitions (CRDs). func watchCRD() error { // Create a new Kubernetes clientset. clientset, err := kubernetes.NewForConfig(restConfig) if err != nil { return errors.WithStack(err) } // Create an informer for list of CRDs. sharedInformerFactory := informers.NewSharedInformerFactory(clientset, 0) crdInformer := sharedInformerFactory.ApiextensionsV1().CustomResourceDefinitions().Informer() // Initialize the informer and wait for it to sync with API server. stopCh := make(chan struct{}) crdInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { crd := obj.(*apiextensionsv1.CustomResourceDefinition) // Handle newly added CRD. fmt.Println("New CRD added:", crd.Name) }, UpdateFunc: func(oldObj, newObj interface{}) { crd := newObj.(*apiextensionsv1.CustomResourceDefinition) // Handle updated CRD. fmt.Println("CRD updated:", crd.Name) }, DeleteFunc: func(obj interface{}) { crd := obj.(*apiextensionsv1.CustomResourceDefinition) // Handle deleted CRD. fmt.Println("CRD deleted:", crd.Name) }, }) sharedInformerFactory.Start(stopCh) <-wait.NeverStop return nil }</code>
在此範例中:
以上是如何使用 Client-go 觀察 Kubernetes 中的 CustomResourceDefinitions (CRD)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!