support set hub qps and burst for work in the klusterlet (#1014)
Some checks failed
Scorecard supply-chain security / Scorecard analysis (push) Failing after 1m43s
Post / coverage (push) Failing after 31m18s
Post / images (amd64) (push) Failing after 8m11s
Post / images (arm64) (push) Failing after 7m29s
Post / image manifest (push) Has been skipped
Post / trigger clusteradm e2e (push) Has been skipped
Close stale issues and PRs / stale (push) Successful in 35s

Signed-off-by: Zhiwei Yin <zyin@redhat.com>
This commit is contained in:
Zhiwei Yin
2025-05-30 10:03:07 +08:00
committed by GitHub
parent 88e7c32400
commit 98443736e9
15 changed files with 132 additions and 34 deletions

View File

@@ -59,7 +59,7 @@ metadata:
categories: Integration & Delivery,OpenShift Optional
certified: "false"
containerImage: quay.io/open-cluster-management/registration-operator:latest
createdAt: "2025-04-28T03:25:00Z"
createdAt: "2025-05-29T02:56:45Z"
description: Manages the installation and upgrade of the ClusterManager.
operators.operatorframework.io/builder: operator-sdk-v1.32.0
operators.operatorframework.io/project_layout: go.kubebuilder.io/v3

View File

@@ -305,14 +305,14 @@ spec:
kubeAPIBurst:
default: 100
description: |-
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 100
format: int32
type: integer
kubeAPIQPS:
default: 50
description: |-
KubeAPIQPS indicates the maximum QPS while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 50
format: int32
type: integer
@@ -475,17 +475,31 @@ spec:
- feature
type: object
type: array
hubKubeAPIBurst:
default: 100
description: |-
HubKubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the hub cluster.
If it is set empty, use the default value: 100
format: int32
type: integer
hubKubeAPIQPS:
default: 50
description: |-
HubKubeAPIQPS indicates the maximum QPS while talking with apiserver on the hub cluster.
If it is set empty, use the default value: 50
format: int32
type: integer
kubeAPIBurst:
default: 100
description: |-
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 100
format: int32
type: integer
kubeAPIQPS:
default: 50
description: |-
KubeAPIQPS indicates the maximum QPS while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 50
format: int32
type: integer

View File

@@ -305,14 +305,14 @@ spec:
kubeAPIBurst:
default: 100
description: |-
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 100
format: int32
type: integer
kubeAPIQPS:
default: 50
description: |-
KubeAPIQPS indicates the maximum QPS while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 50
format: int32
type: integer
@@ -475,17 +475,31 @@ spec:
- feature
type: object
type: array
hubKubeAPIBurst:
default: 100
description: |-
HubKubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the hub cluster.
If it is set empty, use the default value: 100
format: int32
type: integer
hubKubeAPIQPS:
default: 50
description: |-
HubKubeAPIQPS indicates the maximum QPS while talking with apiserver on the hub cluster.
If it is set empty, use the default value: 50
format: int32
type: integer
kubeAPIBurst:
default: 100
description: |-
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 100
format: int32
type: integer
kubeAPIQPS:
default: 50
description: |-
KubeAPIQPS indicates the maximum QPS while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 50
format: int32
type: integer

View File

@@ -31,7 +31,7 @@ metadata:
categories: Integration & Delivery,OpenShift Optional
certified: "false"
containerImage: quay.io/open-cluster-management/registration-operator:latest
createdAt: "2025-04-28T03:25:00Z"
createdAt: "2025-05-29T02:56:45Z"
description: Manages the installation and upgrade of the Klusterlet.
operators.operatorframework.io/builder: operator-sdk-v1.32.0
operators.operatorframework.io/project_layout: go.kubebuilder.io/v3

View File

@@ -264,7 +264,10 @@ spec:
reservedClusterClaimSuffixes:
description: Custom suffixes for reserved ClusterClaims.
items:
maxLength: 64
minLength: 1
type: string
maxItems: 10
type: array
required:
- maxCustomClusterClaims
@@ -302,14 +305,14 @@ spec:
kubeAPIBurst:
default: 100
description: |-
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 100
format: int32
type: integer
kubeAPIQPS:
default: 50
description: |-
KubeAPIQPS indicates the maximum QPS while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 50
format: int32
type: integer
@@ -472,20 +475,41 @@ spec:
- feature
type: object
type: array
hubKubeAPIBurst:
default: 100
description: |-
HubKubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the hub cluster.
If it is set empty, use the default value: 100
format: int32
type: integer
hubKubeAPIQPS:
default: 50
description: |-
HubKubeAPIQPS indicates the maximum QPS while talking with apiserver on the hub cluster.
If it is set empty, use the default value: 50
format: int32
type: integer
kubeAPIBurst:
default: 100
description: |-
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 100
format: int32
type: integer
kubeAPIQPS:
default: 50
description: |-
KubeAPIQPS indicates the maximum QPS while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 50
format: int32
type: integer
statusSyncInterval:
description: |-
StatusSyncInterval is the interval for the work agent to check the status of ManifestWorks.
Larger value means less frequent status sync and less api calls to the managed cluster, vice versa.
The value(x) should be: 5s <= x <= 1h.
pattern: ^([0-9]+(s|m|h))+$
type: string
type: object
workImagePullSpec:
description: |-

2
go.mod
View File

@@ -37,7 +37,7 @@ require (
k8s.io/kube-aggregator v0.32.1
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738
open-cluster-management.io/addon-framework v0.12.1-0.20250407131028-9d436ffc2da7
open-cluster-management.io/api v0.16.2-0.20250527062515-98a1d87193c1
open-cluster-management.io/api v0.16.2-0.20250529024642-922ceaca4e66
open-cluster-management.io/sdk-go v0.16.1-0.20250428032116-875454003818
sigs.k8s.io/cluster-inventory-api v0.0.0-20240730014211-ef0154379848
sigs.k8s.io/controller-runtime v0.20.2

4
go.sum
View File

@@ -487,8 +487,8 @@ k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6J
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
open-cluster-management.io/addon-framework v0.12.1-0.20250407131028-9d436ffc2da7 h1:oLu9ag44Msf56Hb19b/b+UTNq0J2l9rhlBQ1gh7izCU=
open-cluster-management.io/addon-framework v0.12.1-0.20250407131028-9d436ffc2da7/go.mod h1:7AEw1Sq9UEWpQGTU8zV1XPNkFRBYPbyBh8tfhISV++s=
open-cluster-management.io/api v0.16.2-0.20250527062515-98a1d87193c1 h1:OAFgR9hrr3dpiwb+Pgz5gSKKdtnHwD8L+PkBd4HjHXc=
open-cluster-management.io/api v0.16.2-0.20250527062515-98a1d87193c1/go.mod h1:/OeqXycNBZQoe3WG6ghuWsMgsKGuMZrK8ZpsU6gWL0Y=
open-cluster-management.io/api v0.16.2-0.20250529024642-922ceaca4e66 h1:al0mUH6tgmcoNDneGhjm84yVdtdiROmOadctTRxTVo8=
open-cluster-management.io/api v0.16.2-0.20250529024642-922ceaca4e66/go.mod h1:/OeqXycNBZQoe3WG6ghuWsMgsKGuMZrK8ZpsU6gWL0Y=
open-cluster-management.io/sdk-go v0.16.1-0.20250428032116-875454003818 h1:b7HpdTpKPzLEoJ5UtrXCed1PjxaKOxEboJ+kG6FZudI=
open-cluster-management.io/sdk-go v0.16.1-0.20250428032116-875454003818/go.mod h1:n89YVVoi5zm3KVpOyVMmTdD4rGOVSsykUtu7Ol3do3M=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 h1:CPT0ExVicCzcpeN4baWEV2ko2Z/AsiZgEdwgcfwLgMo=

View File

@@ -107,6 +107,12 @@ spec:
{{if gt .AgentKubeAPIBurst 0}}
- "--kube-api-burst={{ .AgentKubeAPIBurst }}"
{{end}}
{{if gt .WorkHubKubeAPIQPS 0.0}}
- "--hub-kube-api-qps={{ .WorkHubKubeAPIQPS }}"
{{end}}
{{if gt .WorkHubKubeAPIBurst 0}}
- "--hub-kube-api-burst={{ .WorkHubKubeAPIBurst }}"
{{end}}
{{if .MaxCustomClusterClaims}}
- "--max-custom-cluster-claims={{ .MaxCustomClusterClaims }}"
{{end}}

View File

@@ -86,6 +86,12 @@ spec:
{{if gt .WorkKubeAPIBurst 0}}
- "--kube-api-burst={{ .WorkKubeAPIBurst }}"
{{end}}
{{if gt .WorkHubKubeAPIQPS 0.0}}
- "--hub-kube-api-qps={{ .WorkHubKubeAPIQPS }}"
{{end}}
{{if gt .WorkHubKubeAPIBurst 0}}
- "--hub-kube-api-burst={{ .WorkHubKubeAPIBurst }}"
{{end}}
{{if .AppliedManifestWorkEvictionGracePeriod}}
- "--appliedmanifestwork-eviction-grace-period={{ .AppliedManifestWorkEvictionGracePeriod }}"
{{end}}

View File

@@ -171,6 +171,8 @@ type klusterletConfig struct {
RegistrationKubeAPIBurst int32
WorkKubeAPIQPS float32
WorkKubeAPIBurst int32
WorkHubKubeAPIQPS float32
WorkHubKubeAPIBurst int32
AppliedManifestWorkEvictionGracePeriod string
WorkStatusSyncInterval string
AgentKubeAPIQPS float32
@@ -395,6 +397,8 @@ func (n *klusterletController) sync(ctx context.Context, controllerContext facto
workFeatureGates = klusterlet.Spec.WorkConfiguration.FeatureGates
config.WorkKubeAPIQPS = float32(klusterlet.Spec.WorkConfiguration.KubeAPIQPS)
config.WorkKubeAPIBurst = klusterlet.Spec.WorkConfiguration.KubeAPIBurst
config.WorkHubKubeAPIQPS = float32(klusterlet.Spec.WorkConfiguration.HubKubeAPIQPS)
config.WorkHubKubeAPIBurst = klusterlet.Spec.WorkConfiguration.HubKubeAPIBurst
if klusterlet.Spec.WorkConfiguration.AppliedManifestWorkEvictionGracePeriod != nil {
config.AppliedManifestWorkEvictionGracePeriod = klusterlet.Spec.WorkConfiguration.AppliedManifestWorkEvictionGracePeriod.Duration.String()
}

View File

@@ -123,8 +123,10 @@ func newKlusterlet(name, namespace, clustername string) *operatorapiv1.Klusterle
KubeAPIBurst: 60,
},
WorkConfiguration: &operatorapiv1.WorkAgentConfiguration{
KubeAPIQPS: 20,
KubeAPIBurst: 50,
KubeAPIQPS: 20,
KubeAPIBurst: 50,
HubKubeAPIQPS: 40,
HubKubeAPIBurst: 80,
},
HubApiServerHostAlias: &operatorapiv1.HubApiServerHostAlias{
IP: "11.22.33.44",
@@ -401,7 +403,7 @@ func assertKlusterletDeployment(t *testing.T, registrationAuthType string, actio
}
expectedArgs = append(expectedArgs, "--agent-id=", "--workload-source-driver=kube", "--workload-source-config=/spoke/hub-kubeconfig/kubeconfig",
"--status-sync-interval=60s", "--kube-api-qps=20", "--kube-api-burst=60")
"--status-sync-interval=60s", "--kube-api-qps=20", "--kube-api-burst=60", "--hub-kube-api-qps=40", "--hub-kube-api-burst=80")
if serverURL != "" {
expectedArgs = append(expectedArgs, fmt.Sprintf("--spoke-external-server-urls=%s", serverURL))
@@ -528,7 +530,7 @@ func assertWorkDeployment(t *testing.T, actions []clienttesting.Action, verb, cl
expectArgs = append(expectArgs, fmt.Sprintf("--status-sync-interval=%s", workStatusSyncInterval))
}
expectArgs = append(expectArgs, "--kube-api-qps=20", "--kube-api-burst=50")
expectArgs = append(expectArgs, "--kube-api-qps=20", "--kube-api-burst=50", "--hub-kube-api-qps=40", "--hub-kube-api-burst=80")
if appliedManifestWorkEvictionGracePeriod != "" {
expectArgs = append(expectArgs, fmt.Sprintf("--appliedmanifestwork-eviction-grace-period=%s", appliedManifestWorkEvictionGracePeriod))
}

2
vendor/modules.txt vendored
View File

@@ -1714,7 +1714,7 @@ open-cluster-management.io/addon-framework/pkg/agent
open-cluster-management.io/addon-framework/pkg/assets
open-cluster-management.io/addon-framework/pkg/index
open-cluster-management.io/addon-framework/pkg/utils
# open-cluster-management.io/api v0.16.2-0.20250527062515-98a1d87193c1
# open-cluster-management.io/api v0.16.2-0.20250529024642-922ceaca4e66
## explicit; go 1.23.6
open-cluster-management.io/api/addon/v1alpha1
open-cluster-management.io/api/client/addon/clientset/versioned

View File

@@ -305,14 +305,14 @@ spec:
kubeAPIBurst:
default: 100
description: |-
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 100
format: int32
type: integer
kubeAPIQPS:
default: 50
description: |-
KubeAPIQPS indicates the maximum QPS while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 50
format: int32
type: integer
@@ -475,17 +475,31 @@ spec:
- feature
type: object
type: array
hubKubeAPIBurst:
default: 100
description: |-
HubKubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the hub cluster.
If it is set empty, use the default value: 100
format: int32
type: integer
hubKubeAPIQPS:
default: 50
description: |-
HubKubeAPIQPS indicates the maximum QPS while talking with apiserver on the hub cluster.
If it is set empty, use the default value: 50
format: int32
type: integer
kubeAPIBurst:
default: 100
description: |-
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 100
format: int32
type: integer
kubeAPIQPS:
default: 50
description: |-
KubeAPIQPS indicates the maximum QPS while talking with apiserver of hub cluster from the spoke cluster.
KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster.
If it is set empty, use the default value: 50
format: int32
type: integer

View File

@@ -151,13 +151,13 @@ type RegistrationConfiguration struct {
// +optional
ClusterAnnotations map[string]string `json:"clusterAnnotations,omitempty"`
// KubeAPIQPS indicates the maximum QPS while talking with apiserver of hub cluster from the spoke cluster.
// KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster.
// If it is set empty, use the default value: 50
// +optional
// +kubebuilder:default:=50
KubeAPIQPS int32 `json:"kubeAPIQPS,omitempty"`
// KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver of hub cluster from the spoke cluster.
// KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster.
// If it is set empty, use the default value: 100
// +optional
// +kubebuilder:default:=100
@@ -280,18 +280,30 @@ type WorkAgentConfiguration struct {
// +optional
FeatureGates []FeatureGate `json:"featureGates,omitempty"`
// KubeAPIQPS indicates the maximum QPS while talking with apiserver of hub cluster from the spoke cluster.
// KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster.
// If it is set empty, use the default value: 50
// +optional
// +kubebuilder:default:=50
KubeAPIQPS int32 `json:"kubeAPIQPS,omitempty"`
// KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver of hub cluster from the spoke cluster.
// KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster.
// If it is set empty, use the default value: 100
// +optional
// +kubebuilder:default:=100
KubeAPIBurst int32 `json:"kubeAPIBurst,omitempty"`
// HubKubeAPIQPS indicates the maximum QPS while talking with apiserver on the hub cluster.
// If it is set empty, use the default value: 50
// +optional
// +kubebuilder:default:=50
HubKubeAPIQPS int32 `json:"hubKubeAPIQPS,omitempty"`
// HubKubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the hub cluster.
// If it is set empty, use the default value: 100
// +optional
// +kubebuilder:default:=100
HubKubeAPIBurst int32 `json:"hubKubeAPIBurst,omitempty"`
// AppliedManifestWorkEvictionGracePeriod is the eviction grace period the work agent will wait before
// evicting the AppliedManifestWorks, whose corresponding ManifestWorks are missing on the hub cluster, from
// the managed cluster. If not present, the default value of the work agent will be used.

View File

@@ -313,8 +313,8 @@ var map_RegistrationConfiguration = map[string]string{
"clientCertExpirationSeconds": "clientCertExpirationSeconds represents the seconds of a client certificate to expire. If it is not set or 0, the default duration seconds will be set by the hub cluster. If the value is larger than the max signing duration seconds set on the hub cluster, the max signing duration seconds will be set.",
"featureGates": "FeatureGates represents the list of feature gates for registration If it is set empty, default feature gates will be used. If it is set, featuregate/Foo is an example of one item in FeatureGates:\n 1. If featuregate/Foo does not exist, registration-operator will discard it\n 2. If featuregate/Foo exists and is false by default. It is now possible to set featuregate/Foo=[false|true]\n 3. If featuregate/Foo exists and is true by default. If a cluster-admin upgrading from 1 to 2 wants to continue having featuregate/Foo=false,\n \the can set featuregate/Foo=false before upgrading. Let's say the cluster-admin wants featuregate/Foo=false.",
"clusterAnnotations": "ClusterAnnotations is annotations with the reserve prefix \"agent.open-cluster-management.io\" set on ManagedCluster when creating only, other actors can update it afterwards.",
"kubeAPIQPS": "KubeAPIQPS indicates the maximum QPS while talking with apiserver of hub cluster from the spoke cluster. If it is set empty, use the default value: 50",
"kubeAPIBurst": "KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver of hub cluster from the spoke cluster. If it is set empty, use the default value: 100",
"kubeAPIQPS": "KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster. If it is set empty, use the default value: 50",
"kubeAPIBurst": "KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster. If it is set empty, use the default value: 100",
"bootstrapKubeConfigs": "BootstrapKubeConfigs defines the ordered list of bootstrap kubeconfigs. The order decides which bootstrap kubeconfig to use first when rebootstrap.\n\nWhen the agent loses the connection to the current hub over HubConnectionTimeoutSeconds, or the managedcluster CR is set `hubAcceptsClient=false` on the hub, the controller marks the related bootstrap kubeconfig as \"failed\".\n\nA failed bootstrapkubeconfig won't be used for the duration specified by SkipFailedBootstrapKubeConfigSeconds. But if the user updates the content of a failed bootstrapkubeconfig, the \"failed\" mark will be cleared.",
"registrationDriver": "This provides driver details required to register with hub",
"clusterClaimConfiguration": "ClusterClaimConfiguration represents the configuration of ClusterClaim Effective only when the `ClusterClaim` feature gate is enabled.",
@@ -345,8 +345,10 @@ func (ServerURL) SwaggerDoc() map[string]string {
var map_WorkAgentConfiguration = map[string]string{
"featureGates": "FeatureGates represents the list of feature gates for work If it is set empty, default feature gates will be used. If it is set, featuregate/Foo is an example of one item in FeatureGates:\n 1. If featuregate/Foo does not exist, registration-operator will discard it\n 2. If featuregate/Foo exists and is false by default. It is now possible to set featuregate/Foo=[false|true]\n 3. If featuregate/Foo exists and is true by default. If a cluster-admin upgrading from 1 to 2 wants to continue having featuregate/Foo=false,\n \the can set featuregate/Foo=false before upgrading. Let's say the cluster-admin wants featuregate/Foo=false.",
"kubeAPIQPS": "KubeAPIQPS indicates the maximum QPS while talking with apiserver of hub cluster from the spoke cluster. If it is set empty, use the default value: 50",
"kubeAPIBurst": "KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver of hub cluster from the spoke cluster. If it is set empty, use the default value: 100",
"kubeAPIQPS": "KubeAPIQPS indicates the maximum QPS while talking with apiserver on the spoke cluster. If it is set empty, use the default value: 50",
"kubeAPIBurst": "KubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the spoke cluster. If it is set empty, use the default value: 100",
"hubKubeAPIQPS": "HubKubeAPIQPS indicates the maximum QPS while talking with apiserver on the hub cluster. If it is set empty, use the default value: 50",
"hubKubeAPIBurst": "HubKubeAPIBurst indicates the maximum burst of the throttle while talking with apiserver on the hub cluster. If it is set empty, use the default value: 100",
"appliedManifestWorkEvictionGracePeriod": "AppliedManifestWorkEvictionGracePeriod is the eviction grace period the work agent will wait before evicting the AppliedManifestWorks, whose corresponding ManifestWorks are missing on the hub cluster, from the managed cluster. If not present, the default value of the work agent will be used.",
"statusSyncInterval": "StatusSyncInterval is the interval for the work agent to check the status of ManifestWorks. Larger value means less frequent status sync and less api calls to the managed cluster, vice versa. The value(x) should be: 5s <= x <= 1h.",
}