以下是一些有用的 Operator 的簡單示例,這些示例展示了 Operator 的實際應用和功能。每個示例都是一個獨立的 Operator,用於處理特定的場景。
1. Nginx Operator
功能
管理 Nginx 例項的部署和配置。
示例
-
定義 CRD
api/v1/nginx_types.go
:type NginxSpec struct { Replicas int32 `json:"replicas"` } type NginxStatus struct { // 可以新增狀態欄位 }
-
實現控制器
controllers/nginx_controller.go
:func (r *NginxReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { ctx := context.Background() log := r.Log.WithValues("nginx", req.NamespacedName) var nginx examplev1.Nginx if err := r.Get(ctx, req.NamespacedName, &nginx); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } // 處理 Nginx 部署邏輯 deployment := &appsv1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: nginx.Name, Namespace: nginx.Namespace, }, Spec: appsv1.DeploymentSpec{ Replicas: &nginx.Spec.Replicas, Selector: &metav1.LabelSelector{ MatchLabels: map[string]string{"app": nginx.Name}, }, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"app": nginx.Name}, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ { Name: "nginx", Image: "nginx:latest", }, }, }, }, }, } if err := r.Create(ctx, deployment); err != nil { return ctrl.Result{}, err } return ctrl.Result{}, nil }
2. Custom Resource Operator for Database
功能
管理資料庫例項的生命週期(例如 PostgreSQL)。
示例
-
定義 CRD
api/v1/database_types.go
:type DatabaseSpec struct { Version string `json:"version"` } type DatabaseStatus struct { // 可以新增狀態欄位 }
-
實現控制器
controllers/database_controller.go
:func (r *DatabaseReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { ctx := context.Background() log := r.Log.WithValues("database", req.NamespacedName) var database examplev1.Database if err := r.Get(ctx, req.NamespacedName, &database); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } // 處理資料庫例項的部署邏輯 // 可以建立 StatefulSet 或 Deployment 來管理資料庫例項 return ctrl.Result{}, nil }
3. Backup Operator
功能
自動備份指定的資源(例如檔案系統或資料庫)。
示例
-
定義 CRD
api/v1/backup_types.go
:type BackupSpec struct { SourcePath string `json:"sourcePath"` DestinationPath string `json:"destinationPath"` } type BackupStatus struct { // 可以新增狀態欄位 }
-
實現控制器
controllers/backup_controller.go
:func (r *BackupReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { ctx := context.Background() log := r.Log.WithValues("backup", req.NamespacedName) var backup examplev1.Backup if err := r.Get(ctx, req.NamespacedName, &backup); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } // 處理備份邏輯,例如使用 CronJob 計劃任務 return ctrl.Result{}, nil }
4. HelloWorld Operator
功能
用於列印 "Hello, World!" 的訊息。
示例
-
定義 CRD
api/v1/helloworld_types.go
:type HelloWorldSpec struct { Message string `json:"message"` } type HelloWorldStatus struct { // 可以新增狀態欄位 }
-
實現控制器
controllers/helloworld_controller.go
:func (r *HelloWorldReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { ctx := context.Background() log := r.Log.WithValues("helloworld", req.NamespacedName) var helloWorld examplev1.HelloWorld if err := r.Get(ctx, req.NamespacedName, &helloWorld); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } log.Info("Hello, World!", "Message", helloWorld.Spec.Message) return ctrl.Result{}, nil }
結論
這些示例展示了不同型別的 Operator,可以用來管理各種資源或任務。每個 Operator 都有其特定的功能和實現方式,你可以根據自己的需求進行擴充套件和修改。這些示例提供了一個基礎,幫助你理解 Operator 的工作原理及其在 Kubernetes 中的應用。