From 94139d70d839f51332e8229574c6d17f9e4706f2 Mon Sep 17 00:00:00 2001 From: Linying Assad Date: Sat, 25 Nov 2023 15:21:58 +0800 Subject: [PATCH] Refactor Doris monitor K8s app resources (#21) * Refactor prometheus deployment to statefulset * Refactor grafana deployment to statefulset * Refactor loki deployment to statefulset * update deploy resources --- api/v1beta1/dorismonitor_types.go | 44 ++++---- api/v1beta1/zz_generated.deepcopy.go | 18 +++- .../al-assad.github.io_dorismonitors.yaml | 45 +++----- config/rbac/role.yaml | 24 ----- .../doris-operator/crds/dorismonitor-crd.yaml | 45 +++----- deploy/kustomize/crds.yaml | 45 +++----- deploy/kustomize/kustomized.yaml | 69 +++--------- deploy/kustomize/rbac.yaml | 24 ----- .../controller/dorismonitor_controller.go | 3 +- internal/reconciler/monitor_reconciler.go | 60 ++++------- internal/reconciler/monitor_sync.go | 19 ++-- internal/transformer/grafana_resources.go | 87 ++++++--------- internal/transformer/loki_resources.go | 101 +++++++----------- internal/transformer/prometheus_resources.go | 97 ++++++----------- 14 files changed, 215 insertions(+), 466 deletions(-) diff --git a/api/v1beta1/dorismonitor_types.go b/api/v1beta1/dorismonitor_types.go index cf68510..44a5c82 100644 --- a/api/v1beta1/dorismonitor_types.go +++ b/api/v1beta1/dorismonitor_types.go @@ -101,7 +101,7 @@ type PrometheusSpec struct { corev1.ResourceRequirements `json:",inline"` // +optional - StorageClassName string `json:"storageClassName,omitempty"` + StorageClassName *string `json:"storageClassName,omitempty"` // +optional NodeSelector map[string]string `json:"nodeSelector,omitempty"` @@ -128,7 +128,7 @@ type GrafanaSpec struct { corev1.ResourceRequirements `json:",inline"` // +optional - StorageClassName string `json:"storageClassName,omitempty"` + StorageClassName *string `json:"storageClassName,omitempty"` // +optional NodeSelector map[string]string `json:"nodeSelector,omitempty"` @@ -148,7 +148,7 @@ type LokiSpec struct { corev1.ResourceRequirements `json:",inline"` // +optional - StorageClassName string `json:"storageClassName,omitempty"` + StorageClassName *string `json:"storageClassName,omitempty"` // +optional NodeSelector map[string]string `json:"nodeSelector,omitempty"` @@ -210,28 +210,25 @@ const ( MnrOprStageNamespacedServiceAccount DorisMonitorOprStage = "rbac/ServiceAccount" MnrOprStageNamespacedRoleBinding DorisMonitorOprStage = "rbac/RoleBinding" - MnrOprStagePrometheus DorisMonitorOprStage = "prometheus" - MnrOprStagePrometheusConfigMap DorisMonitorOprStage = "prometheus/ConfigMap" - MnrOprStagePrometheusService DorisMonitorOprStage = "prometheus/Service" - MnrOprStagePrometheusPVC DorisMonitorOprStage = "prometheus/PersistentVolumeClaim" - MnrOprStagePrometheusDeployment DorisMonitorOprStage = "prometheus/Deployment" + MnrOprStagePrometheus DorisMonitorOprStage = "prometheus" + MnrOprStagePrometheusConfigMap DorisMonitorOprStage = "prometheus/ConfigMap" + MnrOprStagePrometheusService DorisMonitorOprStage = "prometheus/Service" + MnrOprStagePrometheusStatefulset DorisMonitorOprStage = "prometheus/Statefulset" - MnrOprStageGrafana DorisMonitorOprStage = "grafana" - MnrOprStageGrafanaSecret DorisMonitorOprStage = "grafana/Secret" - MnrOprStageGrafanaConfigMap DorisMonitorOprStage = "grafana/ConfigMap" - MnrOprStageGrafanaService DorisMonitorOprStage = "grafana/Service" - MnrOprStageGrafanaPVC DorisMonitorOprStage = "grafana/PersistentVolumeClaim" - MnrOprStageGrafanaDeployment DorisMonitorOprStage = "grafana/Deployment" + MnrOprStageGrafana DorisMonitorOprStage = "grafana" + MnrOprStageGrafanaSecret DorisMonitorOprStage = "grafana/Secret" + MnrOprStageGrafanaConfigMap DorisMonitorOprStage = "grafana/ConfigMap" + MnrOprStageGrafanaService DorisMonitorOprStage = "grafana/Service" + MnrOprStageGrafanaStatefulset DorisMonitorOprStage = "grafana/Statefulset" MnrOprStagePromtail DorisMonitorOprStage = "promtail" MnrOprStagePromtailConfigMap DorisMonitorOprStage = "promtail/ConfigMap" MnrOprStagePromtailDaemonSet DorisMonitorOprStage = "promtail/DemonSet" - MnrOprStageLoki DorisMonitorOprStage = "loki" - MnrOprStageLokiConfigMap DorisMonitorOprStage = "loki/ConfigMap" - MnrOprStageLokiService DorisMonitorOprStage = "loki/Service" - MnrOprStageLokiPVC DorisMonitorOprStage = "loki/PersistentVolumeClaim" - MnrOprStageLokiDeployment DorisMonitorOprStage = "loki/Deployment" + MnrOprStageLoki DorisMonitorOprStage = "loki" + MnrOprStageLokiConfigMap DorisMonitorOprStage = "loki/ConfigMap" + MnrOprStageLokiService DorisMonitorOprStage = "loki/Service" + MnrOprStageLokiStatefulset DorisMonitorOprStage = "loki/Statefulset" MnrOprStageCompleted DorisMonitorOprStage = "completed" ) @@ -260,11 +257,10 @@ type PromtailStatus struct { // DorisMonitorComponentStatus defines the status of the doris monitor component type DorisMonitorComponentStatus struct { - ServiceRef NamespacedName `json:"serviceRef,omitempty"` - DeploymentRef NamespacedName `json:"deploymentRef,omitempty"` - PVCRef NamespacedName `json:"pvcRef,omitempty"` - Ready bool `json:"ready,omitempty"` - Conditions []apps.DeploymentCondition `json:"conditions,omitempty"` + ServiceRef NamespacedName `json:"serviceRef,omitempty"` + StatefulsetRef NamespacedName `json:"statefulsetRef,omitempty"` + Ready bool `json:"ready,omitempty"` + Conditions []apps.DeploymentCondition `json:"conditions,omitempty"` } func init() { diff --git a/api/v1beta1/zz_generated.deepcopy.go b/api/v1beta1/zz_generated.deepcopy.go index cb46652..3e2ec6f 100644 --- a/api/v1beta1/zz_generated.deepcopy.go +++ b/api/v1beta1/zz_generated.deepcopy.go @@ -870,8 +870,7 @@ func (in *DorisMonitor) DeepCopyObject() runtime.Object { func (in *DorisMonitorComponentStatus) DeepCopyInto(out *DorisMonitorComponentStatus) { *out = *in out.ServiceRef = in.ServiceRef - out.DeploymentRef = in.DeploymentRef - out.PVCRef = in.PVCRef + out.StatefulsetRef = in.StatefulsetRef if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions *out = make([]appsv1.DeploymentCondition, len(*in)) @@ -1113,6 +1112,11 @@ func (in *GrafanaSpec) DeepCopyInto(out *GrafanaSpec) { (*in).DeepCopyInto(*out) } in.ResourceRequirements.DeepCopyInto(&out.ResourceRequirements) + if in.StorageClassName != nil { + in, out := &in.StorageClassName, &out.StorageClassName + *out = new(string) + **out = **in + } if in.NodeSelector != nil { in, out := &in.NodeSelector, &out.NodeSelector *out = make(map[string]string, len(*in)) @@ -1199,6 +1203,11 @@ func (in *LokiSpec) DeepCopyInto(out *LokiSpec) { **out = **in } in.ResourceRequirements.DeepCopyInto(&out.ResourceRequirements) + if in.StorageClassName != nil { + in, out := &in.StorageClassName, &out.StorageClassName + *out = new(string) + **out = **in + } if in.NodeSelector != nil { in, out := &in.NodeSelector, &out.NodeSelector *out = make(map[string]string, len(*in)) @@ -1288,6 +1297,11 @@ func (in *PrometheusSpec) DeepCopyInto(out *PrometheusSpec) { (*in).DeepCopyInto(*out) } in.ResourceRequirements.DeepCopyInto(&out.ResourceRequirements) + if in.StorageClassName != nil { + in, out := &in.StorageClassName, &out.StorageClassName + *out = new(string) + **out = **in + } if in.NodeSelector != nil { in, out := &in.NodeSelector, &out.NodeSelector *out = make(map[string]string, len(*in)) diff --git a/config/crd/bases/al-assad.github.io_dorismonitors.yaml b/config/crd/bases/al-assad.github.io_dorismonitors.yaml index fc73964..28a929b 100644 --- a/config/crd/bases/al-assad.github.io_dorismonitors.yaml +++ b/config/crd/bases/al-assad.github.io_dorismonitors.yaml @@ -265,23 +265,16 @@ spec: - type type: object type: array - deploymentRef: - properties: - name: - type: string - namespace: - type: string - type: object - pvcRef: + ready: + type: boolean + serviceRef: properties: name: type: string namespace: type: string type: object - ready: - type: boolean - serviceRef: + statefulsetRef: properties: name: type: string @@ -317,23 +310,16 @@ spec: - type type: object type: array - deploymentRef: - properties: - name: - type: string - namespace: - type: string - type: object - pvcRef: + ready: + type: boolean + serviceRef: properties: name: type: string namespace: type: string type: object - ready: - type: boolean - serviceRef: + statefulsetRef: properties: name: type: string @@ -365,23 +351,16 @@ spec: - type type: object type: array - deploymentRef: - properties: - name: - type: string - namespace: - type: string - type: object - pvcRef: + ready: + type: boolean + serviceRef: properties: name: type: string namespace: type: string type: object - ready: - type: boolean - serviceRef: + statefulsetRef: properties: name: type: string diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index b08c570..bfb9f41 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -120,18 +120,6 @@ rules: - patch - update - watch -- apiGroups: - - apps - resources: - - deployments - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - apiGroups: - apps resources: @@ -180,18 +168,6 @@ rules: - patch - update - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - apiGroups: - "" resources: diff --git a/deploy/helm/doris-operator/crds/dorismonitor-crd.yaml b/deploy/helm/doris-operator/crds/dorismonitor-crd.yaml index c92467a..2607558 100644 --- a/deploy/helm/doris-operator/crds/dorismonitor-crd.yaml +++ b/deploy/helm/doris-operator/crds/dorismonitor-crd.yaml @@ -264,23 +264,16 @@ spec: - type type: object type: array - deploymentRef: - properties: - name: - type: string - namespace: - type: string - type: object - pvcRef: + ready: + type: boolean + serviceRef: properties: name: type: string namespace: type: string type: object - ready: - type: boolean - serviceRef: + statefulsetRef: properties: name: type: string @@ -316,23 +309,16 @@ spec: - type type: object type: array - deploymentRef: - properties: - name: - type: string - namespace: - type: string - type: object - pvcRef: + ready: + type: boolean + serviceRef: properties: name: type: string namespace: type: string type: object - ready: - type: boolean - serviceRef: + statefulsetRef: properties: name: type: string @@ -364,23 +350,16 @@ spec: - type type: object type: array - deploymentRef: - properties: - name: - type: string - namespace: - type: string - type: object - pvcRef: + ready: + type: boolean + serviceRef: properties: name: type: string namespace: type: string type: object - ready: - type: boolean - serviceRef: + statefulsetRef: properties: name: type: string diff --git a/deploy/kustomize/crds.yaml b/deploy/kustomize/crds.yaml index 9d9f982..2077770 100644 --- a/deploy/kustomize/crds.yaml +++ b/deploy/kustomize/crds.yaml @@ -9243,23 +9243,16 @@ spec: - type type: object type: array - deploymentRef: - properties: - name: - type: string - namespace: - type: string - type: object - pvcRef: + ready: + type: boolean + serviceRef: properties: name: type: string namespace: type: string type: object - ready: - type: boolean - serviceRef: + statefulsetRef: properties: name: type: string @@ -9295,23 +9288,16 @@ spec: - type type: object type: array - deploymentRef: - properties: - name: - type: string - namespace: - type: string - type: object - pvcRef: + ready: + type: boolean + serviceRef: properties: name: type: string namespace: type: string type: object - ready: - type: boolean - serviceRef: + statefulsetRef: properties: name: type: string @@ -9343,23 +9329,16 @@ spec: - type type: object type: array - deploymentRef: - properties: - name: - type: string - namespace: - type: string - type: object - pvcRef: + ready: + type: boolean + serviceRef: properties: name: type: string namespace: type: string type: object - ready: - type: boolean - serviceRef: + statefulsetRef: properties: name: type: string diff --git a/deploy/kustomize/kustomized.yaml b/deploy/kustomize/kustomized.yaml index 5d4b693..1c2cdde 100644 --- a/deploy/kustomize/kustomized.yaml +++ b/deploy/kustomize/kustomized.yaml @@ -9256,23 +9256,16 @@ spec: - type type: object type: array - deploymentRef: - properties: - name: - type: string - namespace: - type: string - type: object - pvcRef: + ready: + type: boolean + serviceRef: properties: name: type: string namespace: type: string type: object - ready: - type: boolean - serviceRef: + statefulsetRef: properties: name: type: string @@ -9308,23 +9301,16 @@ spec: - type type: object type: array - deploymentRef: - properties: - name: - type: string - namespace: - type: string - type: object - pvcRef: + ready: + type: boolean + serviceRef: properties: name: type: string namespace: type: string type: object - ready: - type: boolean - serviceRef: + statefulsetRef: properties: name: type: string @@ -9356,23 +9342,16 @@ spec: - type type: object type: array - deploymentRef: - properties: - name: - type: string - namespace: - type: string - type: object - pvcRef: + ready: + type: boolean + serviceRef: properties: name: type: string namespace: type: string type: object - ready: - type: boolean - serviceRef: + statefulsetRef: properties: name: type: string @@ -9603,18 +9582,6 @@ rules: - patch - update - watch -- apiGroups: - - apps - resources: - - deployments - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - apiGroups: - apps resources: @@ -9663,18 +9630,6 @@ rules: - patch - update - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - apiGroups: - "" resources: diff --git a/deploy/kustomize/rbac.yaml b/deploy/kustomize/rbac.yaml index 0f0a5a0..e9f388d 100644 --- a/deploy/kustomize/rbac.yaml +++ b/deploy/kustomize/rbac.yaml @@ -176,18 +176,6 @@ rules: - patch - update - watch -- apiGroups: - - apps - resources: - - deployments - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - apiGroups: - apps resources: @@ -236,18 +224,6 @@ rules: - patch - update - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - apiGroups: - "" resources: diff --git a/internal/controller/dorismonitor_controller.go b/internal/controller/dorismonitor_controller.go index cb8ce89..4d36f91 100644 --- a/internal/controller/dorismonitor_controller.go +++ b/internal/controller/dorismonitor_controller.go @@ -38,12 +38,11 @@ type DorisMonitorReconciler struct { //+kubebuilder:rbac:groups=al-assad.github.io,resources=dorismonitors/status,verbs=get;update;patch //+kubebuilder:rbac:groups=al-assad.github.io,resources=dorismonitors/finalizers,verbs=update //+kubebuilder:rbac:groups=core,resources=services,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=apps,resources=statefulsets,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=apps,resources=daemonsets,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=core,resources=serviceaccounts,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=core,resources=configmaps,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=core,resources=persistentvolumeclaims,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=roles,verbs=get;list;watch;create;bind;escalate //+kubebuilder:rbac:groups=rbac.authorization.k8s.io,resources=rolebindings,verbs=get;list;watch;create diff --git a/internal/reconciler/monitor_reconciler.go b/internal/reconciler/monitor_reconciler.go index 1a69036..840ed33 100644 --- a/internal/reconciler/monitor_reconciler.go +++ b/internal/reconciler/monitor_reconciler.go @@ -110,7 +110,7 @@ func (r *DorisMonitorReconciler) recRbacResources() MonitorStageRecResult { // reconcile rbac resources used by the DorisMonitor func (r *DorisMonitorReconciler) recPrometheusResources() MonitorStageRecResult { action := dapi.StageActionApply - // config map + // configmap configMap, genConfErr := tran.MakePrometheusConfigMap(r.CR, r.Schema) if genConfErr != nil { return mnrStageFail(dapi.MnrOprStagePrometheusConfigMap, action, genConfErr) @@ -123,16 +123,11 @@ func (r *DorisMonitorReconciler) recPrometheusResources() MonitorStageRecResult if err := r.CreateOrUpdate(service, &corev1.Service{}); err != nil { return mnrStageFail(dapi.MnrOprStagePrometheusService, action, err) } - // pvc - pvc := tran.MakePrometheusPVC(r.CR, r.Schema) - if err := r.CreateWhenNotExist(pvc, &corev1.PersistentVolumeClaim{}); err != nil { - return mnrStageFail(dapi.MnrOprStagePrometheusPVC, action, err) - } - // deployment - deployment := tran.MakePrometheusDeployment(r.CR, r.Schema) - deployment.Spec.Template.Annotations[PrometheusConfHashAnnotationKey] = util.Md5HashOr(configMap.Data, "") - if err := r.CreateOrUpdate(deployment, &appv1.Deployment{}); err != nil { - return mnrStageFail(dapi.MnrOprStagePrometheusDeployment, action, err) + // statefulset + statefulset := tran.MakePrometheusStatefulset(r.CR, r.Schema) + statefulset.Spec.Template.Annotations[PrometheusConfHashAnnotationKey] = util.Md5HashOr(configMap.Data, "") + if err := r.CreateOrUpdate(statefulset, &appv1.StatefulSet{}); err != nil { + return mnrStageFail(dapi.MnrOprStagePrometheusStatefulset, action, err) } return mnrStageSucc(dapi.MnrOprStagePrometheus, action) } @@ -158,16 +153,11 @@ func (r *DorisMonitorReconciler) recGrafanaResources() MonitorStageRecResult { if err := r.CreateOrUpdate(service, &corev1.Service{}); err != nil { return mnrStageFail(dapi.MnrOprStageGrafanaService, action, err) } - // pvc - pvc := tran.MakeGrafanaPVC(r.CR, r.Schema) - if err := r.CreateWhenNotExist(pvc, &corev1.PersistentVolumeClaim{}); err != nil { - return mnrStageFail(dapi.MnrOprStageGrafanaPVC, action, err) - } - // deployment - deployment := tran.MakeGrafanaDeployment(r.CR, r.Schema) - deployment.Spec.Template.Annotations[GrafanaConfHashAnnotationKey] = util.Md5HashOr(configMap.Data, "") - if err := r.CreateOrUpdate(deployment, &appv1.Deployment{}); err != nil { - return mnrStageFail(dapi.MnrOprStageGrafanaDeployment, action, err) + // statefulset + statefulset := tran.MakeGrafanaStatefulset(r.CR, r.Schema) + statefulset.Spec.Template.Annotations[GrafanaConfHashAnnotationKey] = util.Md5HashOr(configMap.Data, "") + if err := r.CreateOrUpdate(statefulset, &appv1.StatefulSet{}); err != nil { + return mnrStageFail(dapi.MnrOprStageGrafanaStatefulset, action, err) } return mnrStageSucc(dapi.MnrOprStageGrafana, action) } @@ -190,16 +180,11 @@ func (r *DorisMonitorReconciler) recLokiResources() MonitorStageRecResult { if err := r.CreateOrUpdate(service, &corev1.Service{}); err != nil { return mnrStageFail(dapi.MnrOprStageLokiService, action, err) } - // pvc - pvc := tran.MakeLokiPVC(r.CR, r.Schema) - if err := r.CreateWhenNotExist(pvc, &corev1.PersistentVolumeClaim{}); err != nil { - return mnrStageFail(dapi.MnrOprStageLokiPVC, action, err) - } - // deployment - deployment := tran.MakeLokiDeployment(r.CR, r.Schema) - deployment.Spec.Template.Annotations[LokiConfHashAnnotationKey] = util.Md5HashOr(configMap.Data, "") - if err := r.CreateOrUpdate(deployment, &appv1.Deployment{}); err != nil { - return mnrStageFail(dapi.MnrOprStageLokiDeployment, action, err) + // statefulset + statefulset := tran.MakeLokiStatefulset(r.CR, r.Schema) + statefulset.Spec.Template.Annotations[LokiConfHashAnnotationKey] = util.Md5HashOr(configMap.Data, "") + if err := r.CreateOrUpdate(statefulset, &appv1.StatefulSet{}); err != nil { + return mnrStageFail(dapi.MnrOprStageLokiStatefulset, action, err) } return mnrStageSucc(dapi.MnrOprStageLoki, action) } @@ -217,15 +202,10 @@ func (r *DorisMonitorReconciler) recLokiResources() MonitorStageRecResult { if err := r.DeleteWhenExist(serviceRef, &corev1.Service{}); err != nil { return mnrStageFail(dapi.MnrOprStageLokiService, action, err) } - // pvc - pvcRef := tran.GetLokiPVCKey(r.CR.ObjKey()) - if err := r.DeleteWhenExist(pvcRef, &corev1.PersistentVolumeClaim{}); err != nil { - return mnrStageFail(dapi.MnrOprStageLokiPVC, action, err) - } - // deployment - deploymentRef := tran.GetLokiDeploymentKey(r.CR.ObjKey()) - if err := r.DeleteWhenExist(deploymentRef, &corev1.PersistentVolumeClaim{}); err != nil { - return mnrStageFail(dapi.MnrOprStageLokiDeployment, action, err) + // statefulset + statefulsetRef := tran.GetLokiStatefulsetKey(r.CR.ObjKey()) + if err := r.DeleteWhenExist(statefulsetRef, &appv1.StatefulSet{}); err != nil { + return mnrStageFail(dapi.MnrOprStageLokiStatefulset, action, err) } return mnrStageSucc(dapi.MnrOprStageLoki, action) } diff --git a/internal/reconciler/monitor_sync.go b/internal/reconciler/monitor_sync.go index 0fc371a..3b061b3 100644 --- a/internal/reconciler/monitor_sync.go +++ b/internal/reconciler/monitor_sync.go @@ -77,30 +77,27 @@ func (r *DorisMonitorReconciler) Sync() (dapi.DorisMonitorSyncStatus, error) { func (r *DorisMonitorReconciler) syncPrometheusStatus() (dapi.PrometheusStatus, error) { status := util.PointerDeRefer(r.CR.Status.Prometheus.DeepCopy(), dapi.PrometheusStatus{}) serviceKey := tran.GetPrometheusServiceKey(r.CR.ObjKey()) - pvcKey := tran.GetPrometheusPVCKey(r.CR.ObjKey()) - deployKey := tran.GetPrometheusDeploymentKey(r.CR.ObjKey()) + stsKey := tran.GetPrometheusStatefulsetKey(r.CR.ObjKey()) - err := r.fillMonitorComponentStatus(&status.DorisMonitorComponentStatus, serviceKey, pvcKey, deployKey) + err := r.fillMonitorComponentStatus(&status.DorisMonitorComponentStatus, serviceKey, stsKey) return status, err } func (r *DorisMonitorReconciler) syncGrafanaStatus() (dapi.GrafanaStatus, error) { status := util.PointerDeRefer(r.CR.Status.Grafana.DeepCopy(), dapi.GrafanaStatus{}) serviceKey := tran.GetGrafanaServiceKey(r.CR.ObjKey()) - pvcKey := tran.GetGrafanaPVCKey(r.CR.ObjKey()) - deployKey := tran.GetGrafanaDeploymentKey(r.CR.ObjKey()) + stsKey := tran.GetGrafanaStatefulsetKey(r.CR.ObjKey()) - err := r.fillMonitorComponentStatus(&status.DorisMonitorComponentStatus, serviceKey, pvcKey, deployKey) + err := r.fillMonitorComponentStatus(&status.DorisMonitorComponentStatus, serviceKey, stsKey) return status, err } func (r *DorisMonitorReconciler) syncLokiStatus() (dapi.LokiStatus, error) { status := util.PointerDeRefer(r.CR.Status.Loki.DeepCopy(), dapi.LokiStatus{}) serviceKey := tran.GetLokiServiceKey(r.CR.ObjKey()) - pvcKey := tran.GetLokiPVCKey(r.CR.ObjKey()) - deployKey := tran.GetLokiDeploymentKey(r.CR.ObjKey()) + stsKey := tran.GetLokiStatefulsetKey(r.CR.ObjKey()) - err := r.fillMonitorComponentStatus(&status.DorisMonitorComponentStatus, serviceKey, pvcKey, deployKey) + err := r.fillMonitorComponentStatus(&status.DorisMonitorComponentStatus, serviceKey, stsKey) return status, err } @@ -125,12 +122,10 @@ func (r *DorisMonitorReconciler) syncPromtailStatus() (dapi.PromtailStatus, erro func (r *DorisMonitorReconciler) fillMonitorComponentStatus( baseStatus *dapi.DorisMonitorComponentStatus, serviceKey types.NamespacedName, - pvcKey types.NamespacedName, deploymentKey types.NamespacedName) error { baseStatus.ServiceRef = dapi.NewNamespacedName(serviceKey) - baseStatus.PVCRef = dapi.NewNamespacedName(pvcKey) - baseStatus.DeploymentRef = dapi.NewNamespacedName(deploymentKey) + baseStatus.StatefulsetRef = dapi.NewNamespacedName(deploymentKey) // Get deployment status deploy := &appv1.Deployment{} diff --git a/internal/transformer/grafana_resources.go b/internal/transformer/grafana_resources.go index 0a42d59..760ba20 100644 --- a/internal/transformer/grafana_resources.go +++ b/internal/transformer/grafana_resources.go @@ -72,14 +72,7 @@ func GetGrafanaServiceKey(monitorKey types.NamespacedName) types.NamespacedName } } -func GetGrafanaPVCKey(monitorKey types.NamespacedName) types.NamespacedName { - return types.NamespacedName{ - Namespace: monitorKey.Namespace, - Name: fmt.Sprintf("%s-grafana-pvc", monitorKey.Name), - } -} - -func GetGrafanaDeploymentKey(monitorKey types.NamespacedName) types.NamespacedName { +func GetGrafanaStatefulsetKey(monitorKey types.NamespacedName) types.NamespacedName { return types.NamespacedName{ Namespace: monitorKey.Namespace, Name: fmt.Sprintf("%s-grafana", monitorKey.Name), @@ -197,37 +190,7 @@ func MakeGrafanaService(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *corev1.S return service } -func MakeGrafanaPVC(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *corev1.PersistentVolumeClaim { - if cr.Spec.Cluster == "" { - return nil - } - clusterRef := types.NamespacedName{ - Namespace: cr.Namespace, - Name: cr.Spec.Cluster, - } - pvcRef := GetGrafanaPVCKey(cr.ObjKey()) - labels := GetGrafanaLabels(clusterRef) - - pvc := &corev1.PersistentVolumeClaim{ - ObjectMeta: metav1.ObjectMeta{ - Name: pvcRef.Name, - Namespace: pvcRef.Namespace, - Labels: labels, - }, - Spec: corev1.PersistentVolumeClaimSpec{ - AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}, - StorageClassName: cr.Spec.StorageClassName, - }, - } - storageRequest := cr.Spec.Grafana.Requests.Storage() - if storageRequest != nil { - pvc.Spec.Resources.Requests = corev1.ResourceList{corev1.ResourceStorage: *storageRequest} - } - _ = controllerutil.SetOwnerReference(cr, pvc, scheme) - return pvc -} - -func MakeGrafanaDeployment(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *appv1.Deployment { +func MakeGrafanaStatefulset(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *appv1.StatefulSet { if cr.Spec.Cluster == "" { return nil } @@ -235,10 +198,9 @@ func MakeGrafanaDeployment(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *appv1 Namespace: cr.Namespace, Name: cr.Spec.Cluster, } - deploymentRef := GetGrafanaDeploymentKey(cr.ObjKey()) + statefulsetRef := GetGrafanaStatefulsetKey(cr.ObjKey()) configMapRef := GetGrafanaConfigMapKey(cr.ObjKey()) secretRef := GetGrafanaSecretKey(cr.ObjKey()) - pvcRef := GetGrafanaPVCKey(cr.ObjKey()) labels := GetGrafanaLabels(clusterRef) replicas := int32(1) @@ -265,10 +227,7 @@ func MakeGrafanaDeployment(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *appv1 "dashboards.json": "doris-cluster-dashboards.json", "dashboard.yml": "dashboard.yml", }), - }, { - Name: "grafana-data", - VolumeSource: corev1.VolumeSource{ - PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ClaimName: pvcRef.Name}}}, + }, }, Containers: []corev1.Container{{ Name: "grafana", @@ -307,20 +266,36 @@ func MakeGrafanaDeployment(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *appv1 }, } - // deployment - deployment := &appv1.Deployment{ + // volume claim template + pvc := corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "grafana-data", + }, + Spec: corev1.PersistentVolumeClaimSpec{ + AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}, + StorageClassName: util.PointerFallback(cr.Spec.Grafana.StorageClassName, cr.Spec.StorageClassName), + }, + } + if storageRequest := cr.Spec.Grafana.Requests.Storage(); storageRequest != nil { + pvc.Spec.Resources.Requests = corev1.ResourceList{corev1.ResourceStorage: *storageRequest} + } + + // statefulset + statefulset := &appv1.StatefulSet{ ObjectMeta: metav1.ObjectMeta{ - Name: deploymentRef.Name, - Namespace: deploymentRef.Namespace, + Name: statefulsetRef.Name, + Namespace: statefulsetRef.Namespace, Labels: labels, }, - Spec: appv1.DeploymentSpec{ - Replicas: &replicas, - Selector: &metav1.LabelSelector{MatchLabels: labels}, - Template: podTemplate, + Spec: appv1.StatefulSetSpec{ + ServiceName: GetGrafanaServiceKey(cr.ObjKey()).Name, + Replicas: &replicas, + Selector: &metav1.LabelSelector{MatchLabels: labels}, + Template: podTemplate, + VolumeClaimTemplates: []corev1.PersistentVolumeClaim{pvc}, }, } - _ = controllerutil.SetOwnerReference(cr, deployment, scheme) - _ = controllerutil.SetControllerReference(cr, deployment, scheme) - return deployment + _ = controllerutil.SetOwnerReference(cr, statefulset, scheme) + _ = controllerutil.SetControllerReference(cr, statefulset, scheme) + return statefulset } diff --git a/internal/transformer/loki_resources.go b/internal/transformer/loki_resources.go index 02e46d7..d9520a7 100644 --- a/internal/transformer/loki_resources.go +++ b/internal/transformer/loki_resources.go @@ -62,14 +62,7 @@ func GetLokiServiceKey(monitorKey types.NamespacedName) types.NamespacedName { } } -func GetLokiPVCKey(monitorKey types.NamespacedName) types.NamespacedName { - return types.NamespacedName{ - Namespace: monitorKey.Namespace, - Name: fmt.Sprintf("%s-loki-pvc", monitorKey.Name), - } -} - -func GetLokiDeploymentKey(monitorKey types.NamespacedName) types.NamespacedName { +func GetLokiStatefulsetKey(monitorKey types.NamespacedName) types.NamespacedName { return types.NamespacedName{ Namespace: monitorKey.Namespace, Name: fmt.Sprintf("%s-loki", monitorKey.Name), @@ -141,7 +134,7 @@ func MakeLokiService(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *corev1.Serv return service } -func MakeLokiPVC(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *corev1.PersistentVolumeClaim { +func MakeLokiStatefulset(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *appv1.StatefulSet { if cr.Spec.Cluster == "" || cr.Spec.DisableLoki { return nil } @@ -149,39 +142,8 @@ func MakeLokiPVC(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *corev1.Persiste Namespace: cr.Namespace, Name: cr.Spec.Cluster, } - pvcRef := GetLokiPVCKey(cr.ObjKey()) - labels := GetLokiLabels(clusterRef) - - pvc := &corev1.PersistentVolumeClaim{ - ObjectMeta: metav1.ObjectMeta{ - Name: pvcRef.Name, - Namespace: pvcRef.Namespace, - Labels: labels, - }, - Spec: corev1.PersistentVolumeClaimSpec{ - AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}, - StorageClassName: cr.Spec.StorageClassName, - }, - } - storageRequest := cr.Spec.Loki.Requests.Storage() - if storageRequest != nil { - pvc.Spec.Resources.Requests = corev1.ResourceList{corev1.ResourceStorage: *storageRequest} - } - _ = controllerutil.SetOwnerReference(cr, pvc, scheme) - return pvc -} - -func MakeLokiDeployment(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *appv1.Deployment { - if cr.Spec.Cluster == "" || cr.Spec.DisableLoki { - return nil - } - clusterRef := types.NamespacedName{ - Namespace: cr.Namespace, - Name: cr.Spec.Cluster, - } - deploymentRef := GetLokiDeploymentKey(cr.ObjKey()) + statefulsetRef := GetLokiStatefulsetKey(cr.ObjKey()) configMapRef := GetLokiConfigMapKey(cr.ObjKey()) - pvcRef := GetLokiPVCKey(cr.ObjKey()) labels := GetLokiLabels(clusterRef) replicas := int32(1) @@ -195,16 +157,11 @@ func MakeLokiDeployment(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *appv1.De ServiceAccountName: cr.Spec.ServiceAccount, ImagePullSecrets: cr.Spec.ImagePullSecrets, NodeSelector: util.MapFallback(cr.Spec.Loki.NodeSelector, cr.Spec.NodeSelector), - Volumes: []corev1.Volume{ - { - Name: "config", - VolumeSource: util.NewConfigMapItemsVolumeSource( - configMapRef.Name, map[string]string{"loki.yml": "loki.yml"}), - }, { - Name: "data", - VolumeSource: corev1.VolumeSource{ - PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ClaimName: pvcRef.Name}}}, - }, + Volumes: []corev1.Volume{{ + Name: "config", + VolumeSource: util.NewConfigMapItemsVolumeSource( + configMapRef.Name, map[string]string{"loki.yml": "loki.yml"}), + }}, Containers: []corev1.Container{{ Name: "loki", Image: util.StringFallback(cr.Spec.Loki.Image, DefaultLokiImage), @@ -222,8 +179,8 @@ func MakeLokiDeployment(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *appv1.De Protocol: corev1.ProtocolTCP, }}, VolumeMounts: []corev1.VolumeMount{ - {Name: "config", MountPath: "/etc/loki"}, - {Name: "data", MountPath: "/data"}, + {Name: "loki-config", MountPath: "/etc/loki"}, + {Name: "loki-data", MountPath: "/data"}, }, ReadinessProbe: &corev1.Probe{ ProbeHandler: util.NewHttpGetProbeHandler("/ready", 3100), @@ -244,20 +201,36 @@ func MakeLokiDeployment(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *appv1.De }, } - // deployment - deployment := &appv1.Deployment{ + // volume claim template + pvc := corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "loki-data", + }, + Spec: corev1.PersistentVolumeClaimSpec{ + AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}, + StorageClassName: util.PointerFallback(cr.Spec.Loki.StorageClassName, cr.Spec.StorageClassName), + }, + } + if storageRequest := cr.Spec.Loki.Requests.Storage(); storageRequest != nil { + pvc.Spec.Resources.Requests = corev1.ResourceList{corev1.ResourceStorage: *storageRequest} + } + + // statefulset + statefulset := &appv1.StatefulSet{ ObjectMeta: metav1.ObjectMeta{ - Name: deploymentRef.Name, - Namespace: deploymentRef.Namespace, + Name: statefulsetRef.Name, + Namespace: statefulsetRef.Namespace, Labels: labels, }, - Spec: appv1.DeploymentSpec{ - Replicas: &replicas, - Selector: &metav1.LabelSelector{MatchLabels: labels}, - Template: podTemplate, + Spec: appv1.StatefulSetSpec{ + ServiceName: GetLokiServiceKey(cr.ObjKey()).Name, + Replicas: &replicas, + Selector: &metav1.LabelSelector{MatchLabels: labels}, + Template: podTemplate, + VolumeClaimTemplates: []corev1.PersistentVolumeClaim{pvc}, }, } - _ = controllerutil.SetOwnerReference(cr, deployment, scheme) - _ = controllerutil.SetControllerReference(cr, deployment, scheme) - return deployment + _ = controllerutil.SetOwnerReference(cr, statefulset, scheme) + _ = controllerutil.SetControllerReference(cr, statefulset, scheme) + return statefulset } diff --git a/internal/transformer/prometheus_resources.go b/internal/transformer/prometheus_resources.go index 3921da8..a61d746 100644 --- a/internal/transformer/prometheus_resources.go +++ b/internal/transformer/prometheus_resources.go @@ -57,14 +57,7 @@ func GetPrometheusServiceKey(monitorKey types.NamespacedName) types.NamespacedNa } } -func GetPrometheusPVCKey(monitorKey types.NamespacedName) types.NamespacedName { - return types.NamespacedName{ - Namespace: monitorKey.Namespace, - Name: fmt.Sprintf("%s-prometheus-pvc", monitorKey.Name), - } -} - -func GetPrometheusDeploymentKey(monitorKey types.NamespacedName) types.NamespacedName { +func GetPrometheusStatefulsetKey(monitorKey types.NamespacedName) types.NamespacedName { return types.NamespacedName{ Namespace: monitorKey.Namespace, Name: fmt.Sprintf("%s-prometheus", monitorKey.Name), @@ -143,7 +136,7 @@ func MakePrometheusService(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *corev return service } -func MakePrometheusPVC(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *corev1.PersistentVolumeClaim { +func MakePrometheusStatefulset(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *appv1.StatefulSet { if cr.Spec.Cluster == "" { return nil } @@ -151,39 +144,8 @@ func MakePrometheusPVC(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *corev1.Pe Namespace: cr.Namespace, Name: cr.Spec.Cluster, } - pvcRef := GetPrometheusPVCKey(cr.ObjKey()) - labels := GetMonitorPrometheusLabels(clusterRef) - - pvc := &corev1.PersistentVolumeClaim{ - ObjectMeta: metav1.ObjectMeta{ - Name: pvcRef.Name, - Namespace: pvcRef.Namespace, - Labels: labels, - }, - Spec: corev1.PersistentVolumeClaimSpec{ - AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}, - StorageClassName: cr.Spec.StorageClassName, - }, - } - storageRequest := cr.Spec.Prometheus.Requests.Storage() - if storageRequest != nil { - pvc.Spec.Resources.Requests = corev1.ResourceList{corev1.ResourceStorage: *storageRequest} - } - _ = controllerutil.SetOwnerReference(cr, pvc, scheme) - return pvc -} - -func MakePrometheusDeployment(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *appv1.Deployment { - if cr.Spec.Cluster == "" { - return nil - } - clusterRef := types.NamespacedName{ - Namespace: cr.Namespace, - Name: cr.Spec.Cluster, - } - deploymentRef := GetPrometheusDeploymentKey(cr.ObjKey()) + statefulsetRef := GetPrometheusStatefulsetKey(cr.ObjKey()) configMapRef := GetPrometheusConfigMapKey(cr.ObjKey()) - pvcRef := GetPrometheusPVCKey(cr.ObjKey()) labels := GetMonitorPrometheusLabels(clusterRef) replicas := int32(1) @@ -209,16 +171,11 @@ func MakePrometheusDeployment(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *ap ServiceAccountName: MonitorNamespacedAccountName, ImagePullSecrets: cr.Spec.ImagePullSecrets, NodeSelector: util.MapFallback(cr.Spec.Prometheus.NodeSelector, cr.Spec.NodeSelector), - Volumes: []corev1.Volume{ - { - Name: "prometheus-config", - VolumeSource: util.NewConfigMapItemsVolumeSource( - configMapRef.Name, map[string]string{"prometheus.yml": "prometheus.yml"}), - }, { - Name: "prometheus-data", - VolumeSource: corev1.VolumeSource{ - PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ClaimName: pvcRef.Name}}}, - }, + Volumes: []corev1.Volume{{ + Name: "prometheus-config", + VolumeSource: util.NewConfigMapItemsVolumeSource( + configMapRef.Name, map[string]string{"prometheus.yml": "prometheus.yml"}), + }}, Containers: []corev1.Container{{ Name: "prometheus", Image: util.StringFallback(cr.Spec.Prometheus.Image, DefaultPrometheusImage), @@ -251,20 +208,36 @@ func MakePrometheusDeployment(cr *dapi.DorisMonitor, scheme *runtime.Scheme) *ap }, } - // deployment - deployment := &appv1.Deployment{ + // volume claim template + pvc := corev1.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "prometheus-data", + }, + Spec: corev1.PersistentVolumeClaimSpec{ + AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}, + StorageClassName: util.PointerFallback(cr.Spec.Prometheus.StorageClassName, cr.Spec.StorageClassName), + }, + } + if storageRequest := cr.Spec.Prometheus.Requests.Storage(); storageRequest != nil { + pvc.Spec.Resources.Requests = corev1.ResourceList{corev1.ResourceStorage: *storageRequest} + } + + // statefulset + statefulset := &appv1.StatefulSet{ ObjectMeta: metav1.ObjectMeta{ - Name: deploymentRef.Name, - Namespace: deploymentRef.Namespace, + Name: statefulsetRef.Name, + Namespace: statefulsetRef.Namespace, Labels: labels, }, - Spec: appv1.DeploymentSpec{ - Replicas: &replicas, - Selector: &metav1.LabelSelector{MatchLabels: labels}, - Template: podTemplate, + Spec: appv1.StatefulSetSpec{ + ServiceName: GetPrometheusServiceKey(cr.ObjKey()).Name, + Replicas: &replicas, + Selector: &metav1.LabelSelector{MatchLabels: labels}, + Template: podTemplate, + VolumeClaimTemplates: []corev1.PersistentVolumeClaim{pvc}, }, } - _ = controllerutil.SetOwnerReference(cr, deployment, scheme) - _ = controllerutil.SetControllerReference(cr, deployment, scheme) - return deployment + _ = controllerutil.SetOwnerReference(cr, statefulset, scheme) + _ = controllerutil.SetControllerReference(cr, statefulset, scheme) + return statefulset }