You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by ch...@apache.org on 2022/09/20 03:43:51 UTC

[dolphinscheduler-operator] 14/44: fix(CRD): check the logicCode

This is an automated email from the ASF dual-hosted git repository.

chufenggao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler-operator.git

commit 5f4cc8701aef805d5e83317307981ba5f96cbe14
Author: nobolity <no...@gmail.com>
AuthorDate: Tue May 31 23:06:54 2022 +0800

    fix(CRD): check the logicCode
---
 api/v1alpha1/ds_public.go                          |   33 +-
 api/v1alpha1/dsalert_types.go                      |   11 +-
 api/v1alpha1/dsapi_types.go                        |   17 +-
 api/v1alpha1/dsworker_types.go                     |    7 -
 api/v1alpha1/zz_generated.deepcopy.go              |   80 +-
 .../ds.apache.dolphinscheduler.dev_dsalerts.yaml   |  411 +------
 .../ds.apache.dolphinscheduler.dev_dsapis.yaml     | 1173 +++++++++++++++++++-
 .../ds.apache.dolphinscheduler.dev_dsmasters.yaml  |  200 +---
 .../ds.apache.dolphinscheduler.dev_dsworkers.yaml  |  200 +---
 config/samples/ds_v1alpha1_dsapi.yaml              |    3 +-
 controllers/alert_reconcile.go                     |    3 +-
 controllers/api_reconcile.go                       |    6 +-
 controllers/deployment.go                          |   29 +
 controllers/dsalert_controller.go                  |   52 +-
 controllers/dsapi_controller.go                    |   51 +-
 controllers/dsmaster_controller.go                 |   32 +-
 controllers/master_reconcile.go                    |    1 +
 controllers/member.go                              |    8 -
 18 files changed, 1420 insertions(+), 897 deletions(-)

diff --git a/api/v1alpha1/ds_public.go b/api/v1alpha1/ds_public.go
index d468fca..efdb8b5 100644
--- a/api/v1alpha1/ds_public.go
+++ b/api/v1alpha1/ds_public.go
@@ -67,8 +67,6 @@ type DsCondition struct {
 // PodPolicy defines the policy to create pod for the dm-master container.
 type PodPolicy struct {
 	// Labels specifies the labels to attach to pods the operator creates for the
-	// dm-master cluster.
-	// "app" and "dm-master_*" labels are reserved for the internal use of the dm-master operator.
 	// Do not overwrite them.
 	Labels map[string]string `json:"labels,omitempty"`
 
@@ -77,34 +75,23 @@ type PodPolicy struct {
 	// labels.
 	NodeSelector map[string]string `json:"nodeSelector,omitempty"`
 
-	// The scheduling constraints on dm-master pods.
 	Affinity *corev1.Affinity `json:"affinity,omitempty"`
-	// **DEPRECATED**. Use Affinity instead.
-	AntiAffinity bool `json:"antiAffinity,omitempty"`
 
-	// Resources is the resource requirements for the dm-master container.
+	// Resources is the resource requirements for the  container.
 	// This field cannot be updated once the cluster is created.
 	Resources corev1.ResourceRequirements `json:"resources,omitempty"`
 
 	// Tolerations specifies the pod's tolerations.
 	Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
 
-	// List of environment variables to set in the dm-master container.
-	// This is used to configure dm-master process. dm-master cluster cannot be created, when
+	// List of environment variables to set in the  container.
+	// This is used to configure process. cluster cannot be created, when
 	// bad environement variables are provided. Do not overwrite any flags used to
 	// bootstrap the cluster (for example `--initial-cluster` flag).
 	// This field cannot be updated.
-	Envs []corev1.EnvVar `json:"dm-masterEnv,omitempty"`
+	Envs []corev1.EnvVar `json:"envs,omitempty"`
 
-	// PersistentVolumeClaimSpec is the spec to describe PVC for the dm-master container
-	// This field is optional. If no PVC spec, dm-master container will use emptyDir as volume
-	// Note. This feature is in alpha stage. It is currently only used as non-stable storage,
-	// not the stable storage. Future work need to make it used as stable storage.
-	PersistentVolumeClaimSpec *corev1.PersistentVolumeClaimSpec `json:"persistentVolumeClaimSpec,omitempty"`
-
-	// Annotations specifies the annotations to attach to pods the operator creates for the
-	// dm-master cluster.
-	// The "dm-master.version" annotation is reserved for the internal use of the dm-master operator.
+	// Annotations specifies the annotations to attach to pods the operator creates for the cluster.
 	Annotations map[string]string `json:"annotations,omitempty"`
 
 	// SecurityContext specifies the security context for the entire pod
@@ -112,6 +99,16 @@ type PodPolicy struct {
 	SecurityContext *corev1.PodSecurityContext `json:"securityContext,omitempty"`
 }
 
+type DeploymentPolicy struct {
+	Labels      map[string]string           `json:"labels,omitempty"`
+	Annotations map[string]string           `json:"annotations,omitempty"`
+	Envs        []corev1.EnvVar             `json:"envs,omitempty"`
+	Resources   corev1.ResourceRequirements `json:"resources,omitempty"`
+	Affinity    *corev1.Affinity            `json:"affinity,omitempty"`
+	// Tolerations specifies the pod's tolerations.
+	Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
+}
+
 type MembersStatus struct {
 	// Ready are the dsMaster members that are ready to serve requests
 	// The member names are the same as the dsMaster pod names
diff --git a/api/v1alpha1/dsalert_types.go b/api/v1alpha1/dsalert_types.go
index 65e5c7a..1ad45c2 100644
--- a/api/v1alpha1/dsalert_types.go
+++ b/api/v1alpha1/dsalert_types.go
@@ -49,11 +49,11 @@ type DSAlertSpec struct {
 	// +kubebuilder:default=3
 	// +kubebuilder:validation:Minimum=1
 	// +kubebuilder:validation:Maximum=7
-	Replicas int `json:"replicas"`
+	Replicas int32 `json:"replicas"`
 
 	// Pod defines the policy to create pod for the dm-master pod.
 	// Updating Pod does not take effect on any existing dm-master pods.
-	Pod *PodPolicy `json:"pod,omitempty"`
+	Deployment *DeploymentPolicy `json:"deployment,omitempty"`
 
 	// Paused is to pause the control of the operator for the ds-master .
 	// +kubebuilder:default=false
@@ -61,10 +61,6 @@ type DSAlertSpec struct {
 
 	//LogPvcName defines the  log capacity of application ,the position is /opt/dolphinscheduler/logs eg 20Gi
 	LogPvcName string `json:"log_pvc_name,omitempty"`
-
-	//ReGenerate defines if delete the old_deployment and create a new deployment
-	// +kubebuilder:default=false
-	ReGenerate bool `json:"re_generate,omitempty"`
 }
 
 // DSAlertStatus defines the observed state of DSAlert
@@ -86,9 +82,6 @@ type DSAlertStatus struct {
 	// Replicas is the current size of the cluster
 	// +kubebuilder:default=0
 	Replicas int `json:"replicas,omitempty"`
-
-	// Members are the dsMaster members in the cluster
-	Members MembersStatus `json:"members,omitempty"`
 }
 
 //+kubebuilder:object:root=true
diff --git a/api/v1alpha1/dsapi_types.go b/api/v1alpha1/dsapi_types.go
index 01f11f9..91db86f 100644
--- a/api/v1alpha1/dsapi_types.go
+++ b/api/v1alpha1/dsapi_types.go
@@ -36,6 +36,8 @@ type DSApiSpec struct {
 	// +kubebuilder:default="3.0.0-alpha"
 	Version string `json:"version,omitempty"`
 
+	ZookeeperConnect string `json:"zookeeper_connect,omitempty"`
+
 	// Repository is the name of the repository that hosts
 	// ds container images. It should be direct clone of the repository in official
 	// By default, it is `apache/dolphinscheduler-master`.
@@ -49,11 +51,11 @@ type DSApiSpec struct {
 	// +kubebuilder:default=3
 	// +kubebuilder:validation:Minimum=1
 	// +kubebuilder:validation:Maximum=7
-	Replicas int `json:"replicas"`
+	Replicas int32 `json:"replicas"`
 
 	// Pod defines the policy to create pod for the dm-master pod.
-	// Updating Pod does not take effect on any existing dm-master pods.
-	Pod *PodPolicy `json:"pod,omitempty"`
+	// Pod defines the policy to create pod for the dm-master pod.
+	Deployment *DeploymentPolicy `json:"deployment,omitempty"`
 
 	// Paused is to pause the control of the operator for the ds-master .
 	// +kubebuilder:default=false
@@ -62,11 +64,8 @@ type DSApiSpec struct {
 	//LogPvcName defines the  log capacity of application ,the position is /opt/dolphinscheduler/logs eg 20Gi
 	LogPvcName string `json:"log_pvc_name,omitempty"`
 
-	//ReGenerate defines if delete the old_deployment and create a new deployment
-	// +kubebuilder:default=false
-	ReGenerate bool `json:"re_generate,omitempty"`
-
 	//NodePort is the port node exposed
+	// +kubebuilder:default=30001
 	NodePort int32 `json:"node_port"`
 }
 
@@ -79,6 +78,7 @@ type DSApiStatus struct {
 	// Phase is the cluster running phase
 	// +kubebuilder:validation:Enum="";Creating;Running;Failed;Finished
 	Phase DsPhase `json:"phase,omitempty"`
+
 	// ControlPaused indicates the operator pauses the control of the cluster.
 	// +kubebuilder:default=false
 	ControlPaused bool `json:"controlPaused,omitempty"`
@@ -89,9 +89,6 @@ type DSApiStatus struct {
 	// Replicas is the current size of the cluster
 	// +kubebuilder:default=0
 	Replicas int `json:"replicas,omitempty"`
-
-	// Members are the dsMaster members in the cluster
-	Members MembersStatus `json:"members,omitempty"`
 }
 
 //+kubebuilder:object:root=true
diff --git a/api/v1alpha1/dsworker_types.go b/api/v1alpha1/dsworker_types.go
index df90268..19f90b3 100644
--- a/api/v1alpha1/dsworker_types.go
+++ b/api/v1alpha1/dsworker_types.go
@@ -120,13 +120,6 @@ func init() {
 	SchemeBuilder.Register(&DSWorker{}, &DSWorkerList{})
 }
 
-func (c *DSWorker) IsPodPVEnabled() bool {
-	if podPolicy := c.Spec.Pod; podPolicy != nil {
-		return podPolicy.PersistentVolumeClaimSpec != nil
-	}
-	return false
-}
-
 type AlertConfig struct {
 	ServiceUrl string `json:"service_url,omitempty"`
 	Port       string `json:"port,omitempty"`
diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go
index f69ee99..f828d4d 100644
--- a/api/v1alpha1/zz_generated.deepcopy.go
+++ b/api/v1alpha1/zz_generated.deepcopy.go
@@ -108,9 +108,9 @@ func (in *DSAlertSpec) DeepCopyInto(out *DSAlertSpec) {
 		*out = new(DateSourceTemplate)
 		**out = **in
 	}
-	if in.Pod != nil {
-		in, out := &in.Pod, &out.Pod
-		*out = new(PodPolicy)
+	if in.Deployment != nil {
+		in, out := &in.Deployment, &out.Deployment
+		*out = new(DeploymentPolicy)
 		(*in).DeepCopyInto(*out)
 	}
 }
@@ -133,7 +133,6 @@ func (in *DSAlertStatus) DeepCopyInto(out *DSAlertStatus) {
 		*out = make([]DsCondition, len(*in))
 		copy(*out, *in)
 	}
-	in.Members.DeepCopyInto(&out.Members)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DSAlertStatus.
@@ -151,8 +150,8 @@ func (in *DSApi) DeepCopyInto(out *DSApi) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	out.Spec = in.Spec
-	out.Status = in.Status
+	in.Spec.DeepCopyInto(&out.Spec)
+	in.Status.DeepCopyInto(&out.Status)
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DSApi.
@@ -208,6 +207,16 @@ func (in *DSApiList) DeepCopyObject() runtime.Object {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *DSApiSpec) DeepCopyInto(out *DSApiSpec) {
 	*out = *in
+	if in.Datasource != nil {
+		in, out := &in.Datasource, &out.Datasource
+		*out = new(DateSourceTemplate)
+		**out = **in
+	}
+	if in.Deployment != nil {
+		in, out := &in.Deployment, &out.Deployment
+		*out = new(DeploymentPolicy)
+		(*in).DeepCopyInto(*out)
+	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DSApiSpec.
@@ -223,6 +232,11 @@ func (in *DSApiSpec) DeepCopy() *DSApiSpec {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *DSApiStatus) DeepCopyInto(out *DSApiStatus) {
 	*out = *in
+	if in.Conditions != nil {
+		in, out := &in.Conditions, &out.Conditions
+		*out = make([]DsCondition, len(*in))
+		copy(*out, *in)
+	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DSApiStatus.
@@ -465,6 +479,55 @@ func (in *DateSourceTemplate) DeepCopy() *DateSourceTemplate {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *DeploymentPolicy) DeepCopyInto(out *DeploymentPolicy) {
+	*out = *in
+	if in.Labels != nil {
+		in, out := &in.Labels, &out.Labels
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	if in.Annotations != nil {
+		in, out := &in.Annotations, &out.Annotations
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	if in.Envs != nil {
+		in, out := &in.Envs, &out.Envs
+		*out = make([]v1.EnvVar, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	in.Resources.DeepCopyInto(&out.Resources)
+	if in.Affinity != nil {
+		in, out := &in.Affinity, &out.Affinity
+		*out = new(v1.Affinity)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Tolerations != nil {
+		in, out := &in.Tolerations, &out.Tolerations
+		*out = make([]v1.Toleration, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeploymentPolicy.
+func (in *DeploymentPolicy) DeepCopy() *DeploymentPolicy {
+	if in == nil {
+		return nil
+	}
+	out := new(DeploymentPolicy)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *DsCondition) DeepCopyInto(out *DsCondition) {
 	*out = *in
@@ -542,11 +605,6 @@ func (in *PodPolicy) DeepCopyInto(out *PodPolicy) {
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
 	}
-	if in.PersistentVolumeClaimSpec != nil {
-		in, out := &in.PersistentVolumeClaimSpec, &out.PersistentVolumeClaimSpec
-		*out = new(v1.PersistentVolumeClaimSpec)
-		(*in).DeepCopyInto(*out)
-	}
 	if in.Annotations != nil {
 		in, out := &in.Annotations, &out.Annotations
 		*out = make(map[string]string, len(*in))
diff --git a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsalerts.yaml b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsalerts.yaml
index b49a713..52c09c4 100644
--- a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsalerts.yaml
+++ b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsalerts.yaml
@@ -51,22 +51,13 @@ spec:
                 - url
                 - username
                 type: object
-              log_pvc_name:
-                description: LogPvcName defines the  log capacity of application ,the
-                  position is /opt/dolphinscheduler/logs eg 20Gi
-                type: string
-              paused:
-                default: false
-                description: Paused is to pause the control of the operator for the
-                  ds-master .
-                type: boolean
-              pod:
+              deployment:
                 description: Pod defines the policy to create pod for the dm-master
                   pod. Updating Pod does not take effect on any existing dm-master
                   pods.
                 properties:
                   affinity:
-                    description: The scheduling constraints on dm-master pods.
+                    description: Affinity is a group of affinity scheduling rules.
                     properties:
                       nodeAffinity:
                         description: Describes node affinity scheduling rules for
@@ -933,21 +924,8 @@ spec:
                   annotations:
                     additionalProperties:
                       type: string
-                    description: Annotations specifies the annotations to attach to
-                      pods the operator creates for the dm-master cluster. The "dm-master.version"
-                      annotation is reserved for the internal use of the dm-master
-                      operator.
                     type: object
-                  antiAffinity:
-                    description: '**DEPRECATED**. Use Affinity instead.'
-                    type: boolean
-                  dm-masterEnv:
-                    description: List of environment variables to set in the dm-master
-                      container. This is used to configure dm-master process. dm-master
-                      cluster cannot be created, when bad environement variables are
-                      provided. Do not overwrite any flags used to bootstrap the cluster
-                      (for example `--initial-cluster` flag). This field cannot be
-                      updated.
+                  envs:
                     items:
                       description: EnvVar represents an environment variable present
                         in a Container.
@@ -1059,191 +1037,10 @@ spec:
                   labels:
                     additionalProperties:
                       type: string
-                    description: Labels specifies the labels to attach to pods the
-                      operator creates for the dm-master cluster. "app" and "dm-master_*"
-                      labels are reserved for the internal use of the dm-master operator.
-                      Do not overwrite them.
-                    type: object
-                  nodeSelector:
-                    additionalProperties:
-                      type: string
-                    description: NodeSelector specifies a map of key-value pairs.
-                      For the pod to be eligible to run on a node, the node must have
-                      each of the indicated key-value pairs as labels.
-                    type: object
-                  persistentVolumeClaimSpec:
-                    description: PersistentVolumeClaimSpec is the spec to describe
-                      PVC for the dm-master container This field is optional. If no
-                      PVC spec, dm-master container will use emptyDir as volume Note.
-                      This feature is in alpha stage. It is currently only used as
-                      non-stable storage, not the stable storage. Future work need
-                      to make it used as stable storage.
-                    properties:
-                      accessModes:
-                        description: 'AccessModes contains the desired access modes
-                          the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1'
-                        items:
-                          type: string
-                        type: array
-                      dataSource:
-                        description: 'This field can be used to specify either: *
-                          An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)
-                          * An existing PVC (PersistentVolumeClaim) If the provisioner
-                          or an external controller can support the specified data
-                          source, it will create a new volume based on the contents
-                          of the specified data source. If the AnyVolumeDataSource
-                          feature gate is enabled, this field will always have the
-                          same contents as the DataSourceRef field.'
-                        properties:
-                          apiGroup:
-                            description: APIGroup is the group for the resource being
-                              referenced. If APIGroup is not specified, the specified
-                              Kind must be in the core API group. For any other third-party
-                              types, APIGroup is required.
-                            type: string
-                          kind:
-                            description: Kind is the type of resource being referenced
-                            type: string
-                          name:
-                            description: Name is the name of resource being referenced
-                            type: string
-                        required:
-                        - kind
-                        - name
-                        type: object
-                      dataSourceRef:
-                        description: 'Specifies the object from which to populate
-                          the volume with data, if a non-empty volume is desired.
-                          This may be any local object from a non-empty API group
-                          (non core object) or a PersistentVolumeClaim object. When
-                          this field is specified, volume binding will only succeed
-                          if the type of the specified object matches some installed
-                          volume populator or dynamic provisioner. This field will
-                          replace the functionality of the DataSource field and as
-                          such if both fields are non-empty, they must have the same
-                          value. For backwards compatibility, both fields (DataSource
-                          and DataSourceRef) will be set to the same value automatically
-                          if one of them is empty and the other is non-empty. There
-                          are two important differences between DataSource and DataSourceRef:
-                          * While DataSource only allows two specific types of objects,
-                          DataSourceRef allows any non-core object, as well as PersistentVolumeClaim
-                          objects. * While DataSource ignores disallowed values (dropping
-                          them), DataSourceRef preserves all values, and generates
-                          an error if a disallowed value is specified. (Alpha) Using
-                          this field requires the AnyVolumeDataSource feature gate
-                          to be enabled.'
-                        properties:
-                          apiGroup:
-                            description: APIGroup is the group for the resource being
-                              referenced. If APIGroup is not specified, the specified
-                              Kind must be in the core API group. For any other third-party
-                              types, APIGroup is required.
-                            type: string
-                          kind:
-                            description: Kind is the type of resource being referenced
-                            type: string
-                          name:
-                            description: Name is the name of resource being referenced
-                            type: string
-                        required:
-                        - kind
-                        - name
-                        type: object
-                      resources:
-                        description: 'Resources represents the minimum resources the
-                          volume should have. If RecoverVolumeExpansionFailure feature
-                          is enabled users are allowed to specify resource requirements
-                          that are lower than previous value but must still be higher
-                          than capacity recorded in the status field of the claim.
-                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
-                        properties:
-                          limits:
-                            additionalProperties:
-                              anyOf:
-                              - type: integer
-                              - type: string
-                              pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                              x-kubernetes-int-or-string: true
-                            description: 'Limits describes the maximum amount of compute
-                              resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
-                            type: object
-                          requests:
-                            additionalProperties:
-                              anyOf:
-                              - type: integer
-                              - type: string
-                              pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                              x-kubernetes-int-or-string: true
-                            description: 'Requests describes the minimum amount of
-                              compute resources required. If Requests is omitted for
-                              a container, it defaults to Limits if that is explicitly
-                              specified, otherwise to an implementation-defined value.
-                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
-                            type: object
-                        type: object
-                      selector:
-                        description: A label query over volumes to consider for binding.
-                        properties:
-                          matchExpressions:
-                            description: matchExpressions is a list of label selector
-                              requirements. The requirements are ANDed.
-                            items:
-                              description: A label selector requirement is a selector
-                                that contains values, a key, and an operator that
-                                relates the key and values.
-                              properties:
-                                key:
-                                  description: key is the label key that the selector
-                                    applies to.
-                                  type: string
-                                operator:
-                                  description: operator represents a key's relationship
-                                    to a set of values. Valid operators are In, NotIn,
-                                    Exists and DoesNotExist.
-                                  type: string
-                                values:
-                                  description: values is an array of string values.
-                                    If the operator is In or NotIn, the values array
-                                    must be non-empty. If the operator is Exists or
-                                    DoesNotExist, the values array must be empty.
-                                    This array is replaced during a strategic merge
-                                    patch.
-                                  items:
-                                    type: string
-                                  type: array
-                              required:
-                              - key
-                              - operator
-                              type: object
-                            type: array
-                          matchLabels:
-                            additionalProperties:
-                              type: string
-                            description: matchLabels is a map of {key,value} pairs.
-                              A single {key,value} in the matchLabels map is equivalent
-                              to an element of matchExpressions, whose key field is
-                              "key", the operator is "In", and the values array contains
-                              only "value". The requirements are ANDed.
-                            type: object
-                        type: object
-                      storageClassName:
-                        description: 'Name of the StorageClass required by the claim.
-                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
-                        type: string
-                      volumeMode:
-                        description: volumeMode defines what type of volume is required
-                          by the claim. Value of Filesystem is implied when not included
-                          in claim spec.
-                        type: string
-                      volumeName:
-                        description: VolumeName is the binding reference to the PersistentVolume
-                          backing this claim.
-                        type: string
                     type: object
                   resources:
-                    description: Resources is the resource requirements for the dm-master
-                      container. This field cannot be updated once the cluster is
-                      created.
+                    description: ResourceRequirements describes the compute resource
+                      requirements.
                     properties:
                       limits:
                         additionalProperties:
@@ -1268,177 +1065,6 @@ spec:
                           to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
                         type: object
                     type: object
-                  securityContext:
-                    description: 'SecurityContext specifies the security context for
-                      the entire pod More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context'
-                    properties:
-                      fsGroup:
-                        description: "A special supplemental group that applies to
-                          all containers in a pod. Some volume types allow the Kubelet
-                          to change the ownership of that volume to be owned by the
-                          pod: \n 1. The owning GID will be the FSGroup 2. The setgid
-                          bit is set (new files created in the volume will be owned
-                          by FSGroup) 3. The permission bits are OR'd with rw-rw----
-                          \n If unset, the Kubelet will not modify the ownership and
-                          permissions of any volume. Note that this field cannot be
-                          set when spec.os.name is windows."
-                        format: int64
-                        type: integer
-                      fsGroupChangePolicy:
-                        description: 'fsGroupChangePolicy defines behavior of changing
-                          ownership and permission of the volume before being exposed
-                          inside Pod. This field will only apply to volume types which
-                          support fsGroup based ownership(and permissions). It will
-                          have no effect on ephemeral volume types such as: secret,
-                          configmaps and emptydir. Valid values are "OnRootMismatch"
-                          and "Always". If not specified, "Always" is used. Note that
-                          this field cannot be set when spec.os.name is windows.'
-                        type: string
-                      runAsGroup:
-                        description: The GID to run the entrypoint of the container
-                          process. Uses runtime default if unset. May also be set
-                          in SecurityContext.  If set in both SecurityContext and
-                          PodSecurityContext, the value specified in SecurityContext
-                          takes precedence for that container. Note that this field
-                          cannot be set when spec.os.name is windows.
-                        format: int64
-                        type: integer
-                      runAsNonRoot:
-                        description: Indicates that the container must run as a non-root
-                          user. If true, the Kubelet will validate the image at runtime
-                          to ensure that it does not run as UID 0 (root) and fail
-                          to start the container if it does. If unset or false, no
-                          such validation will be performed. May also be set in SecurityContext.  If
-                          set in both SecurityContext and PodSecurityContext, the
-                          value specified in SecurityContext takes precedence.
-                        type: boolean
-                      runAsUser:
-                        description: The UID to run the entrypoint of the container
-                          process. Defaults to user specified in image metadata if
-                          unspecified. May also be set in SecurityContext.  If set
-                          in both SecurityContext and PodSecurityContext, the value
-                          specified in SecurityContext takes precedence for that container.
-                          Note that this field cannot be set when spec.os.name is
-                          windows.
-                        format: int64
-                        type: integer
-                      seLinuxOptions:
-                        description: The SELinux context to be applied to all containers.
-                          If unspecified, the container runtime will allocate a random
-                          SELinux context for each container.  May also be set in
-                          SecurityContext.  If set in both SecurityContext and PodSecurityContext,
-                          the value specified in SecurityContext takes precedence
-                          for that container. Note that this field cannot be set when
-                          spec.os.name is windows.
-                        properties:
-                          level:
-                            description: Level is SELinux level label that applies
-                              to the container.
-                            type: string
-                          role:
-                            description: Role is a SELinux role label that applies
-                              to the container.
-                            type: string
-                          type:
-                            description: Type is a SELinux type label that applies
-                              to the container.
-                            type: string
-                          user:
-                            description: User is a SELinux user label that applies
-                              to the container.
-                            type: string
-                        type: object
-                      seccompProfile:
-                        description: The seccomp options to use by the containers
-                          in this pod. Note that this field cannot be set when spec.os.name
-                          is windows.
-                        properties:
-                          localhostProfile:
-                            description: localhostProfile indicates a profile defined
-                              in a file on the node should be used. The profile must
-                              be preconfigured on the node to work. Must be a descending
-                              path, relative to the kubelet's configured seccomp profile
-                              location. Must only be set if type is "Localhost".
-                            type: string
-                          type:
-                            description: "type indicates which kind of seccomp profile
-                              will be applied. Valid options are: \n Localhost - a
-                              profile defined in a file on the node should be used.
-                              RuntimeDefault - the container runtime default profile
-                              should be used. Unconfined - no profile should be applied."
-                            type: string
-                        required:
-                        - type
-                        type: object
-                      supplementalGroups:
-                        description: A list of groups applied to the first process
-                          run in each container, in addition to the container's primary
-                          GID.  If unspecified, no groups will be added to any container.
-                          Note that this field cannot be set when spec.os.name is
-                          windows.
-                        items:
-                          format: int64
-                          type: integer
-                        type: array
-                      sysctls:
-                        description: Sysctls hold a list of namespaced sysctls used
-                          for the pod. Pods with unsupported sysctls (by the container
-                          runtime) might fail to launch. Note that this field cannot
-                          be set when spec.os.name is windows.
-                        items:
-                          description: Sysctl defines a kernel parameter to be set
-                          properties:
-                            name:
-                              description: Name of a property to set
-                              type: string
-                            value:
-                              description: Value of a property to set
-                              type: string
-                          required:
-                          - name
-                          - value
-                          type: object
-                        type: array
-                      windowsOptions:
-                        description: The Windows specific settings applied to all
-                          containers. If unspecified, the options within a container's
-                          SecurityContext will be used. If set in both SecurityContext
-                          and PodSecurityContext, the value specified in SecurityContext
-                          takes precedence. Note that this field cannot be set when
-                          spec.os.name is linux.
-                        properties:
-                          gmsaCredentialSpec:
-                            description: GMSACredentialSpec is where the GMSA admission
-                              webhook (https://github.com/kubernetes-sigs/windows-gmsa)
-                              inlines the contents of the GMSA credential spec named
-                              by the GMSACredentialSpecName field.
-                            type: string
-                          gmsaCredentialSpecName:
-                            description: GMSACredentialSpecName is the name of the
-                              GMSA credential spec to use.
-                            type: string
-                          hostProcess:
-                            description: HostProcess determines if a container should
-                              be run as a 'Host Process' container. This field is
-                              alpha-level and will only be honored by components that
-                              enable the WindowsHostProcessContainers feature flag.
-                              Setting this field without the feature flag will result
-                              in errors when validating the Pod. All of a Pod's containers
-                              must have the same effective HostProcess value (it is
-                              not allowed to have a mix of HostProcess containers
-                              and non-HostProcess containers).  In addition, if HostProcess
-                              is true then HostNetwork must also be set to true.
-                            type: boolean
-                          runAsUserName:
-                            description: The UserName in Windows to run the entrypoint
-                              of the container process. Defaults to the user specified
-                              in image metadata if unspecified. May also be set in
-                              PodSecurityContext. If set in both SecurityContext and
-                              PodSecurityContext, the value specified in SecurityContext
-                              takes precedence.
-                            type: string
-                        type: object
-                    type: object
                   tolerations:
                     description: Tolerations specifies the pod's tolerations.
                     items:
@@ -1481,16 +1107,21 @@ spec:
                       type: object
                     type: array
                 type: object
-              re_generate:
+              log_pvc_name:
+                description: LogPvcName defines the  log capacity of application ,the
+                  position is /opt/dolphinscheduler/logs eg 20Gi
+                type: string
+              paused:
                 default: false
-                description: ReGenerate defines if delete the old_deployment and create
-                  a new deployment
+                description: Paused is to pause the control of the operator for the
+                  ds-master .
                 type: boolean
               replicas:
                 default: 3
                 description: Replicas is the expected size of the ms-master. The ds-master-operator
                   will eventually make the size of the running equal to the expected
                   size. The vaild range of the size is from 1 to 7.
+                format: int32
                 maximum: 7
                 minimum: 1
                 type: integer
@@ -1554,22 +1185,6 @@ spec:
                 description: ControlPaused indicates the operator pauses the control
                   of the cluster.
                 type: boolean
-              members:
-                description: Members are the dsMaster members in the cluster
-                properties:
-                  ready:
-                    description: Ready are the dsMaster members that are ready to
-                      serve requests The member names are the same as the dsMaster
-                      pod names
-                    items:
-                      type: string
-                    type: array
-                  unready:
-                    description: Unready are the etcd members not ready to serve requests
-                    items:
-                      type: string
-                    type: array
-                type: object
               phase:
                 description: 'INSERT ADDITIONAL STATUS FIELD - define observed state
                   of cluster Important: Run "make" to regenerate code after modifying
diff --git a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsapis.yaml b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsapis.yaml
index 5f98244..2753d6e 100644
--- a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsapis.yaml
+++ b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsapis.yaml
@@ -35,13 +35,1180 @@ spec:
           spec:
             description: DSApiSpec defines the desired state of DSApi
             properties:
-              foo:
-                description: Foo is an example field of DSApi. Edit dsapi_types.go
-                  to remove/update
+              datasource:
+                properties:
+                  drive_name:
+                    type: string
+                  password:
+                    type: string
+                  url:
+                    type: string
+                  username:
+                    type: string
+                required:
+                - drive_name
+                - password
+                - url
+                - username
+                type: object
+              deployment:
+                description: Pod defines the policy to create pod for the dm-master
+                  pod. Pod defines the policy to create pod for the dm-master pod.
+                properties:
+                  affinity:
+                    description: Affinity is a group of affinity scheduling rules.
+                    properties:
+                      nodeAffinity:
+                        description: Describes node affinity scheduling rules for
+                          the pod.
+                        properties:
+                          preferredDuringSchedulingIgnoredDuringExecution:
+                            description: The scheduler will prefer to schedule pods
+                              to nodes that satisfy the affinity expressions specified
+                              by this field, but it may choose a node that violates
+                              one or more of the expressions. The node that is most
+                              preferred is the one with the greatest sum of weights,
+                              i.e. for each node that meets all of the scheduling
+                              requirements (resource request, requiredDuringScheduling
+                              affinity expressions, etc.), compute a sum by iterating
+                              through the elements of this field and adding "weight"
+                              to the sum if the node matches the corresponding matchExpressions;
+                              the node(s) with the highest sum are the most preferred.
+                            items:
+                              description: An empty preferred scheduling term matches
+                                all objects with implicit weight 0 (i.e. it's a no-op).
+                                A null preferred scheduling term matches no objects
+                                (i.e. is also a no-op).
+                              properties:
+                                preference:
+                                  description: A node selector term, associated with
+                                    the corresponding weight.
+                                  properties:
+                                    matchExpressions:
+                                      description: A list of node selector requirements
+                                        by node's labels.
+                                      items:
+                                        description: A node selector requirement is
+                                          a selector that contains values, a key,
+                                          and an operator that relates the key and
+                                          values.
+                                        properties:
+                                          key:
+                                            description: The label key that the selector
+                                              applies to.
+                                            type: string
+                                          operator:
+                                            description: Represents a key's relationship
+                                              to a set of values. Valid operators
+                                              are In, NotIn, Exists, DoesNotExist.
+                                              Gt, and Lt.
+                                            type: string
+                                          values:
+                                            description: An array of string values.
+                                              If the operator is In or NotIn, the
+                                              values array must be non-empty. If the
+                                              operator is Exists or DoesNotExist,
+                                              the values array must be empty. If the
+                                              operator is Gt or Lt, the values array
+                                              must have a single element, which will
+                                              be interpreted as an integer. This array
+                                              is replaced during a strategic merge
+                                              patch.
+                                            items:
+                                              type: string
+                                            type: array
+                                        required:
+                                        - key
+                                        - operator
+                                        type: object
+                                      type: array
+                                    matchFields:
+                                      description: A list of node selector requirements
+                                        by node's fields.
+                                      items:
+                                        description: A node selector requirement is
+                                          a selector that contains values, a key,
+                                          and an operator that relates the key and
+                                          values.
+                                        properties:
+                                          key:
+                                            description: The label key that the selector
+                                              applies to.
+                                            type: string
+                                          operator:
+                                            description: Represents a key's relationship
+                                              to a set of values. Valid operators
+                                              are In, NotIn, Exists, DoesNotExist.
+                                              Gt, and Lt.
+                                            type: string
+                                          values:
+                                            description: An array of string values.
+                                              If the operator is In or NotIn, the
+                                              values array must be non-empty. If the
+                                              operator is Exists or DoesNotExist,
+                                              the values array must be empty. If the
+                                              operator is Gt or Lt, the values array
+                                              must have a single element, which will
+                                              be interpreted as an integer. This array
+                                              is replaced during a strategic merge
+                                              patch.
+                                            items:
+                                              type: string
+                                            type: array
+                                        required:
+                                        - key
+                                        - operator
+                                        type: object
+                                      type: array
+                                  type: object
+                                weight:
+                                  description: Weight associated with matching the
+                                    corresponding nodeSelectorTerm, in the range 1-100.
+                                  format: int32
+                                  type: integer
+                              required:
+                              - preference
+                              - weight
+                              type: object
+                            type: array
+                          requiredDuringSchedulingIgnoredDuringExecution:
+                            description: If the affinity requirements specified by
+                              this field are not met at scheduling time, the pod will
+                              not be scheduled onto the node. If the affinity requirements
+                              specified by this field cease to be met at some point
+                              during pod execution (e.g. due to an update), the system
+                              may or may not try to eventually evict the pod from
+                              its node.
+                            properties:
+                              nodeSelectorTerms:
+                                description: Required. A list of node selector terms.
+                                  The terms are ORed.
+                                items:
+                                  description: A null or empty node selector term
+                                    matches no objects. The requirements of them are
+                                    ANDed. The TopologySelectorTerm type implements
+                                    a subset of the NodeSelectorTerm.
+                                  properties:
+                                    matchExpressions:
+                                      description: A list of node selector requirements
+                                        by node's labels.
+                                      items:
+                                        description: A node selector requirement is
+                                          a selector that contains values, a key,
+                                          and an operator that relates the key and
+                                          values.
+                                        properties:
+                                          key:
+                                            description: The label key that the selector
+                                              applies to.
+                                            type: string
+                                          operator:
+                                            description: Represents a key's relationship
+                                              to a set of values. Valid operators
+                                              are In, NotIn, Exists, DoesNotExist.
+                                              Gt, and Lt.
+                                            type: string
+                                          values:
+                                            description: An array of string values.
+                                              If the operator is In or NotIn, the
+                                              values array must be non-empty. If the
+                                              operator is Exists or DoesNotExist,
+                                              the values array must be empty. If the
+                                              operator is Gt or Lt, the values array
+                                              must have a single element, which will
+                                              be interpreted as an integer. This array
+                                              is replaced during a strategic merge
+                                              patch.
+                                            items:
+                                              type: string
+                                            type: array
+                                        required:
+                                        - key
+                                        - operator
+                                        type: object
+                                      type: array
+                                    matchFields:
+                                      description: A list of node selector requirements
+                                        by node's fields.
+                                      items:
+                                        description: A node selector requirement is
+                                          a selector that contains values, a key,
+                                          and an operator that relates the key and
+                                          values.
+                                        properties:
+                                          key:
+                                            description: The label key that the selector
+                                              applies to.
+                                            type: string
+                                          operator:
+                                            description: Represents a key's relationship
+                                              to a set of values. Valid operators
+                                              are In, NotIn, Exists, DoesNotExist.
+                                              Gt, and Lt.
+                                            type: string
+                                          values:
+                                            description: An array of string values.
+                                              If the operator is In or NotIn, the
+                                              values array must be non-empty. If the
+                                              operator is Exists or DoesNotExist,
+                                              the values array must be empty. If the
+                                              operator is Gt or Lt, the values array
+                                              must have a single element, which will
+                                              be interpreted as an integer. This array
+                                              is replaced during a strategic merge
+                                              patch.
+                                            items:
+                                              type: string
+                                            type: array
+                                        required:
+                                        - key
+                                        - operator
+                                        type: object
+                                      type: array
+                                  type: object
+                                type: array
+                            required:
+                            - nodeSelectorTerms
+                            type: object
+                        type: object
+                      podAffinity:
+                        description: Describes pod affinity scheduling rules (e.g.
+                          co-locate this pod in the same node, zone, etc. as some
+                          other pod(s)).
+                        properties:
+                          preferredDuringSchedulingIgnoredDuringExecution:
+                            description: The scheduler will prefer to schedule pods
+                              to nodes that satisfy the affinity expressions specified
+                              by this field, but it may choose a node that violates
+                              one or more of the expressions. The node that is most
+                              preferred is the one with the greatest sum of weights,
+                              i.e. for each node that meets all of the scheduling
+                              requirements (resource request, requiredDuringScheduling
+                              affinity expressions, etc.), compute a sum by iterating
+                              through the elements of this field and adding "weight"
+                              to the sum if the node has pods which matches the corresponding
+                              podAffinityTerm; the node(s) with the highest sum are
+                              the most preferred.
+                            items:
+                              description: The weights of all of the matched WeightedPodAffinityTerm
+                                fields are added per-node to find the most preferred
+                                node(s)
+                              properties:
+                                podAffinityTerm:
+                                  description: Required. A pod affinity term, associated
+                                    with the corresponding weight.
+                                  properties:
+                                    labelSelector:
+                                      description: A label query over a set of resources,
+                                        in this case pods.
+                                      properties:
+                                        matchExpressions:
+                                          description: matchExpressions is a list
+                                            of label selector requirements. The requirements
+                                            are ANDed.
+                                          items:
+                                            description: A label selector requirement
+                                              is a selector that contains values,
+                                              a key, and an operator that relates
+                                              the key and values.
+                                            properties:
+                                              key:
+                                                description: key is the label key
+                                                  that the selector applies to.
+                                                type: string
+                                              operator:
+                                                description: operator represents a
+                                                  key's relationship to a set of values.
+                                                  Valid operators are In, NotIn, Exists
+                                                  and DoesNotExist.
+                                                type: string
+                                              values:
+                                                description: values is an array of
+                                                  string values. If the operator is
+                                                  In or NotIn, the values array must
+                                                  be non-empty. If the operator is
+                                                  Exists or DoesNotExist, the values
+                                                  array must be empty. This array
+                                                  is replaced during a strategic merge
+                                                  patch.
+                                                items:
+                                                  type: string
+                                                type: array
+                                            required:
+                                            - key
+                                            - operator
+                                            type: object
+                                          type: array
+                                        matchLabels:
+                                          additionalProperties:
+                                            type: string
+                                          description: matchLabels is a map of {key,value}
+                                            pairs. A single {key,value} in the matchLabels
+                                            map is equivalent to an element of matchExpressions,
+                                            whose key field is "key", the operator
+                                            is "In", and the values array contains
+                                            only "value". The requirements are ANDed.
+                                          type: object
+                                      type: object
+                                    namespaceSelector:
+                                      description: A label query over the set of namespaces
+                                        that the term applies to. The term is applied
+                                        to the union of the namespaces selected by
+                                        this field and the ones listed in the namespaces
+                                        field. null selector and null or empty namespaces
+                                        list means "this pod's namespace". An empty
+                                        selector ({}) matches all namespaces. This
+                                        field is beta-level and is only honored when
+                                        PodAffinityNamespaceSelector feature is enabled.
+                                      properties:
+                                        matchExpressions:
+                                          description: matchExpressions is a list
+                                            of label selector requirements. The requirements
+                                            are ANDed.
+                                          items:
+                                            description: A label selector requirement
+                                              is a selector that contains values,
+                                              a key, and an operator that relates
+                                              the key and values.
+                                            properties:
+                                              key:
+                                                description: key is the label key
+                                                  that the selector applies to.
+                                                type: string
+                                              operator:
+                                                description: operator represents a
+                                                  key's relationship to a set of values.
+                                                  Valid operators are In, NotIn, Exists
+                                                  and DoesNotExist.
+                                                type: string
+                                              values:
+                                                description: values is an array of
+                                                  string values. If the operator is
+                                                  In or NotIn, the values array must
+                                                  be non-empty. If the operator is
+                                                  Exists or DoesNotExist, the values
+                                                  array must be empty. This array
+                                                  is replaced during a strategic merge
+                                                  patch.
+                                                items:
+                                                  type: string
+                                                type: array
+                                            required:
+                                            - key
+                                            - operator
+                                            type: object
+                                          type: array
+                                        matchLabels:
+                                          additionalProperties:
+                                            type: string
+                                          description: matchLabels is a map of {key,value}
+                                            pairs. A single {key,value} in the matchLabels
+                                            map is equivalent to an element of matchExpressions,
+                                            whose key field is "key", the operator
+                                            is "In", and the values array contains
+                                            only "value". The requirements are ANDed.
+                                          type: object
+                                      type: object
+                                    namespaces:
+                                      description: namespaces specifies a static list
+                                        of namespace names that the term applies to.
+                                        The term is applied to the union of the namespaces
+                                        listed in this field and the ones selected
+                                        by namespaceSelector. null or empty namespaces
+                                        list and null namespaceSelector means "this
+                                        pod's namespace"
+                                      items:
+                                        type: string
+                                      type: array
+                                    topologyKey:
+                                      description: This pod should be co-located (affinity)
+                                        or not co-located (anti-affinity) with the
+                                        pods matching the labelSelector in the specified
+                                        namespaces, where co-located is defined as
+                                        running on a node whose value of the label
+                                        with key topologyKey matches that of any node
+                                        on which any of the selected pods is running.
+                                        Empty topologyKey is not allowed.
+                                      type: string
+                                  required:
+                                  - topologyKey
+                                  type: object
+                                weight:
+                                  description: weight associated with matching the
+                                    corresponding podAffinityTerm, in the range 1-100.
+                                  format: int32
+                                  type: integer
+                              required:
+                              - podAffinityTerm
+                              - weight
+                              type: object
+                            type: array
+                          requiredDuringSchedulingIgnoredDuringExecution:
+                            description: If the affinity requirements specified by
+                              this field are not met at scheduling time, the pod will
+                              not be scheduled onto the node. If the affinity requirements
+                              specified by this field cease to be met at some point
+                              during pod execution (e.g. due to a pod label update),
+                              the system may or may not try to eventually evict the
+                              pod from its node. When there are multiple elements,
+                              the lists of nodes corresponding to each podAffinityTerm
+                              are intersected, i.e. all terms must be satisfied.
+                            items:
+                              description: Defines a set of pods (namely those matching
+                                the labelSelector relative to the given namespace(s))
+                                that this pod should be co-located (affinity) or not
+                                co-located (anti-affinity) with, where co-located
+                                is defined as running on a node whose value of the
+                                label with key <topologyKey> matches that of any node
+                                on which a pod of the set of pods is running
+                              properties:
+                                labelSelector:
+                                  description: A label query over a set of resources,
+                                    in this case pods.
+                                  properties:
+                                    matchExpressions:
+                                      description: matchExpressions is a list of label
+                                        selector requirements. The requirements are
+                                        ANDed.
+                                      items:
+                                        description: A label selector requirement
+                                          is a selector that contains values, a key,
+                                          and an operator that relates the key and
+                                          values.
+                                        properties:
+                                          key:
+                                            description: key is the label key that
+                                              the selector applies to.
+                                            type: string
+                                          operator:
+                                            description: operator represents a key's
+                                              relationship to a set of values. Valid
+                                              operators are In, NotIn, Exists and
+                                              DoesNotExist.
+                                            type: string
+                                          values:
+                                            description: values is an array of string
+                                              values. If the operator is In or NotIn,
+                                              the values array must be non-empty.
+                                              If the operator is Exists or DoesNotExist,
+                                              the values array must be empty. This
+                                              array is replaced during a strategic
+                                              merge patch.
+                                            items:
+                                              type: string
+                                            type: array
+                                        required:
+                                        - key
+                                        - operator
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      description: matchLabels is a map of {key,value}
+                                        pairs. A single {key,value} in the matchLabels
+                                        map is equivalent to an element of matchExpressions,
+                                        whose key field is "key", the operator is
+                                        "In", and the values array contains only "value".
+                                        The requirements are ANDed.
+                                      type: object
+                                  type: object
+                                namespaceSelector:
+                                  description: A label query over the set of namespaces
+                                    that the term applies to. The term is applied
+                                    to the union of the namespaces selected by this
+                                    field and the ones listed in the namespaces field.
+                                    null selector and null or empty namespaces list
+                                    means "this pod's namespace". An empty selector
+                                    ({}) matches all namespaces. This field is beta-level
+                                    and is only honored when PodAffinityNamespaceSelector
+                                    feature is enabled.
+                                  properties:
+                                    matchExpressions:
+                                      description: matchExpressions is a list of label
+                                        selector requirements. The requirements are
+                                        ANDed.
+                                      items:
+                                        description: A label selector requirement
+                                          is a selector that contains values, a key,
+                                          and an operator that relates the key and
+                                          values.
+                                        properties:
+                                          key:
+                                            description: key is the label key that
+                                              the selector applies to.
+                                            type: string
+                                          operator:
+                                            description: operator represents a key's
+                                              relationship to a set of values. Valid
+                                              operators are In, NotIn, Exists and
+                                              DoesNotExist.
+                                            type: string
+                                          values:
+                                            description: values is an array of string
+                                              values. If the operator is In or NotIn,
+                                              the values array must be non-empty.
+                                              If the operator is Exists or DoesNotExist,
+                                              the values array must be empty. This
+                                              array is replaced during a strategic
+                                              merge patch.
+                                            items:
+                                              type: string
+                                            type: array
+                                        required:
+                                        - key
+                                        - operator
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      description: matchLabels is a map of {key,value}
+                                        pairs. A single {key,value} in the matchLabels
+                                        map is equivalent to an element of matchExpressions,
+                                        whose key field is "key", the operator is
+                                        "In", and the values array contains only "value".
+                                        The requirements are ANDed.
+                                      type: object
+                                  type: object
+                                namespaces:
+                                  description: namespaces specifies a static list
+                                    of namespace names that the term applies to. The
+                                    term is applied to the union of the namespaces
+                                    listed in this field and the ones selected by
+                                    namespaceSelector. null or empty namespaces list
+                                    and null namespaceSelector means "this pod's namespace"
+                                  items:
+                                    type: string
+                                  type: array
+                                topologyKey:
+                                  description: This pod should be co-located (affinity)
+                                    or not co-located (anti-affinity) with the pods
+                                    matching the labelSelector in the specified namespaces,
+                                    where co-located is defined as running on a node
+                                    whose value of the label with key topologyKey
+                                    matches that of any node on which any of the selected
+                                    pods is running. Empty topologyKey is not allowed.
+                                  type: string
+                              required:
+                              - topologyKey
+                              type: object
+                            type: array
+                        type: object
+                      podAntiAffinity:
+                        description: Describes pod anti-affinity scheduling rules
+                          (e.g. avoid putting this pod in the same node, zone, etc.
+                          as some other pod(s)).
+                        properties:
+                          preferredDuringSchedulingIgnoredDuringExecution:
+                            description: The scheduler will prefer to schedule pods
+                              to nodes that satisfy the anti-affinity expressions
+                              specified by this field, but it may choose a node that
+                              violates one or more of the expressions. The node that
+                              is most preferred is the one with the greatest sum of
+                              weights, i.e. for each node that meets all of the scheduling
+                              requirements (resource request, requiredDuringScheduling
+                              anti-affinity expressions, etc.), compute a sum by iterating
+                              through the elements of this field and adding "weight"
+                              to the sum if the node has pods which matches the corresponding
+                              podAffinityTerm; the node(s) with the highest sum are
+                              the most preferred.
+                            items:
+                              description: The weights of all of the matched WeightedPodAffinityTerm
+                                fields are added per-node to find the most preferred
+                                node(s)
+                              properties:
+                                podAffinityTerm:
+                                  description: Required. A pod affinity term, associated
+                                    with the corresponding weight.
+                                  properties:
+                                    labelSelector:
+                                      description: A label query over a set of resources,
+                                        in this case pods.
+                                      properties:
+                                        matchExpressions:
+                                          description: matchExpressions is a list
+                                            of label selector requirements. The requirements
+                                            are ANDed.
+                                          items:
+                                            description: A label selector requirement
+                                              is a selector that contains values,
+                                              a key, and an operator that relates
+                                              the key and values.
+                                            properties:
+                                              key:
+                                                description: key is the label key
+                                                  that the selector applies to.
+                                                type: string
+                                              operator:
+                                                description: operator represents a
+                                                  key's relationship to a set of values.
+                                                  Valid operators are In, NotIn, Exists
+                                                  and DoesNotExist.
+                                                type: string
+                                              values:
+                                                description: values is an array of
+                                                  string values. If the operator is
+                                                  In or NotIn, the values array must
+                                                  be non-empty. If the operator is
+                                                  Exists or DoesNotExist, the values
+                                                  array must be empty. This array
+                                                  is replaced during a strategic merge
+                                                  patch.
+                                                items:
+                                                  type: string
+                                                type: array
+                                            required:
+                                            - key
+                                            - operator
+                                            type: object
+                                          type: array
+                                        matchLabels:
+                                          additionalProperties:
+                                            type: string
+                                          description: matchLabels is a map of {key,value}
+                                            pairs. A single {key,value} in the matchLabels
+                                            map is equivalent to an element of matchExpressions,
+                                            whose key field is "key", the operator
+                                            is "In", and the values array contains
+                                            only "value". The requirements are ANDed.
+                                          type: object
+                                      type: object
+                                    namespaceSelector:
+                                      description: A label query over the set of namespaces
+                                        that the term applies to. The term is applied
+                                        to the union of the namespaces selected by
+                                        this field and the ones listed in the namespaces
+                                        field. null selector and null or empty namespaces
+                                        list means "this pod's namespace". An empty
+                                        selector ({}) matches all namespaces. This
+                                        field is beta-level and is only honored when
+                                        PodAffinityNamespaceSelector feature is enabled.
+                                      properties:
+                                        matchExpressions:
+                                          description: matchExpressions is a list
+                                            of label selector requirements. The requirements
+                                            are ANDed.
+                                          items:
+                                            description: A label selector requirement
+                                              is a selector that contains values,
+                                              a key, and an operator that relates
+                                              the key and values.
+                                            properties:
+                                              key:
+                                                description: key is the label key
+                                                  that the selector applies to.
+                                                type: string
+                                              operator:
+                                                description: operator represents a
+                                                  key's relationship to a set of values.
+                                                  Valid operators are In, NotIn, Exists
+                                                  and DoesNotExist.
+                                                type: string
+                                              values:
+                                                description: values is an array of
+                                                  string values. If the operator is
+                                                  In or NotIn, the values array must
+                                                  be non-empty. If the operator is
+                                                  Exists or DoesNotExist, the values
+                                                  array must be empty. This array
+                                                  is replaced during a strategic merge
+                                                  patch.
+                                                items:
+                                                  type: string
+                                                type: array
+                                            required:
+                                            - key
+                                            - operator
+                                            type: object
+                                          type: array
+                                        matchLabels:
+                                          additionalProperties:
+                                            type: string
+                                          description: matchLabels is a map of {key,value}
+                                            pairs. A single {key,value} in the matchLabels
+                                            map is equivalent to an element of matchExpressions,
+                                            whose key field is "key", the operator
+                                            is "In", and the values array contains
+                                            only "value". The requirements are ANDed.
+                                          type: object
+                                      type: object
+                                    namespaces:
+                                      description: namespaces specifies a static list
+                                        of namespace names that the term applies to.
+                                        The term is applied to the union of the namespaces
+                                        listed in this field and the ones selected
+                                        by namespaceSelector. null or empty namespaces
+                                        list and null namespaceSelector means "this
+                                        pod's namespace"
+                                      items:
+                                        type: string
+                                      type: array
+                                    topologyKey:
+                                      description: This pod should be co-located (affinity)
+                                        or not co-located (anti-affinity) with the
+                                        pods matching the labelSelector in the specified
+                                        namespaces, where co-located is defined as
+                                        running on a node whose value of the label
+                                        with key topologyKey matches that of any node
+                                        on which any of the selected pods is running.
+                                        Empty topologyKey is not allowed.
+                                      type: string
+                                  required:
+                                  - topologyKey
+                                  type: object
+                                weight:
+                                  description: weight associated with matching the
+                                    corresponding podAffinityTerm, in the range 1-100.
+                                  format: int32
+                                  type: integer
+                              required:
+                              - podAffinityTerm
+                              - weight
+                              type: object
+                            type: array
+                          requiredDuringSchedulingIgnoredDuringExecution:
+                            description: If the anti-affinity requirements specified
+                              by this field are not met at scheduling time, the pod
+                              will not be scheduled onto the node. If the anti-affinity
+                              requirements specified by this field cease to be met
+                              at some point during pod execution (e.g. due to a pod
+                              label update), the system may or may not try to eventually
+                              evict the pod from its node. When there are multiple
+                              elements, the lists of nodes corresponding to each podAffinityTerm
+                              are intersected, i.e. all terms must be satisfied.
+                            items:
+                              description: Defines a set of pods (namely those matching
+                                the labelSelector relative to the given namespace(s))
+                                that this pod should be co-located (affinity) or not
+                                co-located (anti-affinity) with, where co-located
+                                is defined as running on a node whose value of the
+                                label with key <topologyKey> matches that of any node
+                                on which a pod of the set of pods is running
+                              properties:
+                                labelSelector:
+                                  description: A label query over a set of resources,
+                                    in this case pods.
+                                  properties:
+                                    matchExpressions:
+                                      description: matchExpressions is a list of label
+                                        selector requirements. The requirements are
+                                        ANDed.
+                                      items:
+                                        description: A label selector requirement
+                                          is a selector that contains values, a key,
+                                          and an operator that relates the key and
+                                          values.
+                                        properties:
+                                          key:
+                                            description: key is the label key that
+                                              the selector applies to.
+                                            type: string
+                                          operator:
+                                            description: operator represents a key's
+                                              relationship to a set of values. Valid
+                                              operators are In, NotIn, Exists and
+                                              DoesNotExist.
+                                            type: string
+                                          values:
+                                            description: values is an array of string
+                                              values. If the operator is In or NotIn,
+                                              the values array must be non-empty.
+                                              If the operator is Exists or DoesNotExist,
+                                              the values array must be empty. This
+                                              array is replaced during a strategic
+                                              merge patch.
+                                            items:
+                                              type: string
+                                            type: array
+                                        required:
+                                        - key
+                                        - operator
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      description: matchLabels is a map of {key,value}
+                                        pairs. A single {key,value} in the matchLabels
+                                        map is equivalent to an element of matchExpressions,
+                                        whose key field is "key", the operator is
+                                        "In", and the values array contains only "value".
+                                        The requirements are ANDed.
+                                      type: object
+                                  type: object
+                                namespaceSelector:
+                                  description: A label query over the set of namespaces
+                                    that the term applies to. The term is applied
+                                    to the union of the namespaces selected by this
+                                    field and the ones listed in the namespaces field.
+                                    null selector and null or empty namespaces list
+                                    means "this pod's namespace". An empty selector
+                                    ({}) matches all namespaces. This field is beta-level
+                                    and is only honored when PodAffinityNamespaceSelector
+                                    feature is enabled.
+                                  properties:
+                                    matchExpressions:
+                                      description: matchExpressions is a list of label
+                                        selector requirements. The requirements are
+                                        ANDed.
+                                      items:
+                                        description: A label selector requirement
+                                          is a selector that contains values, a key,
+                                          and an operator that relates the key and
+                                          values.
+                                        properties:
+                                          key:
+                                            description: key is the label key that
+                                              the selector applies to.
+                                            type: string
+                                          operator:
+                                            description: operator represents a key's
+                                              relationship to a set of values. Valid
+                                              operators are In, NotIn, Exists and
+                                              DoesNotExist.
+                                            type: string
+                                          values:
+                                            description: values is an array of string
+                                              values. If the operator is In or NotIn,
+                                              the values array must be non-empty.
+                                              If the operator is Exists or DoesNotExist,
+                                              the values array must be empty. This
+                                              array is replaced during a strategic
+                                              merge patch.
+                                            items:
+                                              type: string
+                                            type: array
+                                        required:
+                                        - key
+                                        - operator
+                                        type: object
+                                      type: array
+                                    matchLabels:
+                                      additionalProperties:
+                                        type: string
+                                      description: matchLabels is a map of {key,value}
+                                        pairs. A single {key,value} in the matchLabels
+                                        map is equivalent to an element of matchExpressions,
+                                        whose key field is "key", the operator is
+                                        "In", and the values array contains only "value".
+                                        The requirements are ANDed.
+                                      type: object
+                                  type: object
+                                namespaces:
+                                  description: namespaces specifies a static list
+                                    of namespace names that the term applies to. The
+                                    term is applied to the union of the namespaces
+                                    listed in this field and the ones selected by
+                                    namespaceSelector. null or empty namespaces list
+                                    and null namespaceSelector means "this pod's namespace"
+                                  items:
+                                    type: string
+                                  type: array
+                                topologyKey:
+                                  description: This pod should be co-located (affinity)
+                                    or not co-located (anti-affinity) with the pods
+                                    matching the labelSelector in the specified namespaces,
+                                    where co-located is defined as running on a node
+                                    whose value of the label with key topologyKey
+                                    matches that of any node on which any of the selected
+                                    pods is running. Empty topologyKey is not allowed.
+                                  type: string
+                              required:
+                              - topologyKey
+                              type: object
+                            type: array
+                        type: object
+                    type: object
+                  annotations:
+                    additionalProperties:
+                      type: string
+                    type: object
+                  envs:
+                    items:
+                      description: EnvVar represents an environment variable present
+                        in a Container.
+                      properties:
+                        name:
+                          description: Name of the environment variable. Must be a
+                            C_IDENTIFIER.
+                          type: string
+                        value:
+                          description: 'Variable references $(VAR_NAME) are expanded
+                            using the previously defined environment variables in
+                            the container and any service environment variables. If
+                            a variable cannot be resolved, the reference in the input
+                            string will be unchanged. Double $$ are reduced to a single
+                            $, which allows for escaping the $(VAR_NAME) syntax: i.e.
+                            "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)".
+                            Escaped references will never be expanded, regardless
+                            of whether the variable exists or not. Defaults to "".'
+                          type: string
+                        valueFrom:
+                          description: Source for the environment variable's value.
+                            Cannot be used if value is not empty.
+                          properties:
+                            configMapKeyRef:
+                              description: Selects a key of a ConfigMap.
+                              properties:
+                                key:
+                                  description: The key to select.
+                                  type: string
+                                name:
+                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                    TODO: Add other useful fields. apiVersion, kind,
+                                    uid?'
+                                  type: string
+                                optional:
+                                  description: Specify whether the ConfigMap or its
+                                    key must be defined
+                                  type: boolean
+                              required:
+                              - key
+                              type: object
+                            fieldRef:
+                              description: 'Selects a field of the pod: supports metadata.name,
+                                metadata.namespace, `metadata.labels[''<KEY>'']`,
+                                `metadata.annotations[''<KEY>'']`, spec.nodeName,
+                                spec.serviceAccountName, status.hostIP, status.podIP,
+                                status.podIPs.'
+                              properties:
+                                apiVersion:
+                                  description: Version of the schema the FieldPath
+                                    is written in terms of, defaults to "v1".
+                                  type: string
+                                fieldPath:
+                                  description: Path of the field to select in the
+                                    specified API version.
+                                  type: string
+                              required:
+                              - fieldPath
+                              type: object
+                            resourceFieldRef:
+                              description: 'Selects a resource of the container: only
+                                resources limits and requests (limits.cpu, limits.memory,
+                                limits.ephemeral-storage, requests.cpu, requests.memory
+                                and requests.ephemeral-storage) are currently supported.'
+                              properties:
+                                containerName:
+                                  description: 'Container name: required for volumes,
+                                    optional for env vars'
+                                  type: string
+                                divisor:
+                                  anyOf:
+                                  - type: integer
+                                  - type: string
+                                  description: Specifies the output format of the
+                                    exposed resources, defaults to "1"
+                                  pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                                  x-kubernetes-int-or-string: true
+                                resource:
+                                  description: 'Required: resource to select'
+                                  type: string
+                              required:
+                              - resource
+                              type: object
+                            secretKeyRef:
+                              description: Selects a key of a secret in the pod's
+                                namespace
+                              properties:
+                                key:
+                                  description: The key of the secret to select from.  Must
+                                    be a valid secret key.
+                                  type: string
+                                name:
+                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                    TODO: Add other useful fields. apiVersion, kind,
+                                    uid?'
+                                  type: string
+                                optional:
+                                  description: Specify whether the Secret or its key
+                                    must be defined
+                                  type: boolean
+                              required:
+                              - key
+                              type: object
+                          type: object
+                      required:
+                      - name
+                      type: object
+                    type: array
+                  labels:
+                    additionalProperties:
+                      type: string
+                    type: object
+                  resources:
+                    description: ResourceRequirements describes the compute resource
+                      requirements.
+                    properties:
+                      limits:
+                        additionalProperties:
+                          anyOf:
+                          - type: integer
+                          - type: string
+                          pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                          x-kubernetes-int-or-string: true
+                        description: 'Limits describes the maximum amount of compute
+                          resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+                        type: object
+                      requests:
+                        additionalProperties:
+                          anyOf:
+                          - type: integer
+                          - type: string
+                          pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                          x-kubernetes-int-or-string: true
+                        description: 'Requests describes the minimum amount of compute
+                          resources required. If Requests is omitted for a container,
+                          it defaults to Limits if that is explicitly specified, otherwise
+                          to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+                        type: object
+                    type: object
+                  tolerations:
+                    description: Tolerations specifies the pod's tolerations.
+                    items:
+                      description: The pod this Toleration is attached to tolerates
+                        any taint that matches the triple <key,value,effect> using
+                        the matching operator <operator>.
+                      properties:
+                        effect:
+                          description: Effect indicates the taint effect to match.
+                            Empty means match all taint effects. When specified, allowed
+                            values are NoSchedule, PreferNoSchedule and NoExecute.
+                          type: string
+                        key:
+                          description: Key is the taint key that the toleration applies
+                            to. Empty means match all taint keys. If the key is empty,
+                            operator must be Exists; this combination means to match
+                            all values and all keys.
+                          type: string
+                        operator:
+                          description: Operator represents a key's relationship to
+                            the value. Valid operators are Exists and Equal. Defaults
+                            to Equal. Exists is equivalent to wildcard for value,
+                            so that a pod can tolerate all taints of a particular
+                            category.
+                          type: string
+                        tolerationSeconds:
+                          description: TolerationSeconds represents the period of
+                            time the toleration (which must be of effect NoExecute,
+                            otherwise this field is ignored) tolerates the taint.
+                            By default, it is not set, which means tolerate the taint
+                            forever (do not evict). Zero and negative values will
+                            be treated as 0 (evict immediately) by the system.
+                          format: int64
+                          type: integer
+                        value:
+                          description: Value is the taint value the toleration matches
+                            to. If the operator is Exists, the value should be empty,
+                            otherwise just a regular string.
+                          type: string
+                      type: object
+                    type: array
+                type: object
+              log_pvc_name:
+                description: LogPvcName defines the  log capacity of application ,the
+                  position is /opt/dolphinscheduler/logs eg 20Gi
                 type: string
+              node_port:
+                default: 30001
+                description: NodePort is the port node exposed
+                format: int32
+                type: integer
+              paused:
+                default: false
+                description: Paused is to pause the control of the operator for the
+                  ds-master .
+                type: boolean
+              replicas:
+                default: 3
+                description: Replicas is the expected size of the ms-master. The ds-master-operator
+                  will eventually make the size of the running equal to the expected
+                  size. The vaild range of the size is from 1 to 7.
+                format: int32
+                maximum: 7
+                minimum: 1
+                type: integer
+              repository:
+                default: apache/dolphinscheduler-master
+                description: Repository is the name of the repository that hosts ds
+                  container images. It should be direct clone of the repository in
+                  official By default, it is `apache/dolphinscheduler-master`.
+                type: string
+              version:
+                default: 3.0.0-alpha
+                description: Version is the expected version of the ds cluster. The
+                  ds-operator will eventually make the ds cluster version equal to
+                  the expected version. If version is not set, default is "3.0.0-alpha".
+                type: string
+              zookeeper_connect:
+                type: string
+            required:
+            - datasource
+            - node_port
+            - replicas
             type: object
           status:
             description: DSApiStatus defines the observed state of DSApi
+            properties:
+              conditions:
+                description: Condition keeps track of all cluster conditions, if they
+                  exist.
+                items:
+                  description: DsCondition represents one current condition of a ds
+                    cluster. A condition might not show up if it is not happening.
+                    For example, if a cluster is not upgrading, the Upgrading condition
+                    would not show up. If a cluster is upgrading and encountered a
+                    problem that prevents the upgrade, the Upgrading condition's status
+                    will would be False and communicate the problem back.
+                  properties:
+                    lastTransitionTime:
+                      description: Last time the condition transitioned from one status
+                        to another.
+                      type: string
+                    lastUpdateTime:
+                      description: The last time this condition was updated.
+                      type: string
+                    message:
+                      description: A human readable message indicating details about
+                        the transition.
+                      type: string
+                    reason:
+                      description: The reason for the condition's last transition.
+                      type: string
+                    status:
+                      description: Status of the condition, one of True, False, Unknown.
+                      type: string
+                    type:
+                      description: Type of cluster condition.
+                      type: string
+                  required:
+                  - status
+                  - type
+                  type: object
+                type: array
+              controlPaused:
+                default: false
+                description: ControlPaused indicates the operator pauses the control
+                  of the cluster.
+                type: boolean
+              phase:
+                description: 'INSERT ADDITIONAL STATUS FIELD - define observed state
+                  of cluster Important: Run "make" to regenerate code after modifying
+                  this file INSERT ADDITIONAL STATUS FIELD - define observed state
+                  of cluster Important: Run "make" to regenerate code after modifying
+                  this file Phase is the cluster running phase'
+                enum:
+                - ""
+                - Creating
+                - Running
+                - Failed
+                - Finished
+                type: string
+              replicas:
+                default: 0
+                description: Replicas is the current size of the cluster
+                type: integer
             type: object
         type: object
     served: true
diff --git a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsmasters.yaml b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsmasters.yaml
index 0aff315..1823d52 100644
--- a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsmasters.yaml
+++ b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsmasters.yaml
@@ -66,7 +66,7 @@ spec:
                   pods.
                 properties:
                   affinity:
-                    description: The scheduling constraints on dm-master pods.
+                    description: Affinity is a group of affinity scheduling rules.
                     properties:
                       nodeAffinity:
                         description: Describes node affinity scheduling rules for
@@ -934,20 +934,14 @@ spec:
                     additionalProperties:
                       type: string
                     description: Annotations specifies the annotations to attach to
-                      pods the operator creates for the dm-master cluster. The "dm-master.version"
-                      annotation is reserved for the internal use of the dm-master
-                      operator.
+                      pods the operator creates for the cluster.
                     type: object
-                  antiAffinity:
-                    description: '**DEPRECATED**. Use Affinity instead.'
-                    type: boolean
-                  dm-masterEnv:
-                    description: List of environment variables to set in the dm-master
-                      container. This is used to configure dm-master process. dm-master
-                      cluster cannot be created, when bad environement variables are
-                      provided. Do not overwrite any flags used to bootstrap the cluster
-                      (for example `--initial-cluster` flag). This field cannot be
-                      updated.
+                  envs:
+                    description: List of environment variables to set in the  container.
+                      This is used to configure process. cluster cannot be created,
+                      when bad environement variables are provided. Do not overwrite
+                      any flags used to bootstrap the cluster (for example `--initial-cluster`
+                      flag). This field cannot be updated.
                     items:
                       description: EnvVar represents an environment variable present
                         in a Container.
@@ -1060,9 +1054,7 @@ spec:
                     additionalProperties:
                       type: string
                     description: Labels specifies the labels to attach to pods the
-                      operator creates for the dm-master cluster. "app" and "dm-master_*"
-                      labels are reserved for the internal use of the dm-master operator.
-                      Do not overwrite them.
+                      operator creates for the Do not overwrite them.
                     type: object
                   nodeSelector:
                     additionalProperties:
@@ -1071,179 +1063,9 @@ spec:
                       For the pod to be eligible to run on a node, the node must have
                       each of the indicated key-value pairs as labels.
                     type: object
-                  persistentVolumeClaimSpec:
-                    description: PersistentVolumeClaimSpec is the spec to describe
-                      PVC for the dm-master container This field is optional. If no
-                      PVC spec, dm-master container will use emptyDir as volume Note.
-                      This feature is in alpha stage. It is currently only used as
-                      non-stable storage, not the stable storage. Future work need
-                      to make it used as stable storage.
-                    properties:
-                      accessModes:
-                        description: 'AccessModes contains the desired access modes
-                          the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1'
-                        items:
-                          type: string
-                        type: array
-                      dataSource:
-                        description: 'This field can be used to specify either: *
-                          An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)
-                          * An existing PVC (PersistentVolumeClaim) If the provisioner
-                          or an external controller can support the specified data
-                          source, it will create a new volume based on the contents
-                          of the specified data source. If the AnyVolumeDataSource
-                          feature gate is enabled, this field will always have the
-                          same contents as the DataSourceRef field.'
-                        properties:
-                          apiGroup:
-                            description: APIGroup is the group for the resource being
-                              referenced. If APIGroup is not specified, the specified
-                              Kind must be in the core API group. For any other third-party
-                              types, APIGroup is required.
-                            type: string
-                          kind:
-                            description: Kind is the type of resource being referenced
-                            type: string
-                          name:
-                            description: Name is the name of resource being referenced
-                            type: string
-                        required:
-                        - kind
-                        - name
-                        type: object
-                      dataSourceRef:
-                        description: 'Specifies the object from which to populate
-                          the volume with data, if a non-empty volume is desired.
-                          This may be any local object from a non-empty API group
-                          (non core object) or a PersistentVolumeClaim object. When
-                          this field is specified, volume binding will only succeed
-                          if the type of the specified object matches some installed
-                          volume populator or dynamic provisioner. This field will
-                          replace the functionality of the DataSource field and as
-                          such if both fields are non-empty, they must have the same
-                          value. For backwards compatibility, both fields (DataSource
-                          and DataSourceRef) will be set to the same value automatically
-                          if one of them is empty and the other is non-empty. There
-                          are two important differences between DataSource and DataSourceRef:
-                          * While DataSource only allows two specific types of objects,
-                          DataSourceRef allows any non-core object, as well as PersistentVolumeClaim
-                          objects. * While DataSource ignores disallowed values (dropping
-                          them), DataSourceRef preserves all values, and generates
-                          an error if a disallowed value is specified. (Alpha) Using
-                          this field requires the AnyVolumeDataSource feature gate
-                          to be enabled.'
-                        properties:
-                          apiGroup:
-                            description: APIGroup is the group for the resource being
-                              referenced. If APIGroup is not specified, the specified
-                              Kind must be in the core API group. For any other third-party
-                              types, APIGroup is required.
-                            type: string
-                          kind:
-                            description: Kind is the type of resource being referenced
-                            type: string
-                          name:
-                            description: Name is the name of resource being referenced
-                            type: string
-                        required:
-                        - kind
-                        - name
-                        type: object
-                      resources:
-                        description: 'Resources represents the minimum resources the
-                          volume should have. If RecoverVolumeExpansionFailure feature
-                          is enabled users are allowed to specify resource requirements
-                          that are lower than previous value but must still be higher
-                          than capacity recorded in the status field of the claim.
-                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
-                        properties:
-                          limits:
-                            additionalProperties:
-                              anyOf:
-                              - type: integer
-                              - type: string
-                              pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                              x-kubernetes-int-or-string: true
-                            description: 'Limits describes the maximum amount of compute
-                              resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
-                            type: object
-                          requests:
-                            additionalProperties:
-                              anyOf:
-                              - type: integer
-                              - type: string
-                              pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                              x-kubernetes-int-or-string: true
-                            description: 'Requests describes the minimum amount of
-                              compute resources required. If Requests is omitted for
-                              a container, it defaults to Limits if that is explicitly
-                              specified, otherwise to an implementation-defined value.
-                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
-                            type: object
-                        type: object
-                      selector:
-                        description: A label query over volumes to consider for binding.
-                        properties:
-                          matchExpressions:
-                            description: matchExpressions is a list of label selector
-                              requirements. The requirements are ANDed.
-                            items:
-                              description: A label selector requirement is a selector
-                                that contains values, a key, and an operator that
-                                relates the key and values.
-                              properties:
-                                key:
-                                  description: key is the label key that the selector
-                                    applies to.
-                                  type: string
-                                operator:
-                                  description: operator represents a key's relationship
-                                    to a set of values. Valid operators are In, NotIn,
-                                    Exists and DoesNotExist.
-                                  type: string
-                                values:
-                                  description: values is an array of string values.
-                                    If the operator is In or NotIn, the values array
-                                    must be non-empty. If the operator is Exists or
-                                    DoesNotExist, the values array must be empty.
-                                    This array is replaced during a strategic merge
-                                    patch.
-                                  items:
-                                    type: string
-                                  type: array
-                              required:
-                              - key
-                              - operator
-                              type: object
-                            type: array
-                          matchLabels:
-                            additionalProperties:
-                              type: string
-                            description: matchLabels is a map of {key,value} pairs.
-                              A single {key,value} in the matchLabels map is equivalent
-                              to an element of matchExpressions, whose key field is
-                              "key", the operator is "In", and the values array contains
-                              only "value". The requirements are ANDed.
-                            type: object
-                        type: object
-                      storageClassName:
-                        description: 'Name of the StorageClass required by the claim.
-                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
-                        type: string
-                      volumeMode:
-                        description: volumeMode defines what type of volume is required
-                          by the claim. Value of Filesystem is implied when not included
-                          in claim spec.
-                        type: string
-                      volumeName:
-                        description: VolumeName is the binding reference to the PersistentVolume
-                          backing this claim.
-                        type: string
-                    type: object
                   resources:
-                    description: Resources is the resource requirements for the dm-master
-                      container. This field cannot be updated once the cluster is
-                      created.
+                    description: Resources is the resource requirements for the  container.
+                      This field cannot be updated once the cluster is created.
                     properties:
                       limits:
                         additionalProperties:
diff --git a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsworkers.yaml b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsworkers.yaml
index a7dfb80..b3d53cb 100644
--- a/config/crd/bases/ds.apache.dolphinscheduler.dev_dsworkers.yaml
+++ b/config/crd/bases/ds.apache.dolphinscheduler.dev_dsworkers.yaml
@@ -79,7 +79,7 @@ spec:
                   pods.
                 properties:
                   affinity:
-                    description: The scheduling constraints on dm-master pods.
+                    description: Affinity is a group of affinity scheduling rules.
                     properties:
                       nodeAffinity:
                         description: Describes node affinity scheduling rules for
@@ -947,20 +947,14 @@ spec:
                     additionalProperties:
                       type: string
                     description: Annotations specifies the annotations to attach to
-                      pods the operator creates for the dm-master cluster. The "dm-master.version"
-                      annotation is reserved for the internal use of the dm-master
-                      operator.
+                      pods the operator creates for the cluster.
                     type: object
-                  antiAffinity:
-                    description: '**DEPRECATED**. Use Affinity instead.'
-                    type: boolean
-                  dm-masterEnv:
-                    description: List of environment variables to set in the dm-master
-                      container. This is used to configure dm-master process. dm-master
-                      cluster cannot be created, when bad environement variables are
-                      provided. Do not overwrite any flags used to bootstrap the cluster
-                      (for example `--initial-cluster` flag). This field cannot be
-                      updated.
+                  envs:
+                    description: List of environment variables to set in the  container.
+                      This is used to configure process. cluster cannot be created,
+                      when bad environement variables are provided. Do not overwrite
+                      any flags used to bootstrap the cluster (for example `--initial-cluster`
+                      flag). This field cannot be updated.
                     items:
                       description: EnvVar represents an environment variable present
                         in a Container.
@@ -1073,9 +1067,7 @@ spec:
                     additionalProperties:
                       type: string
                     description: Labels specifies the labels to attach to pods the
-                      operator creates for the dm-master cluster. "app" and "dm-master_*"
-                      labels are reserved for the internal use of the dm-master operator.
-                      Do not overwrite them.
+                      operator creates for the Do not overwrite them.
                     type: object
                   nodeSelector:
                     additionalProperties:
@@ -1084,179 +1076,9 @@ spec:
                       For the pod to be eligible to run on a node, the node must have
                       each of the indicated key-value pairs as labels.
                     type: object
-                  persistentVolumeClaimSpec:
-                    description: PersistentVolumeClaimSpec is the spec to describe
-                      PVC for the dm-master container This field is optional. If no
-                      PVC spec, dm-master container will use emptyDir as volume Note.
-                      This feature is in alpha stage. It is currently only used as
-                      non-stable storage, not the stable storage. Future work need
-                      to make it used as stable storage.
-                    properties:
-                      accessModes:
-                        description: 'AccessModes contains the desired access modes
-                          the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1'
-                        items:
-                          type: string
-                        type: array
-                      dataSource:
-                        description: 'This field can be used to specify either: *
-                          An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)
-                          * An existing PVC (PersistentVolumeClaim) If the provisioner
-                          or an external controller can support the specified data
-                          source, it will create a new volume based on the contents
-                          of the specified data source. If the AnyVolumeDataSource
-                          feature gate is enabled, this field will always have the
-                          same contents as the DataSourceRef field.'
-                        properties:
-                          apiGroup:
-                            description: APIGroup is the group for the resource being
-                              referenced. If APIGroup is not specified, the specified
-                              Kind must be in the core API group. For any other third-party
-                              types, APIGroup is required.
-                            type: string
-                          kind:
-                            description: Kind is the type of resource being referenced
-                            type: string
-                          name:
-                            description: Name is the name of resource being referenced
-                            type: string
-                        required:
-                        - kind
-                        - name
-                        type: object
-                      dataSourceRef:
-                        description: 'Specifies the object from which to populate
-                          the volume with data, if a non-empty volume is desired.
-                          This may be any local object from a non-empty API group
-                          (non core object) or a PersistentVolumeClaim object. When
-                          this field is specified, volume binding will only succeed
-                          if the type of the specified object matches some installed
-                          volume populator or dynamic provisioner. This field will
-                          replace the functionality of the DataSource field and as
-                          such if both fields are non-empty, they must have the same
-                          value. For backwards compatibility, both fields (DataSource
-                          and DataSourceRef) will be set to the same value automatically
-                          if one of them is empty and the other is non-empty. There
-                          are two important differences between DataSource and DataSourceRef:
-                          * While DataSource only allows two specific types of objects,
-                          DataSourceRef allows any non-core object, as well as PersistentVolumeClaim
-                          objects. * While DataSource ignores disallowed values (dropping
-                          them), DataSourceRef preserves all values, and generates
-                          an error if a disallowed value is specified. (Alpha) Using
-                          this field requires the AnyVolumeDataSource feature gate
-                          to be enabled.'
-                        properties:
-                          apiGroup:
-                            description: APIGroup is the group for the resource being
-                              referenced. If APIGroup is not specified, the specified
-                              Kind must be in the core API group. For any other third-party
-                              types, APIGroup is required.
-                            type: string
-                          kind:
-                            description: Kind is the type of resource being referenced
-                            type: string
-                          name:
-                            description: Name is the name of resource being referenced
-                            type: string
-                        required:
-                        - kind
-                        - name
-                        type: object
-                      resources:
-                        description: 'Resources represents the minimum resources the
-                          volume should have. If RecoverVolumeExpansionFailure feature
-                          is enabled users are allowed to specify resource requirements
-                          that are lower than previous value but must still be higher
-                          than capacity recorded in the status field of the claim.
-                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
-                        properties:
-                          limits:
-                            additionalProperties:
-                              anyOf:
-                              - type: integer
-                              - type: string
-                              pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                              x-kubernetes-int-or-string: true
-                            description: 'Limits describes the maximum amount of compute
-                              resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
-                            type: object
-                          requests:
-                            additionalProperties:
-                              anyOf:
-                              - type: integer
-                              - type: string
-                              pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
-                              x-kubernetes-int-or-string: true
-                            description: 'Requests describes the minimum amount of
-                              compute resources required. If Requests is omitted for
-                              a container, it defaults to Limits if that is explicitly
-                              specified, otherwise to an implementation-defined value.
-                              More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
-                            type: object
-                        type: object
-                      selector:
-                        description: A label query over volumes to consider for binding.
-                        properties:
-                          matchExpressions:
-                            description: matchExpressions is a list of label selector
-                              requirements. The requirements are ANDed.
-                            items:
-                              description: A label selector requirement is a selector
-                                that contains values, a key, and an operator that
-                                relates the key and values.
-                              properties:
-                                key:
-                                  description: key is the label key that the selector
-                                    applies to.
-                                  type: string
-                                operator:
-                                  description: operator represents a key's relationship
-                                    to a set of values. Valid operators are In, NotIn,
-                                    Exists and DoesNotExist.
-                                  type: string
-                                values:
-                                  description: values is an array of string values.
-                                    If the operator is In or NotIn, the values array
-                                    must be non-empty. If the operator is Exists or
-                                    DoesNotExist, the values array must be empty.
-                                    This array is replaced during a strategic merge
-                                    patch.
-                                  items:
-                                    type: string
-                                  type: array
-                              required:
-                              - key
-                              - operator
-                              type: object
-                            type: array
-                          matchLabels:
-                            additionalProperties:
-                              type: string
-                            description: matchLabels is a map of {key,value} pairs.
-                              A single {key,value} in the matchLabels map is equivalent
-                              to an element of matchExpressions, whose key field is
-                              "key", the operator is "In", and the values array contains
-                              only "value". The requirements are ANDed.
-                            type: object
-                        type: object
-                      storageClassName:
-                        description: 'Name of the StorageClass required by the claim.
-                          More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
-                        type: string
-                      volumeMode:
-                        description: volumeMode defines what type of volume is required
-                          by the claim. Value of Filesystem is implied when not included
-                          in claim spec.
-                        type: string
-                      volumeName:
-                        description: VolumeName is the binding reference to the PersistentVolume
-                          backing this claim.
-                        type: string
-                    type: object
                   resources:
-                    description: Resources is the resource requirements for the dm-master
-                      container. This field cannot be updated once the cluster is
-                      created.
+                    description: Resources is the resource requirements for the  container.
+                      This field cannot be updated once the cluster is created.
                     properties:
                       limits:
                         additionalProperties:
diff --git a/config/samples/ds_v1alpha1_dsapi.yaml b/config/samples/ds_v1alpha1_dsapi.yaml
index e3264d7..fef6f69 100644
--- a/config/samples/ds_v1alpha1_dsapi.yaml
+++ b/config/samples/ds_v1alpha1_dsapi.yaml
@@ -8,8 +8,9 @@ metadata:
 spec:
   replicas: 1
   version: 3.0.0-alpha
+  zookeeper_connect: "172.17.0.5:2181"
   repository: apache/dolphinscheduler-api
-  node_port:30002
+  node_port: 30002
   datasource:
     drive_name: "org.postgresql.Driver"
     url: "jdbc:postgresql://172.17.0.4:5432/dolphinscheduler"
diff --git a/controllers/alert_reconcile.go b/controllers/alert_reconcile.go
index 0f6d0b1..ae94938 100644
--- a/controllers/alert_reconcile.go
+++ b/controllers/alert_reconcile.go
@@ -54,7 +54,7 @@ func createAlertDeployment(cluster *dsv1alpha1.DSAlert) *v1.Deployment {
 			Namespace: cluster.Namespace,
 		},
 		Spec: v1.DeploymentSpec{
-			Replicas: int32Ptr(int32(cluster.Spec.Replicas)),
+			Replicas: int32Ptr(cluster.Spec.Replicas),
 			Selector: &metav1.LabelSelector{
 				MatchLabels: map[string]string{
 					dsv1alpha1.DsAppName: dsv1alpha1.DsAlert,
@@ -71,6 +71,7 @@ func createAlertDeployment(cluster *dsv1alpha1.DSAlert) *v1.Deployment {
 						Name:            dsv1alpha1.DsAlert,
 						Image:           ImageName(cluster.Spec.Repository, cluster.Spec.Version),
 						ImagePullPolicy: corev1.PullIfNotPresent,
+
 						Env: []corev1.EnvVar{
 							{
 								Name:  dsv1alpha1.DataSourceDriveName,
diff --git a/controllers/api_reconcile.go b/controllers/api_reconcile.go
index 0062c14..f8bc647 100644
--- a/controllers/api_reconcile.go
+++ b/controllers/api_reconcile.go
@@ -56,7 +56,7 @@ func createApiDeployment(cluster *dsv1alpha1.DSApi) *v1.Deployment {
 			Namespace: cluster.Namespace,
 		},
 		Spec: v1.DeploymentSpec{
-			Replicas: int32Ptr(int32(cluster.Spec.Replicas)),
+			Replicas: int32Ptr(cluster.Spec.Replicas),
 			Selector: &metav1.LabelSelector{
 				MatchLabels: map[string]string{
 					dsv1alpha1.DsAppName: dsv1alpha1.DsApi,
@@ -74,6 +74,10 @@ func createApiDeployment(cluster *dsv1alpha1.DSApi) *v1.Deployment {
 						Image:           ImageName(cluster.Spec.Repository, cluster.Spec.Version),
 						ImagePullPolicy: corev1.PullIfNotPresent,
 						Env: []corev1.EnvVar{
+							{
+								Name:  dsv1alpha1.EnvZookeeper,
+								Value: cluster.Spec.ZookeeperConnect,
+							},
 							{
 								Name:  dsv1alpha1.DataSourceDriveName,
 								Value: cluster.Spec.Datasource.DriveName,
diff --git a/controllers/deployment.go b/controllers/deployment.go
index 3c0bc70..c965210 100644
--- a/controllers/deployment.go
+++ b/controllers/deployment.go
@@ -1,6 +1,7 @@
 package controllers
 
 import (
+	dsv1alpha1 "dolphinscheduler-operator/api/v1alpha1"
 	v1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
 )
@@ -10,6 +11,34 @@ func IsDeploymentAvailable(deployment *v1.Deployment) bool {
 	return IsDeploymentAvailableConditionTrue(deployment.Status)
 }
 
+func applyDeploymentPolicy(deployment *v1.Deployment, policy *dsv1alpha1.DeploymentPolicy) {
+	if policy == nil {
+		return
+	}
+
+	if policy.Affinity != nil {
+		deployment.Spec.Template.Spec.Affinity = policy.Affinity
+	}
+
+	if len(policy.Tolerations) != 0 {
+		deployment.Spec.Template.Spec.Tolerations = policy.Tolerations
+	}
+
+	mergeLabels(deployment.Labels, policy.Labels)
+
+	if &policy.Resources != nil {
+		deployment.Spec.Template.Spec.Containers[0] = containerWithRequirements(deployment.Spec.Template.Spec.Containers[0], policy.Resources)
+	}
+
+	if len(policy.Envs) != 0 {
+		deployment.Spec.Template.Spec.Containers[0].Env = append(deployment.Spec.Template.Spec.Containers[0].Env, policy.Envs...)
+	}
+
+	for key, value := range policy.Annotations {
+		deployment.ObjectMeta.Annotations[key] = value
+	}
+}
+
 // IsDeploymentAvailableConditionTrue returns true if a deployment is available; false otherwise.
 func IsDeploymentAvailableConditionTrue(status v1.DeploymentStatus) bool {
 	condition := GetDeploymentAvailableCondition(status)
diff --git a/controllers/dsalert_controller.go b/controllers/dsalert_controller.go
index 787585b..2b6d88f 100644
--- a/controllers/dsalert_controller.go
+++ b/controllers/dsalert_controller.go
@@ -125,14 +125,15 @@ func (r *DSAlertReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
 	alertLogger.Info("Ensuring alert service")
 
 	if err := r.ensureAlertService(ctx, cluster); err != nil {
-		return ctrl.Result{Requeue: true}, nil
+		return ctrl.Result{Requeue: false}, nil
 	}
 
+	alertLogger.Info("Ensuring alert Deployment")
 	if requeue, err := r.ensureAlertDeployment(ctx, cluster); err != nil {
 		return ctrl.Result{Requeue: false}, err
 	} else {
-		if !requeue {
-			return ctrl.Result{Requeue: false}, nil
+		if requeue {
+			return ctrl.Result{RequeueAfter: 3 * time.Second}, nil
 		}
 	}
 
@@ -150,7 +151,6 @@ func (r *DSAlertReconciler) SetupWithManager(mgr ctrl.Manager) error {
 		For(&dsv1alpha1.DSAlert{}).
 		Owns(&v1.Deployment{}).
 		Owns(&corev1.Service{}).
-		Owns(&corev1.Pod{}).
 		Complete(r)
 }
 
@@ -171,15 +171,15 @@ func (r *DSAlertReconciler) ensureAlertService(ctx context.Context, cluster *dsv
 		if apierrors.IsNotFound(err) {
 			service = createAlertService(cluster)
 			if err := controllerutil.SetControllerReference(cluster, service, r.Scheme); err != nil {
-				logger.Info("create alert service error")
+				alertLogger.Info("create alert service error")
 				return err
 			}
 			// Remote may already exist, so we will return err, for the next time, this code will not execute
 			if err := r.Client.Create(ctx, service); err != nil {
-				logger.Info("create alert service error1")
+				alertLogger.Info("create alert service error1")
 				return err
 			}
-			logger.Info("the alert service had been created")
+			alertLogger.Info("the alert service had been created")
 		}
 	}
 	return nil
@@ -191,31 +191,51 @@ func (r *DSAlertReconciler) ensureAlertDeployment(ctx context.Context, cluster *
 	if err := r.Client.Get(ctx, deploymentNamespaceName, deployment); err != nil {
 		if apierrors.IsNotFound(err) {
 			deployment = createAlertDeployment(cluster)
+			applyDeploymentPolicy(deployment, cluster.Spec.Deployment)
 		}
 		if err := controllerutil.SetControllerReference(cluster, deployment, r.Scheme); err != nil {
-			return true, err
+			return false, err
 		}
 		if err := r.Client.Create(ctx, deployment); err == nil {
+			alertLogger.Info("the alert deployment had been created")
 			return false, nil
 		} else {
-			return true, err
+			return false, err
 		}
 	} else {
-		err := r.updateAlertDeployment(ctx, deployment, cluster)
-		if err != nil {
-			return false, err
+		if r.predicateUpdate(deployment, cluster) {
+			alertLogger.Info("alert need to update")
+			err := r.updateAlertDeployment(ctx, deployment, cluster)
+			if err != nil {
+				return false, err
+			}
+			return true, nil
+		} else {
+			alertLogger.Info("begin to check alert deployment ")
+			if IsDeploymentAvailable(deployment) {
+				alertLogger.Info("deployment  is available ")
+				return false, nil
+			} else {
+				return true, nil
+			}
 		}
 	}
-
-	return true, nil
 }
 
-//only notice the property of replicas  and image and version
 func (r *DSAlertReconciler) updateAlertDeployment(ctx context.Context, deployment *v1.Deployment, cluster *dsv1alpha1.DSAlert) error {
-	deployment.Spec.Replicas = int32Ptr(int32(cluster.Spec.Replicas))
+	deployment.Spec.Replicas = int32Ptr(cluster.Spec.Replicas)
 	deployment.Spec.Template.Spec.Containers[0].Image = ImageName(cluster.Spec.Repository, cluster.Spec.Version)
 	if err := r.Client.Update(ctx, deployment); err != nil {
 		return err
 	}
 	return nil
 }
+
+//only notice the property of replicas  and image and version
+func (r *DSAlertReconciler) predicateUpdate(deployment *v1.Deployment, cluster *dsv1alpha1.DSAlert) bool {
+	if *deployment.Spec.Replicas == (cluster.Spec.Replicas) && deployment.Spec.Template.Spec.Containers[0].Image == ImageName(cluster.Spec.Repository, cluster.Spec.Version) {
+		alertLogger.Info("no need update")
+		return false
+	}
+	return true
+}
diff --git a/controllers/dsapi_controller.go b/controllers/dsapi_controller.go
index 8d74913..4e95511 100644
--- a/controllers/dsapi_controller.go
+++ b/controllers/dsapi_controller.go
@@ -125,14 +125,14 @@ func (r *DSApiReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
 	apiLogger.Info("Ensuring Api service")
 
 	if err := r.ensureApiService(ctx, cluster); err != nil {
-		return ctrl.Result{Requeue: true}, nil
+		return ctrl.Result{Requeue: false}, nil
 	}
 
 	if requeue, err := r.ensureApiDeployment(ctx, cluster); err != nil {
 		return ctrl.Result{Requeue: false}, err
 	} else {
-		if !requeue {
-			return ctrl.Result{Requeue: false}, nil
+		if requeue {
+			return ctrl.Result{RequeueAfter: 3 * time.Second}, nil
 		}
 	}
 
@@ -150,7 +150,6 @@ func (r *DSApiReconciler) SetupWithManager(mgr ctrl.Manager) error {
 		For(&dsv1alpha1.DSApi{}).
 		Owns(&v1.Deployment{}).
 		Owns(&corev1.Service{}).
-		Owns(&corev1.Pod{}).
 		Complete(r)
 }
 
@@ -167,19 +166,19 @@ func (r *DSApiReconciler) ensureApiService(ctx context.Context, cluster *dsv1alp
 	namespacedName := types.NamespacedName{Namespace: cluster.Namespace, Name: dsv1alpha1.DsApiServiceValue}
 	if err := r.Client.Get(ctx, namespacedName, service); err != nil {
 		// Local cache not found
-		logger.Info("get service error")
+		apiLogger.Info("api  get service error")
 		if apierrors.IsNotFound(err) {
 			service = createApiService(cluster)
 			if err := controllerutil.SetControllerReference(cluster, service, r.Scheme); err != nil {
-				logger.Info("create Api service error")
+				apiLogger.Info("create Api service error")
 				return err
 			}
 			// Remote may already exist, so we will return err, for the next time, this code will not execute
 			if err := r.Client.Create(ctx, service); err != nil {
-				logger.Info("create Api service error1")
+				apiLogger.Info("create Api service error1")
 				return err
 			}
-			logger.Info("the Api service had been created")
+			apiLogger.Info("the Api service had been created")
 		}
 	}
 	return nil
@@ -191,31 +190,51 @@ func (r *DSApiReconciler) ensureApiDeployment(ctx context.Context, cluster *dsv1
 	if err := r.Client.Get(ctx, deploymentNamespaceName, deployment); err != nil {
 		if apierrors.IsNotFound(err) {
 			deployment = createApiDeployment(cluster)
+			applyDeploymentPolicy(deployment, cluster.Spec.Deployment)
 		}
 		if err := controllerutil.SetControllerReference(cluster, deployment, r.Scheme); err != nil {
-			return true, err
+			return false, err
 		}
 		if err := r.Client.Create(ctx, deployment); err == nil {
+			apiLogger.Info("the api deployment had been created")
 			return false, nil
 		} else {
-			return true, err
+			return false, err
 		}
 	} else {
-		err := r.updateApiDeployment(ctx, deployment, cluster)
-		if err != nil {
-			return false, err
+		if r.predicateUpdate(deployment, cluster) {
+			apiLogger.Info("api need to update")
+			err := r.updateApiDeployment(ctx, deployment, cluster)
+			if err != nil {
+				return false, err
+			}
+			return true, nil
+		} else {
+			apiLogger.Info("begin to check deployment ")
+			if IsDeploymentAvailable(deployment) {
+				apiLogger.Info("api deployment  is available ")
+				return false, nil
+			} else {
+				return true, nil
+			}
 		}
 	}
-
-	return true, nil
 }
 
 //only notice the property of replicas  and image and version
 func (r *DSApiReconciler) updateApiDeployment(ctx context.Context, deployment *v1.Deployment, cluster *dsv1alpha1.DSApi) error {
-	deployment.Spec.Replicas = int32Ptr(int32(cluster.Spec.Replicas))
+	deployment.Spec.Replicas = int32Ptr(cluster.Spec.Replicas)
 	deployment.Spec.Template.Spec.Containers[0].Image = ImageName(cluster.Spec.Repository, cluster.Spec.Version)
 	if err := r.Client.Update(ctx, deployment); err != nil {
 		return err
 	}
 	return nil
 }
+
+func (r *DSApiReconciler) predicateUpdate(deployment *v1.Deployment, cluster *dsv1alpha1.DSApi) bool {
+	if *deployment.Spec.Replicas == (cluster.Spec.Replicas) && deployment.Spec.Template.Spec.Containers[0].Image == ImageName(cluster.Spec.Repository, cluster.Spec.Version) {
+		apiLogger.Info("no need update")
+		return false
+	}
+	return true
+}
diff --git a/controllers/dsmaster_controller.go b/controllers/dsmaster_controller.go
index f863d45..df05da5 100644
--- a/controllers/dsmaster_controller.go
+++ b/controllers/dsmaster_controller.go
@@ -99,7 +99,6 @@ func (r *DSMasterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
 		}
 	} else {
 		// The object is being deleted
-
 		if controllerutil.ContainsFinalizer(desired, dsv1alpha1.FinalizerName) {
 			// our finalizer is present, so lets handle any external dependency
 			if err := r.ensureDSMasterDeleted(ctx, cluster); err != nil {
@@ -117,7 +116,7 @@ func (r *DSMasterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
 	}
 
 	// If dsmaster-cluster is paused, we do nothing on things changed.
-	// Until dsmaster-cluster is un-paused, we will reconcile to the the state of that point.
+	// Until dsmaster-cluster is un-paused, we will reconcile to the  state of that point.
 	if cluster.Spec.Paused {
 		logger.Info("ds-master control has been paused: ", "ds-master-name", cluster.Name)
 		desired.Status.ControlPaused = true
@@ -257,17 +256,14 @@ func (r *DSMasterReconciler) createMember(ctx context.Context, cluster *dsv1alph
 }
 
 func (r *DSMasterReconciler) deletePod(ctx context.Context, pod *corev1.Pod) error {
-
 	logger.Info("begin delete pod", "pod name", pod.Name)
 	if err := r.Client.Delete(ctx, pod); err != nil && !apierrors.IsNotFound(err) {
 		return err
 	}
-
 	return nil
 }
 
 func (r *DSMasterReconciler) ensureUpgraded(ctx context.Context, cluster *dsv1alpha1.DSMaster) (bool, error) {
-
 	ms, err := r.podMemberSet(ctx, cluster)
 	if err != nil {
 		return false, err
@@ -275,7 +271,7 @@ func (r *DSMasterReconciler) ensureUpgraded(ctx context.Context, cluster *dsv1al
 
 	logger.Info("cluster.Spec.Version", "cluster.Spec.Version", cluster.Spec.Version)
 	for _, memset := range ms {
-		if memset.Version != cluster.Spec.Version {
+		if r.predicateUpdate(memset, cluster) {
 			pod := &corev1.Pod{}
 			pod.SetName(memset.Name)
 			pod.SetNamespace(memset.Namespace)
@@ -312,19 +308,15 @@ func (r *DSMasterReconciler) ensureMasterService(ctx context.Context, cluster *d
 	namespacedName := types.NamespacedName{Namespace: cluster.Namespace, Name: dsv1alpha1.DsServiceLabelValue}
 	if err := r.Client.Get(ctx, namespacedName, service); err != nil {
 		// Local cache not found
-		logger.Info("get service error")
 		if apierrors.IsNotFound(err) {
 			service = createMasterService(cluster)
 			if err := controllerutil.SetControllerReference(cluster, service, r.Scheme); err != nil {
-				logger.Info("create service error")
 				return err
 			}
 			// Remote may already exist, so we will return err, for the next time, this code will not execute
 			if err := r.Client.Create(ctx, service); err != nil {
-				logger.Info("create service error1")
 				return err
 			}
-			logger.Info("the headless service had been created")
 		}
 	}
 	return nil
@@ -348,15 +340,7 @@ func (r *Predicate) Update(evt event.UpdateEvent) bool {
 		oldC := evt.ObjectOld.(*dsv1alpha1.DSMaster)
 		newC := evt.ObjectNew.(*dsv1alpha1.DSMaster)
 
-		logger.V(5).Info("Running update filter",
-			"Old size", oldC.Spec.Replicas,
-			"New size", newC.Spec.Replicas,
-			"old paused", oldC.Spec.Paused,
-			"new paused", newC.Spec.Paused,
-			"old object deletion", !oldC.ObjectMeta.DeletionTimestamp.IsZero(),
-			"new object deletion", !newC.ObjectMeta.DeletionTimestamp.IsZero())
-
-		// Only care about size, version and paused fields
+		// Only care about size, repo,version and paused fields
 		if oldC.Spec.Replicas != newC.Spec.Replicas {
 			return true
 		}
@@ -369,7 +353,11 @@ func (r *Predicate) Update(evt event.UpdateEvent) bool {
 			return true
 		}
 
-		// If cluster has been marked as deleted, check if we have remove our finalizer
+		if oldC.Spec.Repository != newC.Spec.Repository {
+			return true
+		}
+
+		// If cluster has been marked as deleted, check if we have removed our finalizer
 		// If it has our finalizer, indicating our cleaning up works has not been done.
 		if oldC.DeletionTimestamp.IsZero() && !newC.DeletionTimestamp.IsZero() {
 			if controllerutil.ContainsFinalizer(newC, dsv1alpha1.FinalizerName) {
@@ -399,3 +387,7 @@ func (r *Predicate) Generic(evt event.GenericEvent) bool {
 	}
 	return false
 }
+
+func (r *DSMasterReconciler) predicateUpdate(member *Member, cluster *dsv1alpha1.DSMaster) bool {
+	return member.Version != cluster.Spec.Version
+}
diff --git a/controllers/master_reconcile.go b/controllers/master_reconcile.go
index b42c58f..2c6e722 100644
--- a/controllers/master_reconcile.go
+++ b/controllers/master_reconcile.go
@@ -111,6 +111,7 @@ func newDSMasterPod(cr *dsv1alpha1.DSMaster) *corev1.Pod {
 			Hostname:          podName,
 			Subdomain:         dsv1alpha1.DsServiceLabelValue,
 			SetHostnameAsFQDN: &isSetHostnameAsFQDN,
+
 			Containers: []corev1.Container{
 				{
 					Name:            cr.Name,
diff --git a/controllers/member.go b/controllers/member.go
index f36b51c..1b75a79 100644
--- a/controllers/member.go
+++ b/controllers/member.go
@@ -44,14 +44,6 @@ func (m Member) Ordinal() int {
 
 type MemberSet map[string]*Member
 
-func NewMemberSet(ms ...*Member) MemberSet {
-	res := MemberSet{}
-	for _, m := range ms {
-		res[m.Name] = m
-	}
-	return res
-}
-
 // the set of all members of s1 that are not members of s2
 func (ms MemberSet) Diff(other MemberSet) MemberSet {
 	diff := MemberSet{}