karmada operator: install karmada metrics adapter addon
Signed-off-by: calvin <wen.chen@daocloud.io>
This commit is contained in:
parent
19fbab565a
commit
1abdba3ec8
|
@ -667,7 +667,7 @@ spec:
|
||||||
used. Incorrect settings on this field maybe lead to the
|
used. Incorrect settings on this field maybe lead to the
|
||||||
corresponding component in an unhealthy state. Before you
|
corresponding component in an unhealthy state. Before you
|
||||||
do it, please confirm that you understand the risks of this
|
do it, please confirm that you understand the risks of this
|
||||||
configuration. \n For supported flags, please see https://github.com/karmada-io/karmada/blob/master/cmd/aggregated-apiserver/app/options/options.go
|
configuration. \n For supported flags, please see https://karmada.io/docs/reference/components/karmada-aggregated-apiserver
|
||||||
for details."
|
for details."
|
||||||
type: object
|
type: object
|
||||||
featureGates:
|
featureGates:
|
||||||
|
@ -793,7 +793,7 @@ spec:
|
||||||
used. Incorrect settings on this field maybe lead to the
|
used. Incorrect settings on this field maybe lead to the
|
||||||
corresponding component in an unhealthy state. Before you
|
corresponding component in an unhealthy state. Before you
|
||||||
do it, please confirm that you understand the risks of this
|
do it, please confirm that you understand the risks of this
|
||||||
configuration. \n For supported flags, please see https://github.com/karmada-io/karmada/blob/master/cmd/controller-manager/app/options/options.go
|
configuration. \n For supported flags, please see https://karmada.io/docs/reference/components/karmada-controller-manager
|
||||||
for details."
|
for details."
|
||||||
type: object
|
type: object
|
||||||
featureGates:
|
featureGates:
|
||||||
|
@ -908,7 +908,112 @@ spec:
|
||||||
on this field maybe lead to the corresponding component
|
on this field maybe lead to the corresponding component
|
||||||
in an unhealthy state. Before you do it, please confirm
|
in an unhealthy state. Before you do it, please confirm
|
||||||
that you understand the risks of this configuration. \n
|
that you understand the risks of this configuration. \n
|
||||||
For supported flags, please see https://github.com/karmada-io/karmada/blob/master/cmd/descheduler/app/options/options.go
|
For supported flags, please see https://karmada.io/docs/reference/components/karmada-descheduler
|
||||||
|
for details."
|
||||||
|
type: object
|
||||||
|
imageRepository:
|
||||||
|
description: ImageRepository sets the container registry to
|
||||||
|
pull images from. if not set, the ImageRepository defined
|
||||||
|
in KarmadaSpec will be used instead.
|
||||||
|
type: string
|
||||||
|
imageTag:
|
||||||
|
description: ImageTag allows to specify a tag for the image.
|
||||||
|
In case this value is set, operator does not change automatically
|
||||||
|
the version of the above components during upgrades.
|
||||||
|
type: string
|
||||||
|
labels:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: 'Map of string keys and values that can be used
|
||||||
|
to organize and categorize (scope and select) objects. May
|
||||||
|
match selectors of replication controllers and services.
|
||||||
|
More info: http://kubernetes.io/docs/user-guide/labels'
|
||||||
|
type: object
|
||||||
|
replicas:
|
||||||
|
description: Number of desired pods. This is a pointer to
|
||||||
|
distinguish between explicit zero and not specified. Defaults
|
||||||
|
to 1.
|
||||||
|
format: int32
|
||||||
|
type: integer
|
||||||
|
resources:
|
||||||
|
description: 'Compute Resources required by this component.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
|
||||||
|
properties:
|
||||||
|
claims:
|
||||||
|
description: "Claims lists the names of resources, defined
|
||||||
|
in spec.resourceClaims, that are used by this container.
|
||||||
|
\n This is an alpha field and requires enabling the
|
||||||
|
DynamicResourceAllocation feature gate. \n This field
|
||||||
|
is immutable. It can only be set for containers."
|
||||||
|
items:
|
||||||
|
description: ResourceClaim references one entry in PodSpec.ResourceClaims.
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
description: Name must match the name of one entry
|
||||||
|
in pod.spec.resourceClaims of the Pod where this
|
||||||
|
field is used. It makes that resource available
|
||||||
|
inside a container.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
x-kubernetes-list-map-keys:
|
||||||
|
- name
|
||||||
|
x-kubernetes-list-type: map
|
||||||
|
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.
|
||||||
|
Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
karmadaMetricsAdapter:
|
||||||
|
description: KarmadaMetricsAdapter holds settings to karmada metrics
|
||||||
|
adapter component of the karmada.
|
||||||
|
properties:
|
||||||
|
annotations:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: 'Annotations is an unstructured key value map
|
||||||
|
stored with a resource that may be set by external tools
|
||||||
|
to store and retrieve arbitrary metadata. They are not queryable
|
||||||
|
and should be preserved when modifying objects. More info:
|
||||||
|
http://kubernetes.io/docs/user-guide/annotations'
|
||||||
|
type: object
|
||||||
|
extraArgs:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: "ExtraArgs is an extra set of flags to pass to
|
||||||
|
the karmada-metrics-adapter component or override. A key
|
||||||
|
in this map is the flag name as it appears on the command
|
||||||
|
line except without leading dash(es). \n Note: This is a
|
||||||
|
temporary solution to allow for the configuration of the
|
||||||
|
karmada-metrics-adapter component. In the future, we will
|
||||||
|
provide a more structured way to configure the component.
|
||||||
|
Once that is done, this field will be discouraged to be
|
||||||
|
used. Incorrect settings on this field maybe lead to the
|
||||||
|
corresponding component in an unhealthy state. Before you
|
||||||
|
do it, please confirm that you understand the risks of this
|
||||||
|
configuration. \n For supported flags, please see https://karmada.io/docs/reference/components/karmada-metrics-adapter
|
||||||
for details."
|
for details."
|
||||||
type: object
|
type: object
|
||||||
imageRepository:
|
imageRepository:
|
||||||
|
@ -1013,7 +1118,7 @@ spec:
|
||||||
on this field maybe lead to the corresponding component
|
on this field maybe lead to the corresponding component
|
||||||
in an unhealthy state. Before you do it, please confirm
|
in an unhealthy state. Before you do it, please confirm
|
||||||
that you understand the risks of this configuration. \n
|
that you understand the risks of this configuration. \n
|
||||||
For supported flags, please see https://github.com/karmada-io/karmada/blob/master/cmd/scheduler/app/options/options.go
|
For supported flags, please see https://karmada.io/docs/reference/components/karmada-scheduler
|
||||||
for details."
|
for details."
|
||||||
type: object
|
type: object
|
||||||
featureGates:
|
featureGates:
|
||||||
|
@ -1115,17 +1220,17 @@ spec:
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
type: string
|
type: string
|
||||||
description: "ExtraArgs is an extra set of flags to pass to
|
description: "ExtraArgs is an extra set of flags to pass to
|
||||||
the karmada-descheduler component or override. A key in
|
the karmada-search component or override. A key in this
|
||||||
this map is the flag name as it appears on the command line
|
map is the flag name as it appears on the command line except
|
||||||
except without leading dash(es). \n Note: This is a temporary
|
without leading dash(es). \n Note: This is a temporary solution
|
||||||
solution to allow for the configuration of the karmada-descheduler
|
to allow for the configuration of the karmada-search component.
|
||||||
component. In the future, we will provide a more structured
|
In the future, we will provide a more structured way to
|
||||||
way to configure the component. Once that is done, this
|
configure the component. Once that is done, this field will
|
||||||
field will be discouraged to be used. Incorrect settings
|
be discouraged to be used. Incorrect settings on this field
|
||||||
on this field maybe lead to the corresponding component
|
maybe lead to the corresponding component in an unhealthy
|
||||||
in an unhealthy state. Before you do it, please confirm
|
state. Before you do it, please confirm that you understand
|
||||||
that you understand the risks of this configuration. \n
|
the risks of this configuration. \n For supported flags,
|
||||||
For supported flags, please see https://github.com/karmada-io/karmada/blob/master/cmd/descheduler/app/options/options.go
|
please see https://karmada.io/docs/reference/components/karmada-search
|
||||||
for details."
|
for details."
|
||||||
type: object
|
type: object
|
||||||
imageRepository:
|
imageRepository:
|
||||||
|
@ -1230,7 +1335,7 @@ spec:
|
||||||
maybe lead to the corresponding component in an unhealthy
|
maybe lead to the corresponding component in an unhealthy
|
||||||
state. Before you do it, please confirm that you understand
|
state. Before you do it, please confirm that you understand
|
||||||
the risks of this configuration. \n For supported flags,
|
the risks of this configuration. \n For supported flags,
|
||||||
please see https://github.com/karmada-io/karmada/blob/master/cmd/webhook/app/options/options.go
|
please see https://karmada.io/docs/reference/components/karmada-webhook
|
||||||
for details."
|
for details."
|
||||||
type: object
|
type: object
|
||||||
imageRepository:
|
imageRepository:
|
||||||
|
|
|
@ -663,7 +663,7 @@ spec:
|
||||||
used. Incorrect settings on this field maybe lead to the
|
used. Incorrect settings on this field maybe lead to the
|
||||||
corresponding component in an unhealthy state. Before you
|
corresponding component in an unhealthy state. Before you
|
||||||
do it, please confirm that you understand the risks of this
|
do it, please confirm that you understand the risks of this
|
||||||
configuration. \n For supported flags, please see https://github.com/karmada-io/karmada/blob/master/cmd/aggregated-apiserver/app/options/options.go
|
configuration. \n For supported flags, please see https://karmada.io/docs/reference/components/karmada-aggregated-apiserver
|
||||||
for details."
|
for details."
|
||||||
type: object
|
type: object
|
||||||
featureGates:
|
featureGates:
|
||||||
|
@ -789,7 +789,7 @@ spec:
|
||||||
used. Incorrect settings on this field maybe lead to the
|
used. Incorrect settings on this field maybe lead to the
|
||||||
corresponding component in an unhealthy state. Before you
|
corresponding component in an unhealthy state. Before you
|
||||||
do it, please confirm that you understand the risks of this
|
do it, please confirm that you understand the risks of this
|
||||||
configuration. \n For supported flags, please see https://github.com/karmada-io/karmada/blob/master/cmd/controller-manager/app/options/options.go
|
configuration. \n For supported flags, please see https://karmada.io/docs/reference/components/karmada-controller-manager
|
||||||
for details."
|
for details."
|
||||||
type: object
|
type: object
|
||||||
featureGates:
|
featureGates:
|
||||||
|
@ -904,7 +904,112 @@ spec:
|
||||||
on this field maybe lead to the corresponding component
|
on this field maybe lead to the corresponding component
|
||||||
in an unhealthy state. Before you do it, please confirm
|
in an unhealthy state. Before you do it, please confirm
|
||||||
that you understand the risks of this configuration. \n
|
that you understand the risks of this configuration. \n
|
||||||
For supported flags, please see https://github.com/karmada-io/karmada/blob/master/cmd/descheduler/app/options/options.go
|
For supported flags, please see https://karmada.io/docs/reference/components/karmada-descheduler
|
||||||
|
for details."
|
||||||
|
type: object
|
||||||
|
imageRepository:
|
||||||
|
description: ImageRepository sets the container registry to
|
||||||
|
pull images from. if not set, the ImageRepository defined
|
||||||
|
in KarmadaSpec will be used instead.
|
||||||
|
type: string
|
||||||
|
imageTag:
|
||||||
|
description: ImageTag allows to specify a tag for the image.
|
||||||
|
In case this value is set, operator does not change automatically
|
||||||
|
the version of the above components during upgrades.
|
||||||
|
type: string
|
||||||
|
labels:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: 'Map of string keys and values that can be used
|
||||||
|
to organize and categorize (scope and select) objects. May
|
||||||
|
match selectors of replication controllers and services.
|
||||||
|
More info: http://kubernetes.io/docs/user-guide/labels'
|
||||||
|
type: object
|
||||||
|
replicas:
|
||||||
|
description: Number of desired pods. This is a pointer to
|
||||||
|
distinguish between explicit zero and not specified. Defaults
|
||||||
|
to 1.
|
||||||
|
format: int32
|
||||||
|
type: integer
|
||||||
|
resources:
|
||||||
|
description: 'Compute Resources required by this component.
|
||||||
|
More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
|
||||||
|
properties:
|
||||||
|
claims:
|
||||||
|
description: "Claims lists the names of resources, defined
|
||||||
|
in spec.resourceClaims, that are used by this container.
|
||||||
|
\n This is an alpha field and requires enabling the
|
||||||
|
DynamicResourceAllocation feature gate. \n This field
|
||||||
|
is immutable."
|
||||||
|
items:
|
||||||
|
description: ResourceClaim references one entry in PodSpec.ResourceClaims.
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
description: Name must match the name of one entry
|
||||||
|
in pod.spec.resourceClaims of the Pod where this
|
||||||
|
field is used. It makes that resource available
|
||||||
|
inside a container.
|
||||||
|
type: string
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
x-kubernetes-list-map-keys:
|
||||||
|
- name
|
||||||
|
x-kubernetes-list-type: map
|
||||||
|
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
|
||||||
|
type: object
|
||||||
|
karmadaMetricsAdapter:
|
||||||
|
description: KarmadaMetricsAdapter holds settings to karmada metrics
|
||||||
|
adapter component of the karmada.
|
||||||
|
properties:
|
||||||
|
annotations:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: 'Annotations is an unstructured key value map
|
||||||
|
stored with a resource that may be set by external tools
|
||||||
|
to store and retrieve arbitrary metadata. They are not queryable
|
||||||
|
and should be preserved when modifying objects. More info:
|
||||||
|
http://kubernetes.io/docs/user-guide/annotations'
|
||||||
|
type: object
|
||||||
|
extraArgs:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: "ExtraArgs is an extra set of flags to pass to
|
||||||
|
the karmada-metrics-adapter component or override. A key
|
||||||
|
in this map is the flag name as it appears on the command
|
||||||
|
line except without leading dash(es). \n Note: This is a
|
||||||
|
temporary solution to allow for the configuration of the
|
||||||
|
karmada-metrics-adapter component. In the future, we will
|
||||||
|
provide a more structured way to configure the component.
|
||||||
|
Once that is done, this field will be discouraged to be
|
||||||
|
used. Incorrect settings on this field maybe lead to the
|
||||||
|
corresponding component in an unhealthy state. Before you
|
||||||
|
do it, please confirm that you understand the risks of this
|
||||||
|
configuration. \n For supported flags, please see https://karmada.io/docs/reference/components/karmada-metrics-adapter
|
||||||
for details."
|
for details."
|
||||||
type: object
|
type: object
|
||||||
imageRepository:
|
imageRepository:
|
||||||
|
@ -1009,7 +1114,7 @@ spec:
|
||||||
on this field maybe lead to the corresponding component
|
on this field maybe lead to the corresponding component
|
||||||
in an unhealthy state. Before you do it, please confirm
|
in an unhealthy state. Before you do it, please confirm
|
||||||
that you understand the risks of this configuration. \n
|
that you understand the risks of this configuration. \n
|
||||||
For supported flags, please see https://github.com/karmada-io/karmada/blob/master/cmd/scheduler/app/options/options.go
|
For supported flags, please see https://karmada.io/docs/reference/components/karmada-scheduler
|
||||||
for details."
|
for details."
|
||||||
type: object
|
type: object
|
||||||
featureGates:
|
featureGates:
|
||||||
|
@ -1111,17 +1216,17 @@ spec:
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
type: string
|
type: string
|
||||||
description: "ExtraArgs is an extra set of flags to pass to
|
description: "ExtraArgs is an extra set of flags to pass to
|
||||||
the karmada-descheduler component or override. A key in
|
the karmada-search component or override. A key in this
|
||||||
this map is the flag name as it appears on the command line
|
map is the flag name as it appears on the command line except
|
||||||
except without leading dash(es). \n Note: This is a temporary
|
without leading dash(es). \n Note: This is a temporary solution
|
||||||
solution to allow for the configuration of the karmada-descheduler
|
to allow for the configuration of the karmada-search component.
|
||||||
component. In the future, we will provide a more structured
|
In the future, we will provide a more structured way to
|
||||||
way to configure the component. Once that is done, this
|
configure the component. Once that is done, this field will
|
||||||
field will be discouraged to be used. Incorrect settings
|
be discouraged to be used. Incorrect settings on this field
|
||||||
on this field maybe lead to the corresponding component
|
maybe lead to the corresponding component in an unhealthy
|
||||||
in an unhealthy state. Before you do it, please confirm
|
state. Before you do it, please confirm that you understand
|
||||||
that you understand the risks of this configuration. \n
|
the risks of this configuration. \n For supported flags,
|
||||||
For supported flags, please see https://github.com/karmada-io/karmada/blob/master/cmd/descheduler/app/options/options.go
|
please see https://karmada.io/docs/reference/components/karmada-search
|
||||||
for details."
|
for details."
|
||||||
type: object
|
type: object
|
||||||
imageRepository:
|
imageRepository:
|
||||||
|
@ -1226,7 +1331,7 @@ spec:
|
||||||
maybe lead to the corresponding component in an unhealthy
|
maybe lead to the corresponding component in an unhealthy
|
||||||
state. Before you do it, please confirm that you understand
|
state. Before you do it, please confirm that you understand
|
||||||
the risks of this configuration. \n For supported flags,
|
the risks of this configuration. \n For supported flags,
|
||||||
please see https://github.com/karmada-io/karmada/blob/master/cmd/webhook/app/options/options.go
|
please see https://karmada.io/docs/reference/components/karmada-webhook
|
||||||
for details."
|
for details."
|
||||||
type: object
|
type: object
|
||||||
imageRepository:
|
imageRepository:
|
||||||
|
|
|
@ -19,6 +19,7 @@ var (
|
||||||
karmadaSchedulerImageRepository = fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaScheduler)
|
karmadaSchedulerImageRepository = fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaScheduler)
|
||||||
karmadaWebhookImageRepository = fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaWebhook)
|
karmadaWebhookImageRepository = fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaWebhook)
|
||||||
karmadaDeschedulerImageRepository = fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaDescheduler)
|
karmadaDeschedulerImageRepository = fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaDescheduler)
|
||||||
|
KarmadaMetricsAdapterImageRepository = fmt.Sprintf("%s/%s", constants.KarmadaDefaultRepository, constants.KarmadaMetricsAdapter)
|
||||||
)
|
)
|
||||||
|
|
||||||
func addDefaultingFuncs(scheme *runtime.Scheme) error {
|
func addDefaultingFuncs(scheme *runtime.Scheme) error {
|
||||||
|
@ -55,6 +56,7 @@ func setDefaultsKarmadaComponents(obj *Karmada) {
|
||||||
setDefaultsKarmadaControllerManager(obj.Spec.Components)
|
setDefaultsKarmadaControllerManager(obj.Spec.Components)
|
||||||
setDefaultsKarmadaScheduler(obj.Spec.Components)
|
setDefaultsKarmadaScheduler(obj.Spec.Components)
|
||||||
setDefaultsKarmadaWebhook(obj.Spec.Components)
|
setDefaultsKarmadaWebhook(obj.Spec.Components)
|
||||||
|
setDefaultsKarmadaMetricsAdapter(obj.Spec.Components)
|
||||||
|
|
||||||
// set addon defaults
|
// set addon defaults
|
||||||
setDefaultsKarmadaDescheduler(obj.Spec.Components)
|
setDefaultsKarmadaDescheduler(obj.Spec.Components)
|
||||||
|
@ -227,3 +229,21 @@ func setDefaultsKarmadaDescheduler(obj *KarmadaComponents) {
|
||||||
descheduler.Replicas = pointer.Int32(1)
|
descheduler.Replicas = pointer.Int32(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setDefaultsKarmadaMetricsAdapter(obj *KarmadaComponents) {
|
||||||
|
if obj.KarmadaMetricsAdapter == nil {
|
||||||
|
obj.KarmadaMetricsAdapter = &KarmadaMetricsAdapter{}
|
||||||
|
}
|
||||||
|
|
||||||
|
metricsAdapter := obj.KarmadaMetricsAdapter
|
||||||
|
if len(metricsAdapter.Image.ImageRepository) == 0 {
|
||||||
|
metricsAdapter.Image.ImageRepository = KarmadaMetricsAdapterImageRepository
|
||||||
|
}
|
||||||
|
if len(metricsAdapter.Image.ImageTag) == 0 {
|
||||||
|
metricsAdapter.Image.ImageTag = constants.KarmadaDefaultVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
if metricsAdapter.Replicas == nil {
|
||||||
|
metricsAdapter.Replicas = pointer.Int32(2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -123,6 +123,10 @@ type KarmadaComponents struct {
|
||||||
// KarmadaSearch holds settings to karmada search component of the karmada.
|
// KarmadaSearch holds settings to karmada search component of the karmada.
|
||||||
// +optional
|
// +optional
|
||||||
KarmadaSearch *KarmadaSearch `json:"karmadaSearch,omitempty"`
|
KarmadaSearch *KarmadaSearch `json:"karmadaSearch,omitempty"`
|
||||||
|
|
||||||
|
// KarmadaMetricsAdapter holds settings to karmada metrics adapter component of the karmada.
|
||||||
|
// +optional
|
||||||
|
KarmadaMetricsAdapter *KarmadaMetricsAdapter `json:"karmadaMetricsAdapter,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Networking contains elements describing cluster's networking configuration
|
// Networking contains elements describing cluster's networking configuration
|
||||||
|
@ -266,7 +270,7 @@ type KarmadaAggregatedAPIServer struct {
|
||||||
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
||||||
//
|
//
|
||||||
// For supported flags, please see
|
// For supported flags, please see
|
||||||
// https://github.com/karmada-io/karmada/blob/master/cmd/aggregated-apiserver/app/options/options.go
|
// https://karmada.io/docs/reference/components/karmada-aggregated-apiserver
|
||||||
// for details.
|
// for details.
|
||||||
// +optional
|
// +optional
|
||||||
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
||||||
|
@ -379,7 +383,7 @@ type KarmadaControllerManager struct {
|
||||||
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
||||||
//
|
//
|
||||||
// For supported flags, please see
|
// For supported flags, please see
|
||||||
// https://github.com/karmada-io/karmada/blob/master/cmd/controller-manager/app/options/options.go
|
// https://karmada.io/docs/reference/components/karmada-controller-manager
|
||||||
// for details.
|
// for details.
|
||||||
// +optional
|
// +optional
|
||||||
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
||||||
|
@ -410,7 +414,7 @@ type KarmadaScheduler struct {
|
||||||
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
||||||
//
|
//
|
||||||
// For supported flags, please see
|
// For supported flags, please see
|
||||||
// https://github.com/karmada-io/karmada/blob/master/cmd/scheduler/app/options/options.go
|
// https://karmada.io/docs/reference/components/karmada-scheduler
|
||||||
// for details.
|
// for details.
|
||||||
// +optional
|
// +optional
|
||||||
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
||||||
|
@ -438,7 +442,7 @@ type KarmadaDescheduler struct {
|
||||||
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
||||||
//
|
//
|
||||||
// For supported flags, please see
|
// For supported flags, please see
|
||||||
// https://github.com/karmada-io/karmada/blob/master/cmd/descheduler/app/options/options.go
|
// https://karmada.io/docs/reference/components/karmada-descheduler
|
||||||
// for details.
|
// for details.
|
||||||
// +optional
|
// +optional
|
||||||
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
||||||
|
@ -449,18 +453,40 @@ type KarmadaSearch struct {
|
||||||
// CommonSettings holds common settings to karmada search.
|
// CommonSettings holds common settings to karmada search.
|
||||||
CommonSettings `json:",inline"`
|
CommonSettings `json:",inline"`
|
||||||
|
|
||||||
// ExtraArgs is an extra set of flags to pass to the karmada-descheduler component or override.
|
// ExtraArgs is an extra set of flags to pass to the karmada-search component or override.
|
||||||
// A key in this map is the flag name as it appears on the command line except without
|
// A key in this map is the flag name as it appears on the command line except without
|
||||||
// leading dash(es).
|
// leading dash(es).
|
||||||
//
|
//
|
||||||
// Note: This is a temporary solution to allow for the configuration of the karmada-descheduler
|
// Note: This is a temporary solution to allow for the configuration of the karmada-search
|
||||||
// component. In the future, we will provide a more structured way to configure the component.
|
// component. In the future, we will provide a more structured way to configure the component.
|
||||||
// Once that is done, this field will be discouraged to be used.
|
// Once that is done, this field will be discouraged to be used.
|
||||||
// Incorrect settings on this field maybe lead to the corresponding component in an unhealthy
|
// Incorrect settings on this field maybe lead to the corresponding component in an unhealthy
|
||||||
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
||||||
//
|
//
|
||||||
// For supported flags, please see
|
// For supported flags, please see
|
||||||
// https://github.com/karmada-io/karmada/blob/master/cmd/descheduler/app/options/options.go
|
// https://karmada.io/docs/reference/components/karmada-search
|
||||||
|
// for details.
|
||||||
|
// +optional
|
||||||
|
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// KarmadaMetricsAdapter holds settings to karmada-metrics-adapter component of the karmada.
|
||||||
|
type KarmadaMetricsAdapter struct {
|
||||||
|
// CommonSettings holds common settings to karmada metrics adapter.
|
||||||
|
CommonSettings `json:",inline"`
|
||||||
|
|
||||||
|
// ExtraArgs is an extra set of flags to pass to the karmada-metrics-adapter component or override.
|
||||||
|
// A key in this map is the flag name as it appears on the command line except without
|
||||||
|
// leading dash(es).
|
||||||
|
//
|
||||||
|
// Note: This is a temporary solution to allow for the configuration of the karmada-metrics-adapter
|
||||||
|
// component. In the future, we will provide a more structured way to configure the component.
|
||||||
|
// Once that is done, this field will be discouraged to be used.
|
||||||
|
// Incorrect settings on this field maybe lead to the corresponding component in an unhealthy
|
||||||
|
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
||||||
|
//
|
||||||
|
// For supported flags, please see
|
||||||
|
// https://karmada.io/docs/reference/components/karmada-metrics-adapter
|
||||||
// for details.
|
// for details.
|
||||||
// +optional
|
// +optional
|
||||||
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
||||||
|
@ -482,7 +508,7 @@ type KarmadaWebhook struct {
|
||||||
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
// state. Before you do it, please confirm that you understand the risks of this configuration.
|
||||||
//
|
//
|
||||||
// For supported flags, please see
|
// For supported flags, please see
|
||||||
// https://github.com/karmada-io/karmada/blob/master/cmd/webhook/app/options/options.go
|
// https://karmada.io/docs/reference/components/karmada-webhook
|
||||||
// for details.
|
// for details.
|
||||||
// +optional
|
// +optional
|
||||||
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
|
||||||
|
|
|
@ -321,6 +321,11 @@ func (in *KarmadaComponents) DeepCopyInto(out *KarmadaComponents) {
|
||||||
*out = new(KarmadaSearch)
|
*out = new(KarmadaSearch)
|
||||||
(*in).DeepCopyInto(*out)
|
(*in).DeepCopyInto(*out)
|
||||||
}
|
}
|
||||||
|
if in.KarmadaMetricsAdapter != nil {
|
||||||
|
in, out := &in.KarmadaMetricsAdapter, &out.KarmadaMetricsAdapter
|
||||||
|
*out = new(KarmadaMetricsAdapter)
|
||||||
|
(*in).DeepCopyInto(*out)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -427,6 +432,30 @@ func (in *KarmadaList) DeepCopyObject() runtime.Object {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *KarmadaMetricsAdapter) DeepCopyInto(out *KarmadaMetricsAdapter) {
|
||||||
|
*out = *in
|
||||||
|
in.CommonSettings.DeepCopyInto(&out.CommonSettings)
|
||||||
|
if in.ExtraArgs != nil {
|
||||||
|
in, out := &in.ExtraArgs, &out.ExtraArgs
|
||||||
|
*out = make(map[string]string, len(*in))
|
||||||
|
for key, val := range *in {
|
||||||
|
(*out)[key] = val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KarmadaMetricsAdapter.
|
||||||
|
func (in *KarmadaMetricsAdapter) DeepCopy() *KarmadaMetricsAdapter {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(KarmadaMetricsAdapter)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
func (in *KarmadaScheduler) DeepCopyInto(out *KarmadaScheduler) {
|
func (in *KarmadaScheduler) DeepCopyInto(out *KarmadaScheduler) {
|
||||||
*out = *in
|
*out = *in
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -42,6 +43,8 @@ const (
|
||||||
KarmadaWebhook = "karmada-webhook"
|
KarmadaWebhook = "karmada-webhook"
|
||||||
// KarmadaDescheduler defines the name of the karmada-descheduler component
|
// KarmadaDescheduler defines the name of the karmada-descheduler component
|
||||||
KarmadaDescheduler = "karmada-descheduler"
|
KarmadaDescheduler = "karmada-descheduler"
|
||||||
|
// KarmadaMetricsAdapter defines the name of the karmada-metrics-adapter component
|
||||||
|
KarmadaMetricsAdapter = "karmada-metrics-adapter"
|
||||||
|
|
||||||
// KarmadaSystemNamespace defines the leader selection namespace for karmada components
|
// KarmadaSystemNamespace defines the leader selection namespace for karmada components
|
||||||
KarmadaSystemNamespace = "karmada-system"
|
KarmadaSystemNamespace = "karmada-system"
|
||||||
|
@ -96,12 +99,24 @@ const (
|
||||||
KarmadaWebhookComponent = "KarmadaWebhook"
|
KarmadaWebhookComponent = "KarmadaWebhook"
|
||||||
// KarmadaDeschedulerComponent defines the name of the karmada-descheduler component
|
// KarmadaDeschedulerComponent defines the name of the karmada-descheduler component
|
||||||
KarmadaDeschedulerComponent = "KarmadaDescheduler"
|
KarmadaDeschedulerComponent = "KarmadaDescheduler"
|
||||||
|
// KarmadaMetricsAdapterComponent defines the name of the karmada-metrics-adapter component
|
||||||
|
KarmadaMetricsAdapterComponent = "KarmadaMetricsAdapter"
|
||||||
|
|
||||||
// KarmadaOperatorLabelKeyName defines a label key used by all resources created by karmada operator
|
// KarmadaOperatorLabelKeyName defines a label key used by all resources created by karmada operator
|
||||||
KarmadaOperatorLabelKeyName = "app.kubernetes.io/managed-by"
|
KarmadaOperatorLabelKeyName = "app.kubernetes.io/managed-by"
|
||||||
|
|
||||||
|
// APIServiceName defines the karmada aggregated apiserver APISerivce resource name.
|
||||||
|
APIServiceName = "v1alpha1.cluster.karmada.io"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// KarmadaOperatorLabel defines the default labels in the resource create by karmada operator
|
// KarmadaOperatorLabel defines the default labels in the resource create by karmada operator
|
||||||
KarmadaOperatorLabel = labels.Set{KarmadaOperatorLabelKeyName: KarmadaOperator}
|
KarmadaOperatorLabel = labels.Set{KarmadaOperatorLabelKeyName: KarmadaOperator}
|
||||||
|
|
||||||
|
// KarmadaMetricsAdapterAPIServices defines the GroupVersions of all karmada-metrics-adapter APIServices
|
||||||
|
KarmadaMetricsAdapterAPIServices = []schema.GroupVersion{
|
||||||
|
{Group: "metrics.k8s.io", Version: "v1beta1"},
|
||||||
|
{Group: "custom.metrics.k8s.io", Version: "v1beta1"},
|
||||||
|
{Group: "custom.metrics.k8s.io", Version: "v1beta2"},
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
package metricsadapter
|
||||||
|
|
||||||
|
const (
|
||||||
|
// KarmadaMetricsAdapterDeployment is karmada-metrics-adapter deployment manifest
|
||||||
|
KarmadaMetricsAdapterDeployment = `
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: {{ .DeploymentName }}
|
||||||
|
namespace: {{ .Namespace }}
|
||||||
|
labels:
|
||||||
|
karmada-app: karmada-metrics-adapter
|
||||||
|
app.kubernetes.io/managed-by: karmada-operator
|
||||||
|
spec:
|
||||||
|
replicas: {{ .Replicas }}
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
karmada-app: karmada-metrics-adapter
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
karmada-app: karmada-metrics-adapter
|
||||||
|
spec:
|
||||||
|
automountServiceAccountToken: false
|
||||||
|
tolerations:
|
||||||
|
- key: node-role.kubernetes.io/master
|
||||||
|
operator: Exists
|
||||||
|
containers:
|
||||||
|
- name: karmada-metrics-adapter
|
||||||
|
image: {{ .Image }}
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
command:
|
||||||
|
- /bin/karmada-metrics-adapter
|
||||||
|
- --kubeconfig=/etc/karmada/config
|
||||||
|
- --authentication-kubeconfig=/etc/karmada/config
|
||||||
|
- --authorization-kubeconfig=/etc/karmada/config
|
||||||
|
- --client-ca-file=/etc/karmada/pki/ca.crt
|
||||||
|
- --audit-log-path=-
|
||||||
|
- --audit-log-maxage=0
|
||||||
|
- --audit-log-maxbackup=0
|
||||||
|
volumeMounts:
|
||||||
|
- name: kubeconfig
|
||||||
|
subPath: config
|
||||||
|
mountPath: /etc/karmada/config
|
||||||
|
- name: karmada-cert
|
||||||
|
mountPath: /etc/karmada/pki
|
||||||
|
readOnly: true
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /readyz
|
||||||
|
port: 443
|
||||||
|
scheme: HTTPS
|
||||||
|
initialDelaySeconds: 1
|
||||||
|
failureThreshold: 3
|
||||||
|
periodSeconds: 3
|
||||||
|
timeoutSeconds: 15
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /healthz
|
||||||
|
port: 443
|
||||||
|
scheme: HTTPS
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
failureThreshold: 3
|
||||||
|
periodSeconds: 10
|
||||||
|
timeoutSeconds: 15
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
volumes:
|
||||||
|
- name: kubeconfig
|
||||||
|
secret:
|
||||||
|
secretName: {{ .KubeconfigSecret }}
|
||||||
|
- name: karmada-cert
|
||||||
|
secret:
|
||||||
|
secretName: {{ .KarmadaCertsSecret }}
|
||||||
|
`
|
||||||
|
|
||||||
|
// KarmadaMetricsAdapterService is karmada-metrics-adapter service manifest
|
||||||
|
KarmadaMetricsAdapterService = `
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ .ServiceName }}
|
||||||
|
namespace: {{ .Namespace }}
|
||||||
|
labels:
|
||||||
|
app.kubernetes.io/managed-by: karmada-operator
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
karmada-app: karmada-metrics-adapter
|
||||||
|
ports:
|
||||||
|
- port: 443
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: 443
|
||||||
|
`
|
||||||
|
)
|
|
@ -0,0 +1,77 @@
|
||||||
|
package metricsadapter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
appsv1 "k8s.io/api/apps/v1"
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
kuberuntime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
|
clientsetscheme "k8s.io/client-go/kubernetes/scheme"
|
||||||
|
|
||||||
|
operatorv1alpha1 "github.com/karmada-io/karmada/operator/pkg/apis/operator/v1alpha1"
|
||||||
|
"github.com/karmada-io/karmada/operator/pkg/util"
|
||||||
|
"github.com/karmada-io/karmada/operator/pkg/util/apiclient"
|
||||||
|
"github.com/karmada-io/karmada/operator/pkg/util/patcher"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EnsureKarmadaMetricAdapter creates karmada-metric-adapter deployment and service resource.
|
||||||
|
func EnsureKarmadaMetricAdapter(client clientset.Interface, cfg *operatorv1alpha1.KarmadaMetricsAdapter, name, namespace string) error {
|
||||||
|
if err := installKarmadaMetricAdapter(client, cfg, name, namespace); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return createKarmadaMetricAdapterService(client, name, namespace)
|
||||||
|
}
|
||||||
|
|
||||||
|
func installKarmadaMetricAdapter(client clientset.Interface, cfg *operatorv1alpha1.KarmadaMetricsAdapter, name, namespace string) error {
|
||||||
|
metricAdapterBytes, err := util.ParseTemplate(KarmadaMetricsAdapterDeployment, struct {
|
||||||
|
DeploymentName, Namespace, Image string
|
||||||
|
KubeconfigSecret, KarmadaCertsSecret string
|
||||||
|
Replicas *int32
|
||||||
|
}{
|
||||||
|
DeploymentName: util.KarmadaMetricsAdapterName(name),
|
||||||
|
Namespace: namespace,
|
||||||
|
Image: cfg.Image.Name(),
|
||||||
|
Replicas: cfg.Replicas,
|
||||||
|
KubeconfigSecret: util.AdminKubeconfigSecretName(name),
|
||||||
|
KarmadaCertsSecret: util.KarmadaCertSecretName(name),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error when parsing KarmadaMetricAdapter Deployment template: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
metricAdapter := &appsv1.Deployment{}
|
||||||
|
if err := kuberuntime.DecodeInto(clientsetscheme.Codecs.UniversalDecoder(), metricAdapterBytes, metricAdapter); err != nil {
|
||||||
|
return fmt.Errorf("err when decoding KarmadaMetricAdapter Deployment: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
patcher.NewPatcher().WithAnnotations(cfg.Annotations).WithLabels(cfg.Labels).ForDeployment(metricAdapter)
|
||||||
|
|
||||||
|
if err := apiclient.CreateOrUpdateDeployment(client, metricAdapter); err != nil {
|
||||||
|
return fmt.Errorf("error when creating deployment for %s, err: %w", metricAdapter.Name, err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func createKarmadaMetricAdapterService(client clientset.Interface, name, namespace string) error {
|
||||||
|
metricAdapterServiceBytes, err := util.ParseTemplate(KarmadaMetricsAdapterService, struct {
|
||||||
|
ServiceName, Namespace string
|
||||||
|
}{
|
||||||
|
ServiceName: util.KarmadaMetricsAdapterName(name),
|
||||||
|
Namespace: namespace,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error when parsing KarmadaMetricAdapter Service template: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
metricAdapterService := &corev1.Service{}
|
||||||
|
if err := kuberuntime.DecodeInto(clientsetscheme.Codecs.UniversalDecoder(), metricAdapterServiceBytes, metricAdapterService); err != nil {
|
||||||
|
return fmt.Errorf("err when decoding KarmadaMetricAdapter Service: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := apiclient.CreateOrUpdateService(client, metricAdapterService); err != nil {
|
||||||
|
return fmt.Errorf("err when creating service for %s, err: %w", metricAdapterService.Name, err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -14,6 +14,7 @@ import (
|
||||||
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
|
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
|
||||||
aggregator "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset"
|
aggregator "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset"
|
||||||
|
|
||||||
|
"github.com/karmada-io/karmada/operator/pkg/constants"
|
||||||
"github.com/karmada-io/karmada/operator/pkg/util"
|
"github.com/karmada-io/karmada/operator/pkg/util"
|
||||||
"github.com/karmada-io/karmada/operator/pkg/util/apiclient"
|
"github.com/karmada-io/karmada/operator/pkg/util/apiclient"
|
||||||
)
|
)
|
||||||
|
@ -82,3 +83,67 @@ func aggregatedApiserverService(client clientset.Interface, name, namespace stri
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EnsureMetricsAdapterAPIService creates APIService and a service for karmada-metrics-adapter
|
||||||
|
func EnsureMetricsAdapterAPIService(aggregatorClient *aggregator.Clientset, client clientset.Interface, name, namespace string) error {
|
||||||
|
if err := karmadaMetricsAdapterService(client, name, namespace); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return karmadaMetricsAdapterAPIService(aggregatorClient, name, namespace)
|
||||||
|
}
|
||||||
|
|
||||||
|
func karmadaMetricsAdapterAPIService(client *aggregator.Clientset, name, namespace string) error {
|
||||||
|
for _, gv := range constants.KarmadaMetricsAdapterAPIServices {
|
||||||
|
// The APIService name to metrics adapter is "$version.$group"
|
||||||
|
apiServiceName := fmt.Sprintf("%s.%s", gv.Version, gv.Group)
|
||||||
|
|
||||||
|
apiServiceBytes, err := util.ParseTemplate(KarmadaMetricsAdapterAPIService, struct {
|
||||||
|
Name, Namespace string
|
||||||
|
ServiceName, Group, Version string
|
||||||
|
}{
|
||||||
|
Name: apiServiceName,
|
||||||
|
Namespace: namespace,
|
||||||
|
Group: gv.Group,
|
||||||
|
Version: gv.Version,
|
||||||
|
ServiceName: util.KarmadaMetricsAdapterName(name),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error when parsing KarmadaMetricsAdapter APIService %s template: %w", apiServiceName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
apiService := &apiregistrationv1.APIService{}
|
||||||
|
if err := runtime.DecodeInto(codecs.UniversalDecoder(), apiServiceBytes, apiService); err != nil {
|
||||||
|
return fmt.Errorf("err when decoding KarmadaMetricsAdapter APIService %s: %w", apiServiceName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := apiclient.CreateOrUpdateAPIService(client, apiService); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func karmadaMetricsAdapterService(client clientset.Interface, name, namespace string) error {
|
||||||
|
aggregatedApiserverServiceBytes, err := util.ParseTemplate(KarmadaMetricsAdapterService, struct {
|
||||||
|
Namespace string
|
||||||
|
ServiceName string
|
||||||
|
}{
|
||||||
|
Namespace: namespace,
|
||||||
|
ServiceName: util.KarmadaMetricsAdapterName(name),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error when parsing KarmadaMetricsAdapter Service template: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
aggregatedService := &corev1.Service{}
|
||||||
|
if err := runtime.DecodeInto(clientsetscheme.Codecs.UniversalDecoder(), aggregatedApiserverServiceBytes, aggregatedService); err != nil {
|
||||||
|
return fmt.Errorf("err when decoding KarmadaMetricsAdapter Service: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := apiclient.CreateOrUpdateService(client, aggregatedService); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -20,10 +20,40 @@ spec:
|
||||||
version: v1alpha1
|
version: v1alpha1
|
||||||
versionPriority: 10
|
versionPriority: 10
|
||||||
`
|
`
|
||||||
|
|
||||||
// KarmadaAggregatedApiserverService is karmada aggregated apiserver service manifest
|
// KarmadaAggregatedApiserverService is karmada aggregated apiserver service manifest
|
||||||
KarmadaAggregatedApiserverService = `
|
KarmadaAggregatedApiserverService = `
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ .ServiceName }}
|
||||||
|
namespace: {{ .Namespace }}
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
externalName: {{ .ServiceName }}.{{ .Namespace }}.svc
|
||||||
|
`
|
||||||
|
|
||||||
|
// KarmadaMetricsAdapterAPIService is karmada-metrics-adapter APIService manifest
|
||||||
|
KarmadaMetricsAdapterAPIService = `
|
||||||
|
apiVersion: apiregistration.k8s.io/v1
|
||||||
|
kind: APIService
|
||||||
|
metadata:
|
||||||
|
name: {{ .Name }}
|
||||||
|
spec:
|
||||||
|
service:
|
||||||
|
name: {{ .ServiceName }}
|
||||||
|
namespace: {{ .Namespace }}
|
||||||
|
group: {{ .Group }}
|
||||||
|
version: {{ .Version }}
|
||||||
|
insecureSkipTLSVerify: true
|
||||||
|
groupPriorityMinimum: 100
|
||||||
|
versionPriority: 200
|
||||||
|
`
|
||||||
|
|
||||||
|
// KarmadaMetricsAdapterService is karmada-metrics-adapter service manifest
|
||||||
|
KarmadaMetricsAdapterService = `
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: {{ .ServiceName }}
|
name: {{ .ServiceName }}
|
||||||
namespace: {{ .Namespace }}
|
namespace: {{ .Namespace }}
|
||||||
|
|
|
@ -3,12 +3,16 @@ package tasks
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
|
|
||||||
"github.com/karmada-io/karmada/operator/pkg/constants"
|
"github.com/karmada-io/karmada/operator/pkg/constants"
|
||||||
"github.com/karmada-io/karmada/operator/pkg/controlplane"
|
"github.com/karmada-io/karmada/operator/pkg/controlplane"
|
||||||
|
"github.com/karmada-io/karmada/operator/pkg/controlplane/metricsadapter"
|
||||||
"github.com/karmada-io/karmada/operator/pkg/controlplane/webhook"
|
"github.com/karmada-io/karmada/operator/pkg/controlplane/webhook"
|
||||||
|
"github.com/karmada-io/karmada/operator/pkg/karmadaresource/apiservice"
|
||||||
|
"github.com/karmada-io/karmada/operator/pkg/util/apiclient"
|
||||||
"github.com/karmada-io/karmada/operator/pkg/workflow"
|
"github.com/karmada-io/karmada/operator/pkg/workflow"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -27,6 +31,7 @@ func NewComponentTask() workflow.Task {
|
||||||
Run: runKarmadaWebhook,
|
Run: runKarmadaWebhook,
|
||||||
},
|
},
|
||||||
newComponentSubTask(constants.KarmadaDeschedulerComponent),
|
newComponentSubTask(constants.KarmadaDeschedulerComponent),
|
||||||
|
newKarmadaMetricsAdapterSubTask(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,7 +80,7 @@ func runComponentSubTask(component string) func(r workflow.RunData) error {
|
||||||
func runKarmadaWebhook(r workflow.RunData) error {
|
func runKarmadaWebhook(r workflow.RunData) error {
|
||||||
data, ok := r.(InitData)
|
data, ok := r.(InitData)
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("certs task invoked with an invalid data struct")
|
return errors.New("KarmadaWebhook task invoked with an invalid data struct")
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg := data.Components()
|
cfg := data.Components()
|
||||||
|
@ -97,3 +102,106 @@ func runKarmadaWebhook(r workflow.RunData) error {
|
||||||
klog.V(2).InfoS("[KarmadaWebhook] Successfully applied karmada webhook component", "karmada", klog.KObj(data))
|
klog.V(2).InfoS("[KarmadaWebhook] Successfully applied karmada webhook component", "karmada", klog.KObj(data))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newKarmadaMetricsAdapterSubTask() workflow.Task {
|
||||||
|
return workflow.Task{
|
||||||
|
Name: constants.KarmadaMetricsAdapterComponent,
|
||||||
|
Run: runKarmadaMetricsAdapter,
|
||||||
|
RunSubTasks: true,
|
||||||
|
Tasks: []workflow.Task{
|
||||||
|
{
|
||||||
|
Name: "DeployMetricAdapter",
|
||||||
|
Run: runDeployMetricAdapter,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "DeployMetricAdapterAPIService",
|
||||||
|
Run: runDeployMetricAdapterAPIService,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func runKarmadaMetricsAdapter(r workflow.RunData) error {
|
||||||
|
data, ok := r.(InitData)
|
||||||
|
if !ok {
|
||||||
|
return errors.New("karmadaMetricsAdapter task invoked with an invalid data struct")
|
||||||
|
}
|
||||||
|
|
||||||
|
klog.V(4).InfoS("[karmadaMetricsAdapter] Running karmadaMetricsAdapter task", "karmada", klog.KObj(data))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func runDeployMetricAdapter(r workflow.RunData) error {
|
||||||
|
data, ok := r.(InitData)
|
||||||
|
if !ok {
|
||||||
|
return errors.New("DeployMetricAdapter task invoked with an invalid data struct")
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := data.Components()
|
||||||
|
if cfg.KarmadaMetricsAdapter == nil {
|
||||||
|
klog.V(2).InfoS("[karmadaMetricsAdapter] Skip install karmada-metrics-adapter component")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
err := metricsadapter.EnsureKarmadaMetricAdapter(
|
||||||
|
data.RemoteClient(),
|
||||||
|
cfg.KarmadaMetricsAdapter,
|
||||||
|
data.GetName(),
|
||||||
|
data.GetNamespace(),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to apply karmada-metrics-adapter, err: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
klog.V(2).InfoS("[DeployMetricAdapter] Successfully applied karmada-metrics-adapter component", "karmada", klog.KObj(data))
|
||||||
|
|
||||||
|
if *cfg.KarmadaMetricsAdapter.Replicas != 0 {
|
||||||
|
waiter := apiclient.NewKarmadaWaiter(data.ControlplaneConfig(), data.RemoteClient(), time.Second*30)
|
||||||
|
if err = waiter.WaitForSomePods(karmadaMetricAdapterLabels.String(), data.GetNamespace(), 1); err != nil {
|
||||||
|
return fmt.Errorf("waiting for karmada-metrics-adapter to ready timeout, err: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
klog.V(2).InfoS("[DeployMetricAdapter] the karmada-metrics-adapter is ready", "karmada", klog.KObj(data))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func runDeployMetricAdapterAPIService(r workflow.RunData) error {
|
||||||
|
data, ok := r.(InitData)
|
||||||
|
if !ok {
|
||||||
|
return errors.New("DeployMetricAdapterAPIService task invoked with an invalid data struct")
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := data.Components()
|
||||||
|
if cfg.KarmadaMetricsAdapter == nil {
|
||||||
|
klog.V(2).InfoS("[karmadaMetricsAdapter] Skip install karmada-metrics-adapter APIService")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
config := data.ControlplaneConfig()
|
||||||
|
client, err := apiclient.NewAPIRegistrationClient(config)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = apiservice.EnsureMetricsAdapterAPIService(client, data.KarmadaClient(), data.GetName(), data.GetNamespace())
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to apply karmada-metrics-adapter APIService resource to karmada controlplane, err: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if *cfg.KarmadaMetricsAdapter.Replicas != 0 {
|
||||||
|
waiter := apiclient.NewKarmadaWaiter(config, nil, time.Second*20)
|
||||||
|
for _, gv := range constants.KarmadaMetricsAdapterAPIServices {
|
||||||
|
apiServiceName := fmt.Sprintf("%s.%s", gv.Version, gv.Group)
|
||||||
|
|
||||||
|
if err := waiter.WaitForAPIService(apiServiceName); err != nil {
|
||||||
|
return fmt.Errorf("the APIService %s is unhealthy, err: %w", apiServiceName, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
klog.V(2).InfoS("[DeployMetricAdapterAPIService] all karmada-metrics-adapter APIServices status is ready ", "karmada", klog.KObj(data))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -200,7 +200,7 @@ func runAPIService(r workflow.RunData) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
waiter := apiclient.NewKarmadaWaiter(config, nil, componentBeReadyTimeout)
|
waiter := apiclient.NewKarmadaWaiter(config, nil, componentBeReadyTimeout)
|
||||||
if err := apiclient.TryRunCommand(waiter.WaitForAPIService, 3); err != nil {
|
if err := waiter.WaitForAPIService(constants.APIServiceName); err != nil {
|
||||||
return fmt.Errorf("the APIService is unhealthy, err: %w", err)
|
return fmt.Errorf("the APIService is unhealthy, err: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ var (
|
||||||
karmadaControllerManagerLabels = labels.Set{"karmada-app": constants.KarmadaControllerManager}
|
karmadaControllerManagerLabels = labels.Set{"karmada-app": constants.KarmadaControllerManager}
|
||||||
karmadaSchedulerLabels = labels.Set{"karmada-app": constants.KarmadaScheduler}
|
karmadaSchedulerLabels = labels.Set{"karmada-app": constants.KarmadaScheduler}
|
||||||
karmadaWebhookLabels = labels.Set{"karmada-app": constants.KarmadaWebhook}
|
karmadaWebhookLabels = labels.Set{"karmada-app": constants.KarmadaWebhook}
|
||||||
|
karmadaMetricAdapterLabels = labels.Set{"karmada-app": constants.KarmadaMetricsAdapter}
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewCheckApiserverHealthTask init wait-apiserver task
|
// NewCheckApiserverHealthTask init wait-apiserver task
|
||||||
|
|
|
@ -18,9 +18,6 @@ import (
|
||||||
const (
|
const (
|
||||||
// APICallRetryInterval defines how long kubeadm should wait before retrying a failed API operation
|
// APICallRetryInterval defines how long kubeadm should wait before retrying a failed API operation
|
||||||
APICallRetryInterval = 500 * time.Millisecond
|
APICallRetryInterval = 500 * time.Millisecond
|
||||||
|
|
||||||
// APIServiceName defines the karmada aggregated apiserver APISerivce resource name.
|
|
||||||
APIServiceName = "v1alpha1.cluster.karmada.io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Waiter is an interface for waiting for criteria in Karmada to happen
|
// Waiter is an interface for waiting for criteria in Karmada to happen
|
||||||
|
@ -28,7 +25,7 @@ type Waiter interface {
|
||||||
// WaitForAPI waits for the API Server's /healthz endpoint to become "ok"
|
// WaitForAPI waits for the API Server's /healthz endpoint to become "ok"
|
||||||
WaitForAPI() error
|
WaitForAPI() error
|
||||||
// WaitForAPIService waits for the APIService condition to become "true"
|
// WaitForAPIService waits for the APIService condition to become "true"
|
||||||
WaitForAPIService() error
|
WaitForAPIService(name string) error
|
||||||
// WaitForPods waits for Pods in the namespace to become Ready
|
// WaitForPods waits for Pods in the namespace to become Ready
|
||||||
WaitForPods(label, namespace string) error
|
WaitForPods(label, namespace string) error
|
||||||
// WaitForSomePods waits for the specified number of Pods in the namespace to become Ready
|
// WaitForSomePods waits for the specified number of Pods in the namespace to become Ready
|
||||||
|
@ -67,14 +64,14 @@ func (w *KarmadaWaiter) WaitForAPI() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// WaitForAPIService waits for the APIService condition to become "true"
|
// WaitForAPIService waits for the APIService condition to become "true"
|
||||||
func (w *KarmadaWaiter) WaitForAPIService() error {
|
func (w *KarmadaWaiter) WaitForAPIService(name string) error {
|
||||||
aggregateClient, err := aggregator.NewForConfig(w.karmadaConfig)
|
aggregateClient, err := aggregator.NewForConfig(w.karmadaConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = wait.PollImmediate(APICallRetryInterval, w.timeout, func() (done bool, err error) {
|
err = wait.PollImmediate(APICallRetryInterval, w.timeout, func() (done bool, err error) {
|
||||||
apiService, err := aggregateClient.ApiregistrationV1().APIServices().Get(context.TODO(), APIServiceName, metav1.GetOptions{})
|
apiService, err := aggregateClient.ApiregistrationV1().APIServices().Get(context.TODO(), name, metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,11 @@ func KarmadaDeschedulerName(karmada string) string {
|
||||||
return generateResourceName(karmada, "descheduler")
|
return generateResourceName(karmada, "descheduler")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// KarmadaMetricsAdapterName returns name of karmada-metric-adapter
|
||||||
|
func KarmadaMetricsAdapterName(karmada string) string {
|
||||||
|
return generateResourceName(karmada, "metrics-adapter")
|
||||||
|
}
|
||||||
|
|
||||||
func generateResourceName(karmada, suffix string) string {
|
func generateResourceName(karmada, suffix string) string {
|
||||||
if strings.Contains(karmada, "karmada") {
|
if strings.Contains(karmada, "karmada") {
|
||||||
return fmt.Sprintf("%s-%s", karmada, suffix)
|
return fmt.Sprintf("%s-%s", karmada, suffix)
|
||||||
|
|
Loading…
Reference in New Issue