From da9b3b65dff6a467d2be52aa3014c8fcffc13fc7 Mon Sep 17 00:00:00 2001 From: yumaojun03 <719118794@qq.com> Date: Sun, 30 Mar 2025 10:59:33 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=8E=A7=E5=88=B6=E5=99=A8?= =?UTF-8?q?=E6=A0=B8=E5=BF=83=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1beta1/accessbinding_types.go | 10 ++--- .../crd/bases/devops.go17_accessbindings.yaml | 4 +- skills/operator/docs/arch.drawio | 39 ++++++++++++++---- .../controller/accessbinding_controller.go | 40 ++++++++++++++++++- 4 files changed, 77 insertions(+), 16 deletions(-) diff --git a/skills/operator/api/v1beta1/accessbinding_types.go b/skills/operator/api/v1beta1/accessbinding_types.go index d43e2b6..f52911e 100644 --- a/skills/operator/api/v1beta1/accessbinding_types.go +++ b/skills/operator/api/v1beta1/accessbinding_types.go @@ -36,7 +36,7 @@ type AccessBindingSpec struct { // AccessBindingStatus defines the observed state of AccessBinding. type AccessBindingStatus struct { - Status STATUS `json:"status"` + Stage STAGE `json:"stage"` // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster // Important: Run "make" to regenerate code after modifying this file // 服务的地址 Pod IP:Port, -->Traefic (4层) @@ -47,12 +47,12 @@ type AccessBindingStatus struct { Message string `json:"message,omitempty"` } -type STATUS string +type STAGE string const ( - STATUS_PENDDING = "" - STATUS_FAILED = "failed" - STAUTS_SUCCESS = "success" + STATUS_PENDDING STAGE = "" + STATUS_FAILED STAGE = "failed" + STAUTS_SUCCESS STAGE = "success" ) // +kubebuilder:object:root=true diff --git a/skills/operator/config/crd/bases/devops.go17_accessbindings.yaml b/skills/operator/config/crd/bases/devops.go17_accessbindings.yaml index 1af43bc..2da902c 100644 --- a/skills/operator/config/crd/bases/devops.go17_accessbindings.yaml +++ b/skills/operator/config/crd/bases/devops.go17_accessbindings.yaml @@ -62,10 +62,10 @@ spec: Important: Run "make" to regenerate code after modifying this file 服务的地址 Pod IP:Port, -->Traefic (4层) type: string - status: + stage: type: string required: - - status + - stage type: object type: object served: true diff --git a/skills/operator/docs/arch.drawio b/skills/operator/docs/arch.drawio index 9098127..0357c72 100644 --- a/skills/operator/docs/arch.drawio +++ b/skills/operator/docs/arch.drawio @@ -1,32 +1,55 @@ - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/skills/operator/internal/controller/accessbinding_controller.go b/skills/operator/internal/controller/accessbinding_controller.go index bb35ea9..08f5a92 100644 --- a/skills/operator/internal/controller/accessbinding_controller.go +++ b/skills/operator/internal/controller/accessbinding_controller.go @@ -19,11 +19,13 @@ package controller import ( "context" + apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" + "gitlab.com/go-course-project/go17/skills/operator/api/v1beta1" devopsv1beta1 "gitlab.com/go-course-project/go17/skills/operator/api/v1beta1" ) @@ -47,9 +49,45 @@ type AccessBindingReconciler struct { // For more details, check Reconcile and its Result here: // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.20.2/pkg/reconcile func (r *AccessBindingReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - _ = log.FromContext(ctx) + l := log.FromContext(ctx, "namesapce", req.Namespace) // TODO(user): your logic here + // 1. 获取对象, 可能有,也可能没有 + accessBinding := &v1beta1.AccessBinding{} + if err := r.Get(ctx, req.NamespacedName, accessBinding); err != nil { + if apierrors.IsNotFound(err) { + // 处理删除的逻辑 + // 1. 删除DNS记录 + // 2. 删除Traefik后端代理配置 + l.Info("处理删除的逻辑 ...") + return ctrl.Result{}, nil + } + + l.Error(err, "get access binding error") + return ctrl.Result{}, err + } + + // 2. 如果对象已经找到, 进行业务变更 + l.Info("access binding found", "name", accessBinding.Name) + switch accessBinding.Status.Stage { + case v1beta1.STATUS_PENDDING: + // 新增逻辑 + // 1. 添加DNS记录 + // 2. 添加后端代理 + l.Info("add accessbinding", "name", accessBinding.Name) + + // 变更完成后修改状态 + accessBinding.Status.Stage = v1beta1.STAUTS_SUCCESS + default: + // 变更逻辑 (namespace, deployment) + // 当前没有变更逻辑 + return ctrl.Result{}, nil + } + + // 3. 通过变更后的状态 + if err := r.Status().Update(ctx, accessBinding); err != nil { + l.Info("update status error", "name", accessBinding.Name) + } return ctrl.Result{}, nil }