3scale-operator icon indicating copy to clipboard operation
3scale-operator copied to clipboard

[WIP]THREESCALE-10719 - 3scale Community release v0.11.0 ( 2.14.1 )

Open valerymo opened this issue 11 months ago • 16 comments

Jira: https://issues.redhat.com/browse/THREESCALE-10719

DON't merge this PR. This is for E2E test of Community Release Only

3scale Community release v0.11.0 ; based on 3scale-2.14.1-GA

  • Compare v0.11.0 with 0.10.1 and v0.11.0 with 3scale-2.14.1-GA
$ git diff v0.11.0..v0.10.1 --name-only |wc -l
179
$ git diff v0.11.0..3scale-2.14.1-GA --name-only
.circleci/config.yml
Makefile
bundle/manifests/3scale-operator.clusterserviceversion.yaml
config/manager/kustomization.yaml
config/manager/manager.yaml
config/manifests/bases/3scale-operator.clusterserviceversion.yaml
pkg/3scale/amp/component/images.go
[vmogilev@vmogilev 3scale-operator] (3scale-community-v0.11.0)$ 

  • Compare CSV v0.11.0 and 0.10.1
    - name: RELATED_IMAGE_BACKEND
      value: quay.io/3scale/3scale214:apisonator-3scale-2.14.1-GA
      value: quay.io/3scale/3scale213:apisonator-3scale-2.13.1-GA
    - name: RELATED_IMAGE_APICAST
      value: quay.io/3scale/3scale214:apicast-3scale-2.14.1-GA
      value: quay.io/3scale/3scale213:apicast-3scale-2.13.1-GA
    - name: RELATED_IMAGE_SYSTEM
      value: quay.io/3scale/3scale214:porta-3scale-2.14.1-GA
      value: quay.io/3scale/3scale213:porta-3scale-2.13.1-GA
    - name: RELATED_IMAGE_ZYNC
      value: quay.io/3scale/3scale214:zync-3scale-2.14.1-GA
      value: quay.io/3scale/3scale213:zync-3scale-2.13.1-GA
    - name: RELATED_IMAGE_SYSTEM_MEMCACHED
      value: memcached:1.5
    - name: RELATED_IMAGE_BACKEND_REDIS
      value: quay.io/fedora/redis-6:latest
      value: centos/redis-5-centos7
    - name: RELATED_IMAGE_SYSTEM_REDIS
      value: quay.io/fedora/redis-6:latest
      value: centos/redis-5-centos7
    - name: RELATED_IMAGE_SYSTEM_MYSQL
      value: quay.io/sclorg/mysql-80-c8s
      value: centos/mysql-80-centos7
    - name: RELATED_IMAGE_SYSTEM_POSTGRESQL
      value: quay.io/sclorg/postgresql-10-c8s
      value: centos/postgresql-10-centos7
    - name: RELATED_IMAGE_ZYNC_POSTGRESQL
      value: quay.io/sclorg/postgresql-10-c8s
      value: centos/postgresql-10-centos7
    - name: RELATED_IMAGE_OC_CLI
      value: quay.io/openshift/origin-cli:4.7
?     value: quay.io/openshift/origin-cli:4.7

Release v0.11.0 Test - Fresh Install and Upgrade from v0.10.1

TEST Community Release 0.11.0

17.04.24

docker system prune -a
docker images
docker login -u="vmogilev_rhmi" -p="X4xxxxxxx" quay.io

Clean quay.io repos https://quay.io/repository/vmogilev_rhmi/3scale-index?tab=tags https://quay.io/repository/vmogilev_rhmi/3scale-operator-bundles?tab=tags https://quay.io/repository/vmogilev_rhmi/3scale-operator?tab=tags

Check Fresh Installation of v0.11.0

$ git switch 3scale-community-v0.11.0

docker build -f Dockerfile  -t quay.io/vmogilev_rhmi/3scale-operator:0.0.1
docker push quay.io/vmogilev_rhmi/3scale-operator:0.0.1

docker build -f bundle.Dockerfile -t quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.1 .
docker push quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.1

opm index add --bundles quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.1 --build-tool docker --tag quay.io/vmogilev_rhmi/3scale-index:0.0.1
docker push quay.io/vmogilev_rhmi/3scale-index:0.0.1

CatalogSource

kubectl apply -f - <<EOF
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  name: threescale-operators
  namespace: openshift-marketplace
spec:
  sourceType: grpc
  image: quay.io/vmogilev_rhmi/3scale-index:0.0.1
EOF
  • Install 3scale-operator from OperatorsHub
  • appply s3-credentials secret and apimanager CR
  • check installation
$ oc get dc
Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+
NAME                 REVISION   DESIRED   CURRENT   TRIGGERED BY
apicast-production   1          1         1         config,image(amp-apicast:2.14)
apicast-staging      1          1         1         config,image(amp-apicast:2.14)
backend-cron         1          1         1         config,image(amp-backend:2.14)
backend-listener     1          1         1         config,image(amp-backend:2.14)
backend-redis        1          1         1         config,image(backend-redis:2.14)
backend-worker       1          1         1         config,image(amp-backend:2.14)
system-app           1          1         1         config,image(amp-system:2.14)
system-memcache      1          1         1         config,image(system-memcached:2.14)
system-mysql         1          1         1         config,image(system-mysql:2.14)
system-redis         1          1         1         config,image(system-redis:2.14)
system-searchd       1          1         1         config,image(system-searchd:2.14)
system-sidekiq       1          1         1         config,image(amp-system:2.14)
zync                 1          1         1         config,image(amp-zync:2.14)
zync-database        1          1         1         config,image(zync-database-postgresql:2.14)
zync-que             1          1         1         config,image(amp-zync:2.14)
$ date
Wed Apr 17 12:02:00 IDT 2024

Cleanup

- Uninstall operator from OperatorsHub
- $ make uninstall
- $ oc delete project 3scale-test
- $ oc delete catalogsource threescale-operators --namespace=openshift-marketplace

Upgrade from v0.10.1 to v0.11.0

docker system prune -a
docker images
  • Clean quay.io repos https://quay.io/repository/vmogilev_rhmi/3scale-index?tab=tags https://quay.io/repository/vmogilev_rhmi/3scale-operator-bundles?tab=tags https://quay.io/repository/vmogilev_rhmi/3scale-operator?tab=tags

Prepare Image for previous release: v0.10.1

$ git switch v0.10.1 --detach

Do following changes in CSV (taken from community-operators-prod repo !) containerImage: quay.io/3scale/3scale-operator:v0.10.1

  • name: RELATED_IMAGE_BACKEND value: quay.io/3scale/3scale213:apisonator-3scale-2.13.1-GA
  • name: RELATED_IMAGE_APICAST value: quay.io/3scale/3scale213:apicast-3scale-2.13.1-GA
  • name: RELATED_IMAGE_SYSTEM value: quay.io/3scale/3scale213:porta-3scale-2.13.1-GA
  • name: RELATED_IMAGE_ZYNC value: quay.io/3scale/3scale213:zync-3scale-2.13.1-GA image: quay.io/3scale/3scale-operator:v0.10.1

Create release image(s)

docker build -f Dockerfile  -t quay.io/vmogilev_rhmi/3scale-operator:0.0.1
docker push quay.io/vmogilev_rhmi/3scale-operator:0.0.1

docker build -f bundle.Dockerfile -t quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.1 .
docker push quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.1

opm index add --bundles quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.1 --build-tool docker --tag quay.io/vmogilev_rhmi/3scale-index:0.0.1
docker push quay.io/vmogilev_rhmi/3scale-index:0.0.1

CatalogSource

kubectl apply -f - <<EOF
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  name: threescale-operators
  namespace: openshift-marketplace
spec:
  sourceType: grpc
  image: quay.io/vmogilev_rhmi/3scale-index:0.0.1
EOF
  • Install 3scale-operator from OperatorsHub
  • appply s3-credentials secret and apimanager CR
  • check installation
$ oc get dc
Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+
NAME                 REVISION   DESIRED   CURRENT   TRIGGERED BY
apicast-production   1          1         1         config,image(amp-apicast:2.13)
apicast-staging      1          1         1         config,image(amp-apicast:2.13)
backend-cron         1          1         1         config,image(amp-backend:2.13)
backend-listener     1          1         1         config,image(amp-backend:2.13)
backend-redis        1          1         1         config,image(backend-redis:2.13)
backend-worker       1          1         1         config,image(amp-backend:2.13)
system-app           1          1         1         config,image(amp-system:2.13)
system-memcache      1          1         1         config,image(system-memcached:2.13)
system-mysql         1          1         1         config,image(system-mysql:2.13)
system-redis         1          1         1         config,image(system-redis:2.13)
system-sidekiq       1          1         1         config,image(amp-system:2.13)
system-sphinx        1          1         1         config,image(amp-system:2.13)
zync                 1          1         1         config,image(amp-zync:2.13)
zync-database        1          1         1         config,image(zync-database-postgresql:2.13)
zync-que             1          1         1         config,image(amp-zync:2.13)
$ date
Wed Apr 17 14:04:09 IDT 2024
$ oc describe deploy |grep -i redis
      RELATED_IMAGE_BACKEND_REDIS:      centos/redis-5-centos7
      RELATED_IMAGE_SYSTEM_REDIS:       centos/redis-5-centos7

Prepare Image(s) for new release: v0.11.0 for Upgrade

git switch 3scale-community-v0.11.0
  • Update Makefile: version: 0.0.2
  • Update CSV: containerImage: quay.io/vmogilev_rhmi/3scale-operator:0.0.2 image: quay.io/vmogilev_rhmi/3scale-operator:0.0.2 name: 3scale-operator.v0.0.2 replaces: 3scale-operator.v0.0.1 version: 0.0.2
  • rebuild: make ls -l bin/manager -rwxrwxr-x. 1 vmogilev vmogilev 57909321 Apr 17 14:03 bin/manager
docker build -f Dockerfile  -t quay.io/vmogilev_rhmi/3scale-operator:0.0.2
docker push quay.io/vmogilev_rhmi/3scale-operator:0.0.2

docker build -f bundle.Dockerfile -t quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.2 .
docker push quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.2

opm index add --bundles quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.1 --bundles quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.2 --build-tool docker --tag quay.io/vmogilev_rhmi/3scale-index:0.0.2
docker push quay.io/vmogilev_rhmi/3scale-index:0.0.2
$ oc edit catalogsource threescale-operators --namespace=openshift-marketplace

check

$ oc get dc
Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+
NAME                 REVISION   DESIRED   CURRENT   TRIGGERED BY
apicast-production   3          1         1         config,image(amp-apicast:2.14)
apicast-staging      3          1         1         config,image(amp-apicast:2.14)
backend-cron         3          1         1         config,image(amp-backend:2.14)
backend-listener     3          1         1         config,image(amp-backend:2.14)
backend-redis        3          1         1         config,image(backend-redis:2.14)
backend-worker       3          1         1         config,image(amp-backend:2.14)
system-app           2          1         1         config,image(amp-system:2.14)
system-memcache      2          1         1         config,image(system-memcached:2.14)
system-mysql         3          1         1         config,image(system-mysql:2.14)
system-redis         3          1         1         config,image(system-redis:2.14)
system-searchd       1          1         1         config,image(system-searchd:2.14)
system-sidekiq       2          1         1         config,image(amp-system:2.14)
zync                 2          1         1         config,image(amp-zync:2.14)
zync-database        3          1         1         config,image(zync-database-postgresql:2.14)
zync-que             3          1         1         config,image(amp-zync:2.14)

$ date
Wed Apr 17 14:14:50 IDT 2024
$ oc get deploy
NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
threescale-operator-controller-manager-v2   1/1     1            1           57m
$ oc describe deploy threescale-operator-controller-manager-v2 |grep redis
      RELATED_IMAGE_BACKEND_REDIS:      quay.io/fedora/redis-6:latest
      RELATED_IMAGE_SYSTEM_REDIS:       quay.io/fedora/redis-6:latest

valerymo avatar Mar 18 '24 16:03 valerymo

three issues

  • [x] Bundle validation fails. Check in circleci the command run to test the bundle. The main issue is that changes needs to be applied in config instead of bundle folder. Then make bundle adds changes to bundle folder.
  • [x] TOC validation failed. Same, check in circleci the command run to validate table of contents and see why it fails.
  • [x] I do not see e2e tests being run. I think it is because it is being configured where tests should happen. https://github.com/openshift/release/blob/master/ci-operator/config/3scale/3scale-operator/3scale-3scale-operator-3scale-2.12-stable.yaml#L51 Maybe you should open PR in that repo to add 2.14 3scale-2.14-stable branch for the tests. And your PR should target 3scale-2.14-stable branch instead.

eguzki avatar Mar 18 '24 17:03 eguzki

three issues

  • [ ] Bundle validation fails. Check in circleci the command run to test the bundle. The main issue is that changes needs to be applied in config instead of bundle folder. Then make bundle adds changes to bundle folder.
  • [ ] TOC validation failed. Same, check in circleci the command run to validate table of contents and see why it fails.
  • [ ] I do not see e2e tests being run. I think it is because it is being configured where tests should happen. https://github.com/openshift/release/blob/master/ci-operator/config/3scale/3scale-operator/3scale-3scale-operator-3scale-2.12-stable.yaml#L51 Maybe you should open PR in that repo to add 2.14 3scale-2.14-stable branch for the tests. And your PR should target 3scale-2.14-stable branch instead.
  • Bundle validation - remains issue with annotations.yaml . It can be generated with bundle-custom-updates, but it's not passing validation in PR, So meanwhile not updating this file.
  • TOC - .circleci updated to ignire it (I didn't change Docs). Also, maybe in master it's already ignored.
  • PR https://github.com/openshift/release/pull/49972/files

valerymo avatar Mar 19 '24 11:03 valerymo

test ci/prow/test-unit

valerymo avatar Apr 10 '24 15:04 valerymo

/retest

valerymo avatar Apr 10 '24 15:04 valerymo

/test test-unit

MStokluska avatar Apr 10 '24 15:04 MStokluska

/retest

valerymo avatar Apr 10 '24 15:04 valerymo

/test test-unit

valerymo avatar Apr 10 '24 15:04 valerymo

/test test-unit

valerymo avatar Apr 10 '24 15:04 valerymo

/retest

valerymo avatar Apr 10 '24 15:04 valerymo

/retest

valerymo avatar Apr 11 '24 03:04 valerymo

/retest

valerymo avatar Apr 17 '24 08:04 valerymo

Compare bundles: this PR's (v0.11.0) and 0.10.1

Only in 0.10.1/: bundle.Dockerfile
diff -r 0.10.1/manifests/3scale-operator.clusterserviceversion.yaml 0.11.0/manifests/3scale-operator.clusterserviceversion.yaml
84a85,103
>           "kind": "Application",
>           "metadata": {
>             "name": "application-sample"
>           },
>           "spec": {
>             "accountCR": {
>               "name": "developeraccount-sample"
>             },
>             "applicationPlanName": "plan01",
>             "description": "testing application ",
>             "name": "testApp",
>             "productCR": {
>               "name": "product-sample"
>             },
>             "suspend": false
>           }
>         },
>         {
>           "apiVersion": "capabilities.3scale.net/v1beta1",
186c205
<     containerImage: quay.io/3scale/3scale-operator:v0.10.1
---
>     containerImage: quay.io/3scale/3scale-operator:v0.11.0
187a207,208
>     description: 3scale Operator to provision 3scale and publish/manage API
>     olm.properties: '[{"type": "olm.maxOpenShiftVersion", "value": "4.15"}]'
188a210
>     operators.openshift.io/valid-subscription: '["Red Hat Integration", "Red Hat 3scale API Management"]'
194,195d215
<     description: 3scale Operator to provision 3scale and publish/manage API
<     operators.openshift.io/valid-subscription: '["Red Hat Integration", "Red Hat 3scale API Management"]'
200c220
<   name: 3scale-community-operator.v0.10.1
---
>   name: 3scale-operator.v0.0.1
253a274,278
>     - description: Application is the Schema for the applications API
>       displayName: Application
>       kind: Application
>       name: applications.capabilities.3scale.net
>       version: v1beta1
295c320
<     The 3scale community Operator creates and maintains the Red Hat 3scale API Management on [OpenShift](https://www.openshift.com/) in various deployment configurations.
---
>     The 3scale Operator creates and maintains the Red Hat 3scale API Management on [OpenShift](https://www.openshift.com/) in various deployment configurations.
297c322
<     3scale API Management makes it easy to manage your APIs.
---
>     [3scale API Management](https://www.redhat.com/en/technologies/jboss-middleware/3scale) makes it easy to manage your APIs.
307c332
<     Documentation can be found on our [website](https://github.com/3scale/3scale-operator/blob/v0.10.1/doc/operator-user-guide.md).
---
>     Documentation can be found on our [website](https://github.com/3scale/3scale-operator/blob/master/doc/operator-user-guide.md).
324c349
<   displayName: 3scale API Management
---
>   displayName: 3scale (development latest)
334a360,379
>           - applications
>           verbs:
>           - create
>           - delete
>           - get
>           - list
>           - patch
>           - update
>           - watch
>         - apiGroups:
>           - capabilities.3scale.net
>           resources:
>           - applications/status
>           verbs:
>           - get
>           - patch
>           - update
>         - apiGroups:
>           - capabilities.3scale.net
>           resources:
382a428
>                 com.company: Red_Hat
383a430,435
>                 rht.comp: 3scale
>                 rht.comp_ver: "2.14"
>                 rht.prod_name: Red_Hat_Integration
>                 rht.prod_ver: master
>                 rht.subcomp: 3scale_operator
>                 rht.subcomp_t: infrastructure
397c449
<                   value: quay.io/3scale/3scale213:apisonator-3scale-2.13.1-GA
---
>                   value: quay.io/3scale/3scale214:apisonator-3scale-2.14.1-GA
399c451
<                   value: quay.io/3scale/3scale213:apicast-3scale-2.13.1-GA
---
>                   value: quay.io/3scale/3scale214:apicast-3scale-2.14.1-GA
401c453
<                   value: quay.io/3scale/3scale213:porta-3scale-2.13.1-GA
---
>                   value: quay.io/3scale/3scale214:porta-3scale-2.14.1-GA
403c455
<                   value: quay.io/3scale/3scale213:zync-3scale-2.13.1-GA
---
>                   value: quay.io/3scale/3scale214:zync-3scale-2.14.1-GA
407c459
<                   value: centos/redis-5-centos7
---
>                   value: quay.io/fedora/redis-6:latest
409c461
<                   value: centos/redis-5-centos7
---
>                   value: quay.io/fedora/redis-6:latest
411c463
<                   value: centos/mysql-80-centos7
---
>                   value: quay.io/sclorg/mysql-80-c8s
413c465
<                   value: centos/postgresql-10-centos7
---
>                   value: quay.io/sclorg/postgresql-10-c8s
415c467
<                   value: centos/postgresql-10-centos7
---
>                   value: quay.io/sclorg/postgresql-10-c8s
418c470,472
<                 image: quay.io/3scale/3scale-operator:v0.10.1
---
>                 - name: RELATED_IMAGE_SYSTEM_SEARCHD
>                   value: quay.io/3scale/searchd:latest
>                 image: quay.io/3scale/3scale-operator:v0.11.0
978c1032
<     url: https://github.com/3scale/3scale-operator/blob/v0.10.1/doc/operator-user-guide.md
---
>     url: https://github.com/3scale/3scale-operator/blob/master/doc/operator-user-guide.md
989,990c1043
<   version: 0.10.1
<   replaces: 3scale-community-operator.v0.9.0
---
>   version: 0.0.1
diff -r 0.10.1/manifests/apps.3scale.net_apimanagers.yaml 0.11.0/manifests/apps.3scale.net_apimanagers.yaml
519a520,523
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
584a589,592
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
616a625,626
>                       priorityClassName:
>                         type: string
641a652,655
>                       serviceCacheSize:
>                         description: ServiceCacheSize specifies the number of services that APICast can store in the internal cache
>                         format: int32
>                         type: integer
663a678,732
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
1149a1219,1222
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
1214a1288,1291
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
1246a1324,1325
>                       priorityClassName:
>                         type: string
1271a1351,1354
>                       serviceCacheSize:
>                         description: ServiceCacheSize specifies the number of services that APICast can store in the internal cache
>                         format: int32
>                         type: integer
1293a1377,1431
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
1773a1912,1921
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
1820a1969,2023
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
2297a2501,2510
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
2344a2558,2612
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
2817a3086,3089
>                   redisAnnotations:
>                     additionalProperties:
>                       type: string
>                     type: object
2819a3092,3095
>                   redisLabels:
>                     additionalProperties:
>                       type: string
>                     type: object
2824a3101,3102
>                   redisPriorityClassName:
>                     type: string
2868a3147,3201
>                   redisTopologySpreadConstraints:
>                     items:
>                       description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                       properties:
>                         labelSelector:
>                           description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                           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
>                           x-kubernetes-map-type: atomic
>                         maxSkew:
>                           description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                           format: int32
>                           type: integer
>                         minDomains:
>                           description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                           format: int32
>                           type: integer
>                         topologyKey:
>                           description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                           type: string
>                         whenUnsatisfiable:
>                           description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                           type: string
>                       required:
>                       - maxSkew
>                       - topologyKey
>                       - whenUnsatisfiable
>                       type: object
>                     type: array
3342a3676,3685
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
3389a3733,3787
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
3920a4319,4322
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
3942a4345,4348
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
3964a4371,4372
>                       priorityClassName:
>                         type: string
4011a4420,4474
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
4489a4953,4956
>                           annotations:
>                             additionalProperties:
>                               type: string
>                             type: object
4491a4959,4962
>                           labels:
>                             additionalProperties:
>                               type: string
>                             type: object
4512a4984,4985
>                           priorityClassName:
>                             type: string
4556a5030,5084
>                           topologySpreadConstraints:
>                             items:
>                               description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                               properties:
>                                 labelSelector:
>                                   description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                                   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
>                                   x-kubernetes-map-type: atomic
>                                 maxSkew:
>                                   description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                                   format: int32
>                                   type: integer
>                                 minDomains:
>                                   description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                                   format: int32
>                                   type: integer
>                                 topologyKey:
>                                   description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                                   type: string
>                                 whenUnsatisfiable:
>                                   description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                                   type: string
>                               required:
>                               - maxSkew
>                               - topologyKey
>                               - whenUnsatisfiable
>                               type: object
>                             type: array
5031a5560,5563
>                           annotations:
>                             additionalProperties:
>                               type: string
>                             type: object
5033a5566,5569
>                           labels:
>                             additionalProperties:
>                               type: string
>                             type: object
5054a5591,5592
>                           priorityClassName:
>                             type: string
5098a5637,5691
>                           topologySpreadConstraints:
>                             items:
>                               description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                               properties:
>                                 labelSelector:
>                                   description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                                   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
>                                   x-kubernetes-map-type: atomic
>                                 maxSkew:
>                                   description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                                   format: int32
>                                   type: integer
>                                 minDomains:
>                                   description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                                   format: int32
>                                   type: integer
>                                 topologyKey:
>                                   description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                                   type: string
>                                 whenUnsatisfiable:
>                                   description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                                   type: string
>                               required:
>                               - maxSkew
>                               - topologyKey
>                               - whenUnsatisfiable
>                               type: object
>                             type: array
5156a5750,5759
>                           sts:
>                             description: STS authentication spec
>                             properties:
>                               audience:
>                                 description: The ID the token is intended for
>                                 type: string
>                               enabled:
>                                 description: Enable Secure Token Service for  short-term, limited-privilege security credentials
>                                 type: boolean
>                             type: object
5634a6238,6241
>                   memcachedAnnotations:
>                     additionalProperties:
>                       type: string
>                     type: object
5636a6244,6249
>                   memcachedLabels:
>                     additionalProperties:
>                       type: string
>                     type: object
>                   memcachedPriorityClassName:
>                     type: string
5680a6294,6348
>                   memcachedTopologySpreadConstraints:
>                     items:
>                       description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                       properties:
>                         labelSelector:
>                           description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                           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
>                           x-kubernetes-map-type: atomic
>                         maxSkew:
>                           description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                           format: int32
>                           type: integer
>                         minDomains:
>                           description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                           format: int32
>                           type: integer
>                         topologyKey:
>                           description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                           type: string
>                         whenUnsatisfiable:
>                           description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                           type: string
>                       required:
>                       - maxSkew
>                       - topologyKey
>                       - whenUnsatisfiable
>                       type: object
>                     type: array
6152a6821,6824
>                   redisAnnotations:
>                     additionalProperties:
>                       type: string
>                     type: object
6154a6827,6830
>                   redisLabels:
>                     additionalProperties:
>                       type: string
>                     type: object
6159a6836,6837
>                   redisPriorityClassName:
>                     type: string
6203a6882,7543
>                   redisTopologySpreadConstraints:
>                     items:
>                       description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                       properties:
>                         labelSelector:
>                           description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                           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
>                           x-kubernetes-map-type: atomic
>                         maxSkew:
>                           description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                           format: int32
>                           type: integer
>                         minDomains:
>                           description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                           format: int32
>                           type: integer
>                         topologyKey:
>                           description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                           type: string
>                         whenUnsatisfiable:
>                           description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                           type: string
>                       required:
>                       - maxSkew
>                       - topologyKey
>                       - whenUnsatisfiable
>                       type: object
>                     type: array
>                   searchdSpec:
>                     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
>                                       x-kubernetes-map-type: atomic
>                                     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
>                                       x-kubernetes-map-type: atomic
>                                     type: array
>                                 required:
>                                 - nodeSelectorTerms
>                                 type: object
>                                 x-kubernetes-map-type: atomic
>                             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
>                                           x-kubernetes-map-type: atomic
>                                         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.
>                                           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
>                                           x-kubernetes-map-type: atomic
>                                         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
>                                       x-kubernetes-map-type: atomic
>                                     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.
>                                       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
>                                       x-kubernetes-map-type: atomic
>                                     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
>                                           x-kubernetes-map-type: atomic
>                                         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.
>                                           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
>                                           x-kubernetes-map-type: atomic
>                                         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
>                                       x-kubernetes-map-type: atomic
>                                     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.
>                                       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
>                                       x-kubernetes-map-type: atomic
>                                     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
>                       image:
>                         type: string
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       persistentVolumeClaim:
>                         properties:
>                           resources:
>                             description: Resources represents the minimum resources the volume should have. Ignored when VolumeName field is set
>                             properties:
>                               requests:
>                                 anyOf:
>                                 - type: integer
>                                 - type: string
>                                 description: 'Storage Resource requests to be used on the PersistentVolumeClaim. To learn more about resource requests see: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
>                                 pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
>                                 x-kubernetes-int-or-string: true
>                             required:
>                             - requests
>                             type: object
>                           storageClassName:
>                             type: string
>                           volumeName:
>                             description: VolumeName is the binding reference to the PersistentVolume backing this claim.
>                             type: string
>                         type: object
>                       priorityClassName:
>                         type: string
>                       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:
>                         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
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
>                     type: object
6677a8018,8027
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
6724a8075,8129
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
6726a8132
>                     description: Deprecated
7199a8606,8607
>                       priorityClassName:
>                         type: string
7243a8652,8706
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
7726a9190,9199
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
7773a9247,9301
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
8246a9775,9784
>                   databaseAnnotations:
>                     additionalProperties:
>                       type: string
>                     type: object
>                   databaseLabels:
>                     additionalProperties:
>                       type: string
>                     type: object
>                   databasePriorityClassName:
>                     type: string
8290a9829,9883
>                   databaseTopologySpreadConstraints:
>                     items:
>                       description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                       properties:
>                         labelSelector:
>                           description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                           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
>                           x-kubernetes-map-type: atomic
>                         maxSkew:
>                           description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                           format: int32
>                           type: integer
>                         minDomains:
>                           description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                           format: int32
>                           type: integer
>                         topologyKey:
>                           description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                           type: string
>                         whenUnsatisfiable:
>                           description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                           type: string
>                       required:
>                       - maxSkew
>                       - topologyKey
>                       - whenUnsatisfiable
>                       type: object
>                     type: array
8768a10362,10371
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
8813a10417,10471
>                           type: object
>                         type: array
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
Only in 0.11.0/manifests: capabilities.3scale.net_applications.yaml
diff -r 0.10.1/manifests/capabilities.3scale.net_openapis.yaml 0.11.0/manifests/capabilities.3scale.net_openapis.yaml
34a35,148
>               oidc:
>                 description: OIDCSpec defines the desired configuration of OpenID Connect Authentication
>                 properties:
>                   authenticationFlow:
>                     description: AuthenticationFlow specifies OAuth2.0 authorization grant type
>                     properties:
>                       directAccessGrantsEnabled:
>                         type: boolean
>                       implicitFlowEnabled:
>                         type: boolean
>                       serviceAccountsEnabled:
>                         type: boolean
>                       standardFlowEnabled:
>                         description: OIDCIssuer is the OIDC issuer
>                         type: boolean
>                     required:
>                     - directAccessGrantsEnabled
>                     - implicitFlowEnabled
>                     - serviceAccountsEnabled
>                     - standardFlowEnabled
>                     type: object
>                   credentials:
>                     description: 'Credentials Location available options: headers: As HTTP Headers query: As query parameters (GET) or body parameters (POST/PUT/DELETE) authorization: As HTTP Basic Authentication'
>                     enum:
>                     - headers
>                     - query
>                     - authorization
>                     type: string
>                   gatewayResponse:
>                     description: GatewayResponseSpec defines the desired gateway response configuration
>                     properties:
>                       errorAuthFailed:
>                         description: ErrorAuthFailed specifies the response body when authentication fails
>                         type: string
>                       errorAuthMissing:
>                         description: ErrorAuthMissing specifies the response body when authentication is missing
>                         type: string
>                       errorHeadersAuthFailed:
>                         description: ErrorHeadersAuthFailed specifies the Content-Type header when authentication fails
>                         type: string
>                       errorHeadersAuthMissing:
>                         description: ErrorHeadersAuthMissing specifies the Content-Type header when authentication is missing
>                         type: string
>                       errorHeadersLimitsExceeded:
>                         description: ErrorHeadersLimitsExceeded specifies the Content-Type header when usage limit exceeded
>                         type: string
>                       errorHeadersNoMatch:
>                         description: ErrorHeadersNoMatch specifies the Content-Type header when no match error
>                         type: string
>                       errorLimitsExceeded:
>                         description: ErrorLimitsExceeded specifies the response body when usage limit exceeded
>                         type: string
>                       errorNoMatch:
>                         description: ErrorNoMatch specifies the response body when no match error
>                         type: string
>                       errorStatusAuthFailed:
>                         description: ErrorStatusAuthFailed specifies the response code when authentication fails
>                         format: int32
>                         type: integer
>                       errorStatusAuthMissing:
>                         description: ErrorStatusAuthMissing specifies the response code when authentication is missing
>                         format: int32
>                         type: integer
>                       errorStatusLimitsExceeded:
>                         description: ErrorStatusLimitsExceeded specifies the response code when usage limit exceeded
>                         format: int32
>                         type: integer
>                       errorStatusNoMatch:
>                         description: ErrorStatusNoMatch specifies the response code when no match error
>                         format: int32
>                         type: integer
>                     type: object
>                   issuerEndpoint:
>                     description: Issuer is the OIDC issuer
>                     type: string
>                   issuerEndpointRef:
>                     description: IssuerEndpointRef  is the reference to OIDC issuer Secret that contains IssuerEndpoint
>                     properties:
>                       name:
>                         description: name is unique within a namespace to reference a secret resource.
>                         type: string
>                       namespace:
>                         description: namespace defines the space within which the secret name must be unique.
>                         type: string
>                     type: object
>                     x-kubernetes-map-type: atomic
>                   issuerType:
>                     description: IssuerType is the type of the OIDC issuer
>                     enum:
>                     - keycloak
>                     - rest
>                     type: string
>                   jwtClaimWithClientID:
>                     description: JwtClaimWithClientID is the JSON Web Token (JWT) Claim with ClientID that contains the clientID. Defaults to 'azp'.
>                     type: string
>                   jwtClaimWithClientIDType:
>                     description: JwtClaimWithClientIDType sets to process the ClientID Token Claim value as a string or as a liquid template.
>                     enum:
>                     - plain
>                     - liquid
>                     type: string
>                   security:
>                     description: SecuritySpec defines the desired state of Authentication Security
>                     properties:
>                       hostHeader:
>                         description: HostHeader Lets you define a custom Host request header. This is needed if your API backend only accepts traffic from a specific host.
>                         type: string
>                       secretToken:
>                         description: SecretToken Enables you to block any direct developer requests to your API backend; each 3scale API gateway call to your API backend contains a request header called X-3scale-proxy-secret-token. The value of this header can be set by you here. It's up to you ensure your backend only allows calls with this secret header.
>                         type: string
>                     type: object
>                 required:
>                 - issuerType
>                 type: object
diff -r 0.10.1/manifests/capabilities.3scale.net_products.yaml 0.11.0/manifests/capabilities.3scale.net_products.yaml
310a311,321
>                               issuerEndpointRef:
>                                 description: IssuerEndpointRef  is the reference to OIDC issuer Secret that contains IssuerEndpoint
>                                 properties:
>                                   name:
>                                     description: name is unique within a namespace to reference a secret resource.
>                                     type: string
>                                   namespace:
>                                     description: namespace defines the space within which the secret name must be unique.
>                                     type: string
>                                 type: object
>                                 x-kubernetes-map-type: atomic
337d347
<                             - issuerEndpoint
567a578,588
>                               issuerEndpointRef:
>                                 description: IssuerEndpointRef  is the reference to OIDC issuer Secret that contains IssuerEndpoint
>                                 properties:
>                                   name:
>                                     description: name is unique within a namespace to reference a secret resource.
>                                     type: string
>                                   namespace:
>                                     description: namespace defines the space within which the secret name must be unique.
>                                     type: string
>                                 type: object
>                                 x-kubernetes-map-type: atomic
594d614
<                             - issuerEndpoint
748a769,779
>                     configurationRef:
>                       description: ConfigurationRef Secret reference containing policy configuration
>                       properties:
>                         name:
>                           description: name is unique within a namespace to reference a secret resource.
>                           type: string
>                         namespace:
>                           description: namespace defines the space within which the secret name must be unique.
>                           type: string
>                       type: object
>                       x-kubernetes-map-type: atomic
759d789
<                   - configuration
diff -r 0.10.1/metadata/annotations.yaml 0.11.0/metadata/annotations.yaml
2,3c2
<   operators.operatorframework.io.bundle.channels.v1: threescale-2.13
<   operators.operatorframework.io.bundle.channel.default.v1: threescale-2.13
---
>   operators.operatorframework.io.bundle.channels.v1: alpha
7c6
<   operators.operatorframework.io.bundle.package.v1: 3scale-community-operator
---
>   operators.operatorframework.io.bundle.package.v1: 3scale-operator
11d9
<   com.redhat.openshift.versions: v4.9

Issues to be fixed

  • [x] CVS version
  • [X] com.redhat.openshift.versions should be added here, I just do not know how to do that. We can add them later in https://github.com/redhat-openshift-ecosystem
  • [x] CSV replaces
  • [x] CSV name
  • [x] CSV description
  • [x] CSV urls
  • [x] CSV rht.prod_ver
  • [x] Annotations default channel
  • [x] Annotations package
  • [x] Annotations channel

Some of these updates should be done in master as well, like the CSV description.

eguzki avatar Apr 17 '24 15:04 eguzki

Compare bundles: this PR's (v0.11.0) and 0.10.1

Issues to be fixed

  • [x] CVS version
  • [x] com.redhat.openshift.versions should be added here, I just do not know how to do that. We can add them later in https://github.com/redhat-openshift-ecosystem
  • [x] CSV replaces
  • [x] CSV name
  • [x] CSV description
  • [x] CSV urls
  • [x] CSV rht.prod_ver
  • [x] Annotations default channel
  • [x] Annotations package
  • [x] Annotations channel

Some of these updates should be done in master as well, like the CSV description.

Done. Separate commit. + Tag changed from v0.11.0 to v0.11.1

  • Changes Reverted in new commit, as CircleCI build bundle check step fails if we place all these updates - https://app.circleci.com/pipelines/github/3scale/3scale-operator/6341/workflows/e86c7842-5d7c-4d44-99dc-2d151c97cfb8/jobs/45397 .
  • Please note that All marked changes are in community repo - https://github.com/redhat-openshift-ecosystem/community-operators-prod/pull/4150/files
  • Please help check why new image v0.11.1 is not created here https://quay.io/repository/3scale/3scale-operator?tab=tags&tag=v0.11.0

Changed back 24 Apr to address all comments, as Eguzki suggested, so we again have errors in bundle validation, but E2E passed, so maybe it's good enough for this step. Thanks

valerymo avatar Apr 18 '24 05:04 valerymo

/retest

valerymo avatar Apr 18 '24 08:04 valerymo

/bundle-validate

valerymo avatar Apr 18 '24 08:04 valerymo

@eguzki , @MStokluska Open questions

  • How this image was created, and how to rebuild it - https://quay.io/repository/3scale/3scale-operator?tab=tags&tag=v0.11.0
  • If I understand correctly - manual rebuild or removal is not possible (?) , need create new Tag and do build in PR https://github.com/3scale/3scale-operator/pull/950
  • I created new tag v0.11.1 and did rebuild of PR - new image was not created Could you please help

valerymo avatar Apr 18 '24 15:04 valerymo

diff -r 0.10.1/ 0.11.0/

Result:

Only in 0.10.1/: bundle.Dockerfile
diff -r 0.10.1/manifests/3scale-operator.clusterserviceversion.yaml 0.11.0/manifests/3scale-operator.clusterserviceversion.yaml
84a85,103
>           "kind": "Application",
>           "metadata": {
>             "name": "application-sample"
>           },
>           "spec": {
>             "accountCR": {
>               "name": "developeraccount-sample"
>             },
>             "applicationPlanName": "plan01",
>             "description": "testing application ",
>             "name": "testApp",
>             "productCR": {
>               "name": "product-sample"
>             },
>             "suspend": false
>           }
>         },
>         {
>           "apiVersion": "capabilities.3scale.net/v1beta1",
186c205
<     containerImage: quay.io/3scale/3scale-operator:v0.10.1
---
>     containerImage: quay.io/3scale/3scale-operator:master
187a207,208
>     description: 3scale Operator to provision 3scale and publish/manage API
>     olm.properties: '[{"type": "olm.maxOpenShiftVersion", "value": "4.15"}]'
188a210
>     operators.openshift.io/valid-subscription: '["Red Hat Integration", "Red Hat 3scale API Management"]'
194,195d215
<     description: 3scale Operator to provision 3scale and publish/manage API
<     operators.openshift.io/valid-subscription: '["Red Hat Integration", "Red Hat 3scale API Management"]'
200c220
<   name: 3scale-community-operator.v0.10.1
---
>   name: 3scale-operator.v0.0.1
253a274,278
>     - description: Application is the Schema for the applications API
>       displayName: Application
>       kind: Application
>       name: applications.capabilities.3scale.net
>       version: v1beta1
295c320
<     The 3scale community Operator creates and maintains the Red Hat 3scale API Management on [OpenShift](https://www.openshift.com/) in various deployment configurations.
---
>     The 3scale Operator creates and maintains the Red Hat 3scale API Management on [OpenShift](https://www.openshift.com/) in various deployment configurations.
297c322
<     3scale API Management makes it easy to manage your APIs.
---
>     [3scale API Management](https://www.redhat.com/en/technologies/jboss-middleware/3scale) makes it easy to manage your APIs.
307c332
<     Documentation can be found on our [website](https://github.com/3scale/3scale-operator/blob/v0.10.1/doc/operator-user-guide.md).
---
>     Documentation can be found on our [website](https://github.com/3scale/3scale-operator/blob/master/doc/operator-user-guide.md).
324c349
<   displayName: 3scale API Management
---
>   displayName: 3scale (development latest)
334a360,379
>           - applications
>           verbs:
>           - create
>           - delete
>           - get
>           - list
>           - patch
>           - update
>           - watch
>         - apiGroups:
>           - capabilities.3scale.net
>           resources:
>           - applications/status
>           verbs:
>           - get
>           - patch
>           - update
>         - apiGroups:
>           - capabilities.3scale.net
>           resources:
382a428
>                 com.company: Red_Hat
383a430,435
>                 rht.comp: 3scale
>                 rht.comp_ver: "2.14"
>                 rht.prod_name: Red_Hat_Integration
>                 rht.prod_ver: master
>                 rht.subcomp: 3scale_operator
>                 rht.subcomp_t: infrastructure
397c449
<                   value: quay.io/3scale/3scale213:apisonator-3scale-2.13.1-GA
---
>                   value: quay.io/3scale/3scale214:apisonator-3scale-2.14.1-GA
399c451
<                   value: quay.io/3scale/3scale213:apicast-3scale-2.13.1-GA
---
>                   value: quay.io/3scale/3scale214:apicast-3scale-2.14.1-GA
401c453
<                   value: quay.io/3scale/3scale213:porta-3scale-2.13.1-GA
---
>                   value: quay.io/3scale/3scale214:porta-3scale-2.14.1-GA
403c455
<                   value: quay.io/3scale/3scale213:zync-3scale-2.13.1-GA
---
>                   value: quay.io/3scale/3scale214:zync-3scale-2.14.1-GA
407c459
<                   value: centos/redis-5-centos7
---
>                   value: quay.io/fedora/redis-6:latest
409c461
<                   value: centos/redis-5-centos7
---
>                   value: quay.io/fedora/redis-6:latest
411c463
<                   value: centos/mysql-80-centos7
---
>                   value: quay.io/sclorg/mysql-80-c8s
413c465
<                   value: centos/postgresql-10-centos7
---
>                   value: quay.io/sclorg/postgresql-10-c8s
415c467
<                   value: centos/postgresql-10-centos7
---
>                   value: quay.io/sclorg/postgresql-10-c8s
418c470,472
<                 image: quay.io/3scale/3scale-operator:v0.10.1
---
>                 - name: RELATED_IMAGE_SYSTEM_SEARCHD
>                   value: quay.io/3scale/searchd:latest
>                 image: quay.io/3scale/3scale-operator:v0.11.1
978c1032
<     url: https://github.com/3scale/3scale-operator/blob/v0.10.1/doc/operator-user-guide.md
---
>     url: https://github.com/3scale/3scale-operator/blob/master/doc/operator-user-guide.md
989,990c1043
<   version: 0.10.1
<   replaces: 3scale-community-operator.v0.9.0
---
>   version: 0.0.1
diff -r 0.10.1/manifests/apps.3scale.net_apimanagers.yaml 0.11.0/manifests/apps.3scale.net_apimanagers.yaml
519a520,523
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
584a589,592
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
616a625,626
>                       priorityClassName:
>                         type: string
641a652,655
>                       serviceCacheSize:
>                         description: ServiceCacheSize specifies the number of services that APICast can store in the internal cache
>                         format: int32
>                         type: integer
663a678,732
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
1149a1219,1222
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
1214a1288,1291
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
1246a1324,1325
>                       priorityClassName:
>                         type: string
1271a1351,1354
>                       serviceCacheSize:
>                         description: ServiceCacheSize specifies the number of services that APICast can store in the internal cache
>                         format: int32
>                         type: integer
1293a1377,1431
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
1773a1912,1921
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
1820a1969,2023
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
2297a2501,2510
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
2344a2558,2612
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
2817a3086,3089
>                   redisAnnotations:
>                     additionalProperties:
>                       type: string
>                     type: object
2819a3092,3095
>                   redisLabels:
>                     additionalProperties:
>                       type: string
>                     type: object
2824a3101,3102
>                   redisPriorityClassName:
>                     type: string
2868a3147,3201
>                   redisTopologySpreadConstraints:
>                     items:
>                       description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                       properties:
>                         labelSelector:
>                           description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                           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
>                           x-kubernetes-map-type: atomic
>                         maxSkew:
>                           description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                           format: int32
>                           type: integer
>                         minDomains:
>                           description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                           format: int32
>                           type: integer
>                         topologyKey:
>                           description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                           type: string
>                         whenUnsatisfiable:
>                           description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                           type: string
>                       required:
>                       - maxSkew
>                       - topologyKey
>                       - whenUnsatisfiable
>                       type: object
>                     type: array
3342a3676,3685
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
3389a3733,3787
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
3920a4319,4322
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
3942a4345,4348
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
3964a4371,4372
>                       priorityClassName:
>                         type: string
4011a4420,4474
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
4489a4953,4956
>                           annotations:
>                             additionalProperties:
>                               type: string
>                             type: object
4491a4959,4962
>                           labels:
>                             additionalProperties:
>                               type: string
>                             type: object
4512a4984,4985
>                           priorityClassName:
>                             type: string
4556a5030,5084
>                           topologySpreadConstraints:
>                             items:
>                               description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                               properties:
>                                 labelSelector:
>                                   description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                                   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
>                                   x-kubernetes-map-type: atomic
>                                 maxSkew:
>                                   description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                                   format: int32
>                                   type: integer
>                                 minDomains:
>                                   description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                                   format: int32
>                                   type: integer
>                                 topologyKey:
>                                   description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                                   type: string
>                                 whenUnsatisfiable:
>                                   description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                                   type: string
>                               required:
>                               - maxSkew
>                               - topologyKey
>                               - whenUnsatisfiable
>                               type: object
>                             type: array
5031a5560,5563
>                           annotations:
>                             additionalProperties:
>                               type: string
>                             type: object
5033a5566,5569
>                           labels:
>                             additionalProperties:
>                               type: string
>                             type: object
5054a5591,5592
>                           priorityClassName:
>                             type: string
5098a5637,5691
>                           topologySpreadConstraints:
>                             items:
>                               description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                               properties:
>                                 labelSelector:
>                                   description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                                   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
>                                   x-kubernetes-map-type: atomic
>                                 maxSkew:
>                                   description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                                   format: int32
>                                   type: integer
>                                 minDomains:
>                                   description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                                   format: int32
>                                   type: integer
>                                 topologyKey:
>                                   description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                                   type: string
>                                 whenUnsatisfiable:
>                                   description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                                   type: string
>                               required:
>                               - maxSkew
>                               - topologyKey
>                               - whenUnsatisfiable
>                               type: object
>                             type: array
5156a5750,5759
>                           sts:
>                             description: STS authentication spec
>                             properties:
>                               audience:
>                                 description: The ID the token is intended for
>                                 type: string
>                               enabled:
>                                 description: Enable Secure Token Service for  short-term, limited-privilege security credentials
>                                 type: boolean
>                             type: object
5634a6238,6241
>                   memcachedAnnotations:
>                     additionalProperties:
>                       type: string
>                     type: object
5636a6244,6249
>                   memcachedLabels:
>                     additionalProperties:
>                       type: string
>                     type: object
>                   memcachedPriorityClassName:
>                     type: string
5680a6294,6348
>                   memcachedTopologySpreadConstraints:
>                     items:
>                       description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                       properties:
>                         labelSelector:
>                           description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                           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
>                           x-kubernetes-map-type: atomic
>                         maxSkew:
>                           description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                           format: int32
>                           type: integer
>                         minDomains:
>                           description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                           format: int32
>                           type: integer
>                         topologyKey:
>                           description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                           type: string
>                         whenUnsatisfiable:
>                           description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                           type: string
>                       required:
>                       - maxSkew
>                       - topologyKey
>                       - whenUnsatisfiable
>                       type: object
>                     type: array
6152a6821,6824
>                   redisAnnotations:
>                     additionalProperties:
>                       type: string
>                     type: object
6154a6827,6830
>                   redisLabels:
>                     additionalProperties:
>                       type: string
>                     type: object
6159a6836,6837
>                   redisPriorityClassName:
>                     type: string
6203a6882,7543
>                   redisTopologySpreadConstraints:
>                     items:
>                       description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                       properties:
>                         labelSelector:
>                           description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                           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
>                           x-kubernetes-map-type: atomic
>                         maxSkew:
>                           description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                           format: int32
>                           type: integer
>                         minDomains:
>                           description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                           format: int32
>                           type: integer
>                         topologyKey:
>                           description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                           type: string
>                         whenUnsatisfiable:
>                           description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                           type: string
>                       required:
>                       - maxSkew
>                       - topologyKey
>                       - whenUnsatisfiable
>                       type: object
>                     type: array
>                   searchdSpec:
>                     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
>                                       x-kubernetes-map-type: atomic
>                                     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
>                                       x-kubernetes-map-type: atomic
>                                     type: array
>                                 required:
>                                 - nodeSelectorTerms
>                                 type: object
>                                 x-kubernetes-map-type: atomic
>                             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
>                                           x-kubernetes-map-type: atomic
>                                         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.
>                                           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
>                                           x-kubernetes-map-type: atomic
>                                         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
>                                       x-kubernetes-map-type: atomic
>                                     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.
>                                       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
>                                       x-kubernetes-map-type: atomic
>                                     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
>                                           x-kubernetes-map-type: atomic
>                                         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.
>                                           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
>                                           x-kubernetes-map-type: atomic
>                                         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
>                                       x-kubernetes-map-type: atomic
>                                     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.
>                                       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
>                                       x-kubernetes-map-type: atomic
>                                     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
>                       image:
>                         type: string
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       persistentVolumeClaim:
>                         properties:
>                           resources:
>                             description: Resources represents the minimum resources the volume should have. Ignored when VolumeName field is set
>                             properties:
>                               requests:
>                                 anyOf:
>                                 - type: integer
>                                 - type: string
>                                 description: 'Storage Resource requests to be used on the PersistentVolumeClaim. To learn more about resource requests see: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
>                                 pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
>                                 x-kubernetes-int-or-string: true
>                             required:
>                             - requests
>                             type: object
>                           storageClassName:
>                             type: string
>                           volumeName:
>                             description: VolumeName is the binding reference to the PersistentVolume backing this claim.
>                             type: string
>                         type: object
>                       priorityClassName:
>                         type: string
>                       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:
>                         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
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
>                     type: object
6677a8018,8027
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
6724a8075,8129
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
6726a8132
>                     description: Deprecated
7199a8606,8607
>                       priorityClassName:
>                         type: string
7243a8652,8706
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
7726a9190,9199
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
7773a9247,9301
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
8246a9775,9784
>                   databaseAnnotations:
>                     additionalProperties:
>                       type: string
>                     type: object
>                   databaseLabels:
>                     additionalProperties:
>                       type: string
>                     type: object
>                   databasePriorityClassName:
>                     type: string
8290a9829,9883
>                   databaseTopologySpreadConstraints:
>                     items:
>                       description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                       properties:
>                         labelSelector:
>                           description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                           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
>                           x-kubernetes-map-type: atomic
>                         maxSkew:
>                           description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                           format: int32
>                           type: integer
>                         minDomains:
>                           description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                           format: int32
>                           type: integer
>                         topologyKey:
>                           description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                           type: string
>                         whenUnsatisfiable:
>                           description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                           type: string
>                       required:
>                       - maxSkew
>                       - topologyKey
>                       - whenUnsatisfiable
>                       type: object
>                     type: array
8768a10362,10371
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
8813a10417,10471
>                           type: object
>                         type: array
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
Only in 0.11.0/manifests: capabilities.3scale.net_applications.yaml
diff -r 0.10.1/manifests/capabilities.3scale.net_openapis.yaml 0.11.0/manifests/capabilities.3scale.net_openapis.yaml
34a35,148
>               oidc:
>                 description: OIDCSpec defines the desired configuration of OpenID Connect Authentication
>                 properties:
>                   authenticationFlow:
>                     description: AuthenticationFlow specifies OAuth2.0 authorization grant type
>                     properties:
>                       directAccessGrantsEnabled:
>                         type: boolean
>                       implicitFlowEnabled:
>                         type: boolean
>                       serviceAccountsEnabled:
>                         type: boolean
>                       standardFlowEnabled:
>                         description: OIDCIssuer is the OIDC issuer
>                         type: boolean
>                     required:
>                     - directAccessGrantsEnabled
>                     - implicitFlowEnabled
>                     - serviceAccountsEnabled
>                     - standardFlowEnabled
>                     type: object
>                   credentials:
>                     description: 'Credentials Location available options: headers: As HTTP Headers query: As query parameters (GET) or body parameters (POST/PUT/DELETE) authorization: As HTTP Basic Authentication'
>                     enum:
>                     - headers
>                     - query
>                     - authorization
>                     type: string
>                   gatewayResponse:
>                     description: GatewayResponseSpec defines the desired gateway response configuration
>                     properties:
>                       errorAuthFailed:
>                         description: ErrorAuthFailed specifies the response body when authentication fails
>                         type: string
>                       errorAuthMissing:
>                         description: ErrorAuthMissing specifies the response body when authentication is missing
>                         type: string
>                       errorHeadersAuthFailed:
>                         description: ErrorHeadersAuthFailed specifies the Content-Type header when authentication fails
>                         type: string
>                       errorHeadersAuthMissing:
>                         description: ErrorHeadersAuthMissing specifies the Content-Type header when authentication is missing
>                         type: string
>                       errorHeadersLimitsExceeded:
>                         description: ErrorHeadersLimitsExceeded specifies the Content-Type header when usage limit exceeded
>                         type: string
>                       errorHeadersNoMatch:
>                         description: ErrorHeadersNoMatch specifies the Content-Type header when no match error
>                         type: string
>                       errorLimitsExceeded:
>                         description: ErrorLimitsExceeded specifies the response body when usage limit exceeded
>                         type: string
>                       errorNoMatch:
>                         description: ErrorNoMatch specifies the response body when no match error
>                         type: string
>                       errorStatusAuthFailed:
>                         description: ErrorStatusAuthFailed specifies the response code when authentication fails
>                         format: int32
>                         type: integer
>                       errorStatusAuthMissing:
>                         description: ErrorStatusAuthMissing specifies the response code when authentication is missing
>                         format: int32
>                         type: integer
>                       errorStatusLimitsExceeded:
>                         description: ErrorStatusLimitsExceeded specifies the response code when usage limit exceeded
>                         format: int32
>                         type: integer
>                       errorStatusNoMatch:
>                         description: ErrorStatusNoMatch specifies the response code when no match error
>                         format: int32
>                         type: integer
>                     type: object
>                   issuerEndpoint:
>                     description: Issuer is the OIDC issuer
>                     type: string
>                   issuerEndpointRef:
>                     description: IssuerEndpointRef  is the reference to OIDC issuer Secret that contains IssuerEndpoint
>                     properties:
>                       name:
>                         description: name is unique within a namespace to reference a secret resource.
>                         type: string
>                       namespace:
>                         description: namespace defines the space within which the secret name must be unique.
>                         type: string
>                     type: object
>                     x-kubernetes-map-type: atomic
>                   issuerType:
>                     description: IssuerType is the type of the OIDC issuer
>                     enum:
>                     - keycloak
>                     - rest
>                     type: string
>                   jwtClaimWithClientID:
>                     description: JwtClaimWithClientID is the JSON Web Token (JWT) Claim with ClientID that contains the clientID. Defaults to 'azp'.
>                     type: string
>                   jwtClaimWithClientIDType:
>                     description: JwtClaimWithClientIDType sets to process the ClientID Token Claim value as a string or as a liquid template.
>                     enum:
>                     - plain
>                     - liquid
>                     type: string
>                   security:
>                     description: SecuritySpec defines the desired state of Authentication Security
>                     properties:
>                       hostHeader:
>                         description: HostHeader Lets you define a custom Host request header. This is needed if your API backend only accepts traffic from a specific host.
>                         type: string
>                       secretToken:
>                         description: SecretToken Enables you to block any direct developer requests to your API backend; each 3scale API gateway call to your API backend contains a request header called X-3scale-proxy-secret-token. The value of this header can be set by you here. It's up to you ensure your backend only allows calls with this secret header.
>                         type: string
>                     type: object
>                 required:
>                 - issuerType
>                 type: object
diff -r 0.10.1/manifests/capabilities.3scale.net_products.yaml 0.11.0/manifests/capabilities.3scale.net_products.yaml
310a311,321
>                               issuerEndpointRef:
>                                 description: IssuerEndpointRef  is the reference to OIDC issuer Secret that contains IssuerEndpoint
>                                 properties:
>                                   name:
>                                     description: name is unique within a namespace to reference a secret resource.
>                                     type: string
>                                   namespace:
>                                     description: namespace defines the space within which the secret name must be unique.
>                                     type: string
>                                 type: object
>                                 x-kubernetes-map-type: atomic
337d347
<                             - issuerEndpoint
567a578,588
>                               issuerEndpointRef:
>                                 description: IssuerEndpointRef  is the reference to OIDC issuer Secret that contains IssuerEndpoint
>                                 properties:
>                                   name:
>                                     description: name is unique within a namespace to reference a secret resource.
>                                     type: string
>                                   namespace:
>                                     description: namespace defines the space within which the secret name must be unique.
>                                     type: string
>                                 type: object
>                                 x-kubernetes-map-type: atomic
594d614
<                             - issuerEndpoint
748a769,779
>                     configurationRef:
>                       description: ConfigurationRef Secret reference containing policy configuration
>                       properties:
>                         name:
>                           description: name is unique within a namespace to reference a secret resource.
>                           type: string
>                         namespace:
>                           description: namespace defines the space within which the secret name must be unique.
>                           type: string
>                       type: object
>                       x-kubernetes-map-type: atomic
759d789
<                   - configuration
diff -r 0.10.1/metadata/annotations.yaml 0.11.0/metadata/annotations.yaml
2,3c2
<   operators.operatorframework.io.bundle.channels.v1: threescale-2.13
<   operators.operatorframework.io.bundle.channel.default.v1: threescale-2.13
---
>   operators.operatorframework.io.bundle.channels.v1: alpha
7c6
<   operators.operatorframework.io.bundle.package.v1: 3scale-community-operator
---
>   operators.operatorframework.io.bundle.package.v1: 3scale-operator
11d9
<   com.redhat.openshift.versions: v4.9

eguzki avatar Apr 24 '24 08:04 eguzki

diff -r 0.10.1/ 0.11.0/

Result:

Only in 0.10.1/: bundle.Dockerfile
diff -r 0.10.1/manifests/3scale-operator.clusterserviceversion.yaml 0.11.0/manifests/3scale-operator.clusterserviceversion.yaml
84a85,103
>           "kind": "Application",
>           "metadata": {
>             "name": "application-sample"
>           },
>           "spec": {
>             "accountCR": {
>               "name": "developeraccount-sample"
>             },
>             "applicationPlanName": "plan01",
>             "description": "testing application ",
>             "name": "testApp",
>             "productCR": {
>               "name": "product-sample"
>             },
>             "suspend": false
>           }
>         },
>         {
>           "apiVersion": "capabilities.3scale.net/v1beta1",
186c205
<     containerImage: quay.io/3scale/3scale-operator:v0.10.1
---
>     containerImage: quay.io/3scale/3scale-operator:v0.11.0
187a207,208
>     description: 3scale Operator to provision 3scale and publish/manage API
>     olm.properties: '[{"type": "olm.maxOpenShiftVersion", "value": "4.15"}]'
188a210
>     operators.openshift.io/valid-subscription: '["Red Hat Integration", "Red Hat 3scale API Management"]'
194,195d215
<     description: 3scale Operator to provision 3scale and publish/manage API
<     operators.openshift.io/valid-subscription: '["Red Hat Integration", "Red Hat 3scale API Management"]'
200c220
<   name: 3scale-community-operator.v0.10.1
---
>   name: 3scale-community-operator.v0.11.0
253a274,278
>     - description: Application is the Schema for the applications API
>       displayName: Application
>       kind: Application
>       name: applications.capabilities.3scale.net
>       version: v1beta1
307c332
<     Documentation can be found on our [website](https://github.com/3scale/3scale-operator/blob/v0.10.1/doc/operator-user-guide.md).
---
>     Documentation can be found on our [website](https://github.com/3scale/3scale-operator/blob/v0.11.0/doc/operator-user-guide.md).
334a360,379
>           - applications
>           verbs:
>           - create
>           - delete
>           - get
>           - list
>           - patch
>           - update
>           - watch
>         - apiGroups:
>           - capabilities.3scale.net
>           resources:
>           - applications/status
>           verbs:
>           - get
>           - patch
>           - update
>         - apiGroups:
>           - capabilities.3scale.net
>           resources:
397c442
<                   value: quay.io/3scale/3scale213:apisonator-3scale-2.13.1-GA
---
>                   value: quay.io/3scale/3scale214:apisonator-3scale-2.14.1-GA
399c444
<                   value: quay.io/3scale/3scale213:apicast-3scale-2.13.1-GA
---
>                   value: quay.io/3scale/3scale214:apicast-3scale-2.14.1-GA
401c446
<                   value: quay.io/3scale/3scale213:porta-3scale-2.13.1-GA
---
>                   value: quay.io/3scale/3scale214:porta-3scale-2.14.1-GA
403c448
<                   value: quay.io/3scale/3scale213:zync-3scale-2.13.1-GA
---
>                   value: quay.io/3scale/3scale214:zync-3scale-2.14.1-GA
407c452
<                   value: centos/redis-5-centos7
---
>                   value: quay.io/fedora/redis-6:latest
409c454
<                   value: centos/redis-5-centos7
---
>                   value: quay.io/fedora/redis-6:latest
411c456
<                   value: centos/mysql-80-centos7
---
>                   value: quay.io/sclorg/mysql-80-c8s
413c458
<                   value: centos/postgresql-10-centos7
---
>                   value: quay.io/sclorg/postgresql-10-c8s
415c460
<                   value: centos/postgresql-10-centos7
---
>                   value: quay.io/sclorg/postgresql-10-c8s
418c463,465
<                 image: quay.io/3scale/3scale-operator:v0.10.1
---
>                 - name: RELATED_IMAGE_SYSTEM_SEARCHD
>                   value: quay.io/3scale/searchd:latest
>                 image: quay.io/3scale/3scale-operator:v0.11.0
978c1025
<     url: https://github.com/3scale/3scale-operator/blob/v0.10.1/doc/operator-user-guide.md
---
>     url: https://github.com/3scale/3scale-operator/blob/v0.11.0/doc/operator-user-guide.md
989,990c1036,1037
<   version: 0.10.1
<   replaces: 3scale-community-operator.v0.9.0
---
>   version: 0.11.0
>   replaces: 3scale-community-operator.v0.10.1
diff -r 0.10.1/manifests/apps.3scale.net_apimanagers.yaml 0.11.0/manifests/apps.3scale.net_apimanagers.yaml
519a520,523
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
584a589,592
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
616a625,626
>                       priorityClassName:
>                         type: string
641a652,655
>                       serviceCacheSize:
>                         description: ServiceCacheSize specifies the number of services that APICast can store in the internal cache
>                         format: int32
>                         type: integer
663a678,732
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
1149a1219,1222
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
1214a1288,1291
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
1246a1324,1325
>                       priorityClassName:
>                         type: string
1271a1351,1354
>                       serviceCacheSize:
>                         description: ServiceCacheSize specifies the number of services that APICast can store in the internal cache
>                         format: int32
>                         type: integer
1293a1377,1431
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
1773a1912,1921
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
1820a1969,2023
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
2297a2501,2510
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
2344a2558,2612
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
2817a3086,3089
>                   redisAnnotations:
>                     additionalProperties:
>                       type: string
>                     type: object
2819a3092,3095
>                   redisLabels:
>                     additionalProperties:
>                       type: string
>                     type: object
2824a3101,3102
>                   redisPriorityClassName:
>                     type: string
2868a3147,3201
>                   redisTopologySpreadConstraints:
>                     items:
>                       description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                       properties:
>                         labelSelector:
>                           description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                           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
>                           x-kubernetes-map-type: atomic
>                         maxSkew:
>                           description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                           format: int32
>                           type: integer
>                         minDomains:
>                           description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                           format: int32
>                           type: integer
>                         topologyKey:
>                           description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                           type: string
>                         whenUnsatisfiable:
>                           description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                           type: string
>                       required:
>                       - maxSkew
>                       - topologyKey
>                       - whenUnsatisfiable
>                       type: object
>                     type: array
3342a3676,3685
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
3389a3733,3787
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
3920a4319,4322
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
3942a4345,4348
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
3964a4371,4372
>                       priorityClassName:
>                         type: string
4011a4420,4474
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
4489a4953,4956
>                           annotations:
>                             additionalProperties:
>                               type: string
>                             type: object
4491a4959,4962
>                           labels:
>                             additionalProperties:
>                               type: string
>                             type: object
4512a4984,4985
>                           priorityClassName:
>                             type: string
4556a5030,5084
>                           topologySpreadConstraints:
>                             items:
>                               description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                               properties:
>                                 labelSelector:
>                                   description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                                   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
>                                   x-kubernetes-map-type: atomic
>                                 maxSkew:
>                                   description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                                   format: int32
>                                   type: integer
>                                 minDomains:
>                                   description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                                   format: int32
>                                   type: integer
>                                 topologyKey:
>                                   description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                                   type: string
>                                 whenUnsatisfiable:
>                                   description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                                   type: string
>                               required:
>                               - maxSkew
>                               - topologyKey
>                               - whenUnsatisfiable
>                               type: object
>                             type: array
5031a5560,5563
>                           annotations:
>                             additionalProperties:
>                               type: string
>                             type: object
5033a5566,5569
>                           labels:
>                             additionalProperties:
>                               type: string
>                             type: object
5054a5591,5592
>                           priorityClassName:
>                             type: string
5098a5637,5691
>                           topologySpreadConstraints:
>                             items:
>                               description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                               properties:
>                                 labelSelector:
>                                   description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                                   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
>                                   x-kubernetes-map-type: atomic
>                                 maxSkew:
>                                   description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                                   format: int32
>                                   type: integer
>                                 minDomains:
>                                   description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                                   format: int32
>                                   type: integer
>                                 topologyKey:
>                                   description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                                   type: string
>                                 whenUnsatisfiable:
>                                   description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                                   type: string
>                               required:
>                               - maxSkew
>                               - topologyKey
>                               - whenUnsatisfiable
>                               type: object
>                             type: array
5156a5750,5759
>                           sts:
>                             description: STS authentication spec
>                             properties:
>                               audience:
>                                 description: The ID the token is intended for
>                                 type: string
>                               enabled:
>                                 description: Enable Secure Token Service for  short-term, limited-privilege security credentials
>                                 type: boolean
>                             type: object
5634a6238,6241
>                   memcachedAnnotations:
>                     additionalProperties:
>                       type: string
>                     type: object
5636a6244,6249
>                   memcachedLabels:
>                     additionalProperties:
>                       type: string
>                     type: object
>                   memcachedPriorityClassName:
>                     type: string
5680a6294,6348
>                   memcachedTopologySpreadConstraints:
>                     items:
>                       description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                       properties:
>                         labelSelector:
>                           description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                           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
>                           x-kubernetes-map-type: atomic
>                         maxSkew:
>                           description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                           format: int32
>                           type: integer
>                         minDomains:
>                           description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                           format: int32
>                           type: integer
>                         topologyKey:
>                           description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                           type: string
>                         whenUnsatisfiable:
>                           description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                           type: string
>                       required:
>                       - maxSkew
>                       - topologyKey
>                       - whenUnsatisfiable
>                       type: object
>                     type: array
6152a6821,6824
>                   redisAnnotations:
>                     additionalProperties:
>                       type: string
>                     type: object
6154a6827,6830
>                   redisLabels:
>                     additionalProperties:
>                       type: string
>                     type: object
6159a6836,6837
>                   redisPriorityClassName:
>                     type: string
6203a6882,7543
>                   redisTopologySpreadConstraints:
>                     items:
>                       description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                       properties:
>                         labelSelector:
>                           description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                           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
>                           x-kubernetes-map-type: atomic
>                         maxSkew:
>                           description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                           format: int32
>                           type: integer
>                         minDomains:
>                           description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                           format: int32
>                           type: integer
>                         topologyKey:
>                           description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                           type: string
>                         whenUnsatisfiable:
>                           description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                           type: string
>                       required:
>                       - maxSkew
>                       - topologyKey
>                       - whenUnsatisfiable
>                       type: object
>                     type: array
>                   searchdSpec:
>                     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
>                                       x-kubernetes-map-type: atomic
>                                     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
>                                       x-kubernetes-map-type: atomic
>                                     type: array
>                                 required:
>                                 - nodeSelectorTerms
>                                 type: object
>                                 x-kubernetes-map-type: atomic
>                             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
>                                           x-kubernetes-map-type: atomic
>                                         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.
>                                           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
>                                           x-kubernetes-map-type: atomic
>                                         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
>                                       x-kubernetes-map-type: atomic
>                                     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.
>                                       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
>                                       x-kubernetes-map-type: atomic
>                                     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
>                                           x-kubernetes-map-type: atomic
>                                         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.
>                                           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
>                                           x-kubernetes-map-type: atomic
>                                         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
>                                       x-kubernetes-map-type: atomic
>                                     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.
>                                       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
>                                       x-kubernetes-map-type: atomic
>                                     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
>                       image:
>                         type: string
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       persistentVolumeClaim:
>                         properties:
>                           resources:
>                             description: Resources represents the minimum resources the volume should have. Ignored when VolumeName field is set
>                             properties:
>                               requests:
>                                 anyOf:
>                                 - type: integer
>                                 - type: string
>                                 description: 'Storage Resource requests to be used on the PersistentVolumeClaim. To learn more about resource requests see: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
>                                 pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
>                                 x-kubernetes-int-or-string: true
>                             required:
>                             - requests
>                             type: object
>                           storageClassName:
>                             type: string
>                           volumeName:
>                             description: VolumeName is the binding reference to the PersistentVolume backing this claim.
>                             type: string
>                         type: object
>                       priorityClassName:
>                         type: string
>                       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:
>                         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
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
>                     type: object
6677a8018,8027
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
6724a8075,8129
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
6726a8132
>                     description: Deprecated
7199a8606,8607
>                       priorityClassName:
>                         type: string
7243a8652,8706
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
7726a9190,9199
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
7773a9247,9301
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
>                           type: object
>                         type: array
8246a9775,9784
>                   databaseAnnotations:
>                     additionalProperties:
>                       type: string
>                     type: object
>                   databaseLabels:
>                     additionalProperties:
>                       type: string
>                     type: object
>                   databasePriorityClassName:
>                     type: string
8290a9829,9883
>                   databaseTopologySpreadConstraints:
>                     items:
>                       description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                       properties:
>                         labelSelector:
>                           description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                           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
>                           x-kubernetes-map-type: atomic
>                         maxSkew:
>                           description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                           format: int32
>                           type: integer
>                         minDomains:
>                           description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                           format: int32
>                           type: integer
>                         topologyKey:
>                           description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                           type: string
>                         whenUnsatisfiable:
>                           description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                           type: string
>                       required:
>                       - maxSkew
>                       - topologyKey
>                       - whenUnsatisfiable
>                       type: object
>                     type: array
8768a10362,10371
>                       annotations:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       labels:
>                         additionalProperties:
>                           type: string
>                         type: object
>                       priorityClassName:
>                         type: string
8813a10417,10471
>                           type: object
>                         type: array
>                       topologySpreadConstraints:
>                         items:
>                           description: TopologySpreadConstraint specifies how to spread matching pods among the given topology.
>                           properties:
>                             labelSelector:
>                               description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain.
>                               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
>                               x-kubernetes-map-type: atomic
>                             maxSkew:
>                               description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | |  P P  |  P P  |   P   | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
>                               format: int32
>                               type: integer
>                             minDomains:
>                               description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | |  P P  |  P P  |  P P  | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
>                               format: int32
>                               type: integer
>                             topologyKey:
>                               description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each <key, value> as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
>                               type: string
>                             whenUnsatisfiable:
>                               description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P |   P   |   P   | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
>                               type: string
>                           required:
>                           - maxSkew
>                           - topologyKey
>                           - whenUnsatisfiable
Only in 0.11.0/manifests: capabilities.3scale.net_applications.yaml
diff -r 0.10.1/manifests/capabilities.3scale.net_openapis.yaml 0.11.0/manifests/capabilities.3scale.net_openapis.yaml
34a35,148
>               oidc:
>                 description: OIDCSpec defines the desired configuration of OpenID Connect Authentication
>                 properties:
>                   authenticationFlow:
>                     description: AuthenticationFlow specifies OAuth2.0 authorization grant type
>                     properties:
>                       directAccessGrantsEnabled:
>                         type: boolean
>                       implicitFlowEnabled:
>                         type: boolean
>                       serviceAccountsEnabled:
>                         type: boolean
>                       standardFlowEnabled:
>                         description: OIDCIssuer is the OIDC issuer
>                         type: boolean
>                     required:
>                     - directAccessGrantsEnabled
>                     - implicitFlowEnabled
>                     - serviceAccountsEnabled
>                     - standardFlowEnabled
>                     type: object
>                   credentials:
>                     description: 'Credentials Location available options: headers: As HTTP Headers query: As query parameters (GET) or body parameters (POST/PUT/DELETE) authorization: As HTTP Basic Authentication'
>                     enum:
>                     - headers
>                     - query
>                     - authorization
>                     type: string
>                   gatewayResponse:
>                     description: GatewayResponseSpec defines the desired gateway response configuration
>                     properties:
>                       errorAuthFailed:
>                         description: ErrorAuthFailed specifies the response body when authentication fails
>                         type: string
>                       errorAuthMissing:
>                         description: ErrorAuthMissing specifies the response body when authentication is missing
>                         type: string
>                       errorHeadersAuthFailed:
>                         description: ErrorHeadersAuthFailed specifies the Content-Type header when authentication fails
>                         type: string
>                       errorHeadersAuthMissing:
>                         description: ErrorHeadersAuthMissing specifies the Content-Type header when authentication is missing
>                         type: string
>                       errorHeadersLimitsExceeded:
>                         description: ErrorHeadersLimitsExceeded specifies the Content-Type header when usage limit exceeded
>                         type: string
>                       errorHeadersNoMatch:
>                         description: ErrorHeadersNoMatch specifies the Content-Type header when no match error
>                         type: string
>                       errorLimitsExceeded:
>                         description: ErrorLimitsExceeded specifies the response body when usage limit exceeded
>                         type: string
>                       errorNoMatch:
>                         description: ErrorNoMatch specifies the response body when no match error
>                         type: string
>                       errorStatusAuthFailed:
>                         description: ErrorStatusAuthFailed specifies the response code when authentication fails
>                         format: int32
>                         type: integer
>                       errorStatusAuthMissing:
>                         description: ErrorStatusAuthMissing specifies the response code when authentication is missing
>                         format: int32
>                         type: integer
>                       errorStatusLimitsExceeded:
>                         description: ErrorStatusLimitsExceeded specifies the response code when usage limit exceeded
>                         format: int32
>                         type: integer
>                       errorStatusNoMatch:
>                         description: ErrorStatusNoMatch specifies the response code when no match error
>                         format: int32
>                         type: integer
>                     type: object
>                   issuerEndpoint:
>                     description: Issuer is the OIDC issuer
>                     type: string
>                   issuerEndpointRef:
>                     description: IssuerEndpointRef  is the reference to OIDC issuer Secret that contains IssuerEndpoint
>                     properties:
>                       name:
>                         description: name is unique within a namespace to reference a secret resource.
>                         type: string
>                       namespace:
>                         description: namespace defines the space within which the secret name must be unique.
>                         type: string
>                     type: object
>                     x-kubernetes-map-type: atomic
>                   issuerType:
>                     description: IssuerType is the type of the OIDC issuer
>                     enum:
>                     - keycloak
>                     - rest
>                     type: string
>                   jwtClaimWithClientID:
>                     description: JwtClaimWithClientID is the JSON Web Token (JWT) Claim with ClientID that contains the clientID. Defaults to 'azp'.
>                     type: string
>                   jwtClaimWithClientIDType:
>                     description: JwtClaimWithClientIDType sets to process the ClientID Token Claim value as a string or as a liquid template.
>                     enum:
>                     - plain
>                     - liquid
>                     type: string
>                   security:
>                     description: SecuritySpec defines the desired state of Authentication Security
>                     properties:
>                       hostHeader:
>                         description: HostHeader Lets you define a custom Host request header. This is needed if your API backend only accepts traffic from a specific host.
>                         type: string
>                       secretToken:
>                         description: SecretToken Enables you to block any direct developer requests to your API backend; each 3scale API gateway call to your API backend contains a request header called X-3scale-proxy-secret-token. The value of this header can be set by you here. It's up to you ensure your backend only allows calls with this secret header.
>                         type: string
>                     type: object
>                 required:
>                 - issuerType
>                 type: object
diff -r 0.10.1/manifests/capabilities.3scale.net_products.yaml 0.11.0/manifests/capabilities.3scale.net_products.yaml
310a311,321
>                               issuerEndpointRef:
>                                 description: IssuerEndpointRef  is the reference to OIDC issuer Secret that contains IssuerEndpoint
>                                 properties:
>                                   name:
>                                     description: name is unique within a namespace to reference a secret resource.
>                                     type: string
>                                   namespace:
>                                     description: namespace defines the space within which the secret name must be unique.
>                                     type: string
>                                 type: object
>                                 x-kubernetes-map-type: atomic
337d347
<                             - issuerEndpoint
567a578,588
>                               issuerEndpointRef:
>                                 description: IssuerEndpointRef  is the reference to OIDC issuer Secret that contains IssuerEndpoint
>                                 properties:
>                                   name:
>                                     description: name is unique within a namespace to reference a secret resource.
>                                     type: string
>                                   namespace:
>                                     description: namespace defines the space within which the secret name must be unique.
>                                     type: string
>                                 type: object
>                                 x-kubernetes-map-type: atomic
594d614
<                             - issuerEndpoint
748a769,779
>                     configurationRef:
>                       description: ConfigurationRef Secret reference containing policy configuration
>                       properties:
>                         name:
>                           description: name is unique within a namespace to reference a secret resource.
>                           type: string
>                         namespace:
>                           description: namespace defines the space within which the secret name must be unique.
>                           type: string
>                       type: object
>                       x-kubernetes-map-type: atomic
759d789
<                   - configuration
diff -r 0.10.1/metadata/annotations.yaml 0.11.0/metadata/annotations.yaml
2,3c2,3
<   operators.operatorframework.io.bundle.channels.v1: threescale-2.13
<   operators.operatorframework.io.bundle.channel.default.v1: threescale-2.13
---
>   operators.operatorframework.io.bundle.channels.v1: threescale-2.14
>   operators.operatorframework.io.bundle.channel.default.v1: threescale-2.14
11d10
<   com.redhat.openshift.versions: v4.9

Issues to address:

  • [x] - name: RELATED_IMAGE_SYSTEM_SEARCHD > value: quay.io/3scale/searchd:latest -> pin that to non floating tag
  • [x] quay.io/fedora/redis-6:latest -> pin that to non floating tag
  • [x] Run fresh install with the latest manifests
  • [x] Run upgrade test from v0.10.1

eguzki avatar Apr 24 '24 13:04 eguzki

Some of these updates should be done in master as well, like the CSV description. So, future releases do not need to update it.

eguzki avatar Apr 24 '24 14:04 eguzki

@valerymo no strong preference but I think we could drop the olm.maxOpenshiftVersion flag from the CSV of community release.

MStokluska avatar Apr 25 '24 07:04 MStokluska

@valerymo no strong preference but I think we could drop the olm.maxOpenshiftVersion flag from the CSV of community release.

Why drop it? the more control we have the better, right?

eguzki avatar Apr 25 '24 08:04 eguzki

@valerymo you did some changes directly to the bundle dir. Remember that most of bundle dir contents are autogenerated and there is a test to make sure the source of truth is updated as well. That test is failing.

You need to do those changes in the source of truth, not in bundle dir. The changes that will be lost:

git diff --exit-code ./bundle
diff --git a/bundle/manifests/3scale-operator.clusterserviceversion.yaml b/bundle/manifests/3scale-operator.clusterserviceversion.yaml
index a87d7c16..060fe173 100644
--- a/bundle/manifests/3scale-operator.clusterserviceversion.yaml
+++ b/bundle/manifests/3scale-operator.clusterserviceversion.yaml
@@ -202,7 +202,7 @@ metadata:
     capabilities: Deep Insights
     categories: Integration & Delivery
     certified: "false"
-    containerImage: quay.io/3scale/3scale-operator:v0.11.0
+    containerImage: quay.io/3scale/3scale-operator:master
     createdAt: "2019-05-30T22:40:00Z"
     description: 3scale Operator to provision 3scale and publish/manage API
     olm.properties: '[{"type": "olm.maxOpenShiftVersion", "value": "4.15"}]'
@@ -217,7 +217,7 @@ metadata:
     operatorframework.io/arch.amd64: supported
     operatorframework.io/arch.ppc64le: supported
     operatorframework.io/arch.s390x: supported
-  name: 3scale-community-operator.v0.11.0
+  name: 3scale-operator.v0.0.1
   namespace: placeholder
 spec:
   apiservicedefinitions: {}
@@ -317,9 +317,9 @@ spec:
       name: tenants.capabilities.3scale.net
       version: v1alpha1
   description: |
-    The 3scale community Operator creates and maintains the Red Hat 3scale API Management on [OpenShift](https://www.openshift.com/) in various deployment configurations.
+    The 3scale Operator creates and maintains the Red Hat 3scale API Management on [OpenShift](https://www.openshift.com/) in various deployment configurations.
 
-    3scale API Management makes it easy to manage your APIs.
+    [3scale API Management](https://www.redhat.com/en/technologies/jboss-middleware/3scale) makes it easy to manage your APIs.
     Share, secure, distribute, control, and monetize your APIs on an infrastructure platform built for performance, customer control, and future growth.
 
     ### Supported Features
@@ -329,7 +329,7 @@ spec:
     * **Capabilities** Ability to define 3scale API definitions and set them into a 3scale API Management solution
 
     ### Documentation
-    Documentation can be found on our [website](https://github.com/3scale/3scale-operator/blob/v0.11.0/doc/operator-user-guide.md).
+    Documentation can be found on our [website](https://github.com/3scale/3scale-operator/blob/master/doc/operator-user-guide.md).
 
     ### Getting help
     If you encounter any issues while using 3scale operator, you can create an issue on our [Github repo](https://github.com/3scale/3scale-operator) for bugs, enhancements, or other requests.
@@ -346,7 +346,7 @@ spec:
 
     ### License
     3scale Operator is licensed under the [Apache 2.0 license](https://github.com/3scale/3scale-operator/blob/master/LICENSE)
-  displayName: 3scale API Management
+  displayName: 3scale (development latest)
   icon:
   - base64data: iVBORw0KGgoAAAANSUhEUgAAAOsAAADoCAYAAAAOnhN7AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACC2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KD0UqkwAAPCdJREFUeAHtfc1y20i2JinZVa7pDSumerYNPUB3UU9gajezMr3r7uoIk09gaTdd90aIjJiovjtLTyA4+ndWop9A9BOIFf0Awt12dYfZi7ltV9nifB+dUIEQkDj5AxAkkREggcxzTp48mSfPyR8k2q0m1FoCv/nNb3q3t7fPwGQPV4ArGaLFYjHBdf6Xv/wlSiY099sngfb2FWk7SvTLX/4yaLfbF7h6whKFn3zyyUkYhnMhfAO2YRJolLWGFfarX/2qT0UFax1D9qioR3/6059mhngN+AZIoFHWmlWScnuvHNgSK6zKq4e8vsT1LdztsHGnHSRfMmqjrCUL2IQ8Xd+9vb1r4Jha1HQ2EVziQ51L/Otf/5qWe5BGxPMYlnmUEd9ErVkCe2vOv8k+IQEo6ikeXRWVFIN3796RVmaAoo6QMMhMbLVO6YbnpDXRa5RAY1kdhI9G3wX6XcPGrOzsz3/+88SGpLKqNza4eTiwrp9nWVfw/QY4nTw8xM9gXQ816U3SGiTwYA15bnyW8UwtCtJLFgaTQi0oQoS4p6aTPLCqgyQtH/c//PADaZ4laalxqk5RCd5N4jT39ZBA4wYb1kM8rtQsqQQgeaWsrpg6rPJjMbAQsAyawqwbsBIk0FhWQ6EKl1RouS5xHUjJg24Z1uwezT/84Q9TdCRz8EUe88IsL8Emnh3c/v5+H53Hl7i4fsz8v8U1MfVAbPLfFpzGshrUpHJ/e0KUwHCiRqc8wizvgQX3Yj5GnOfEL6OhUGNdujRtMBh0IIMXcPFvQPMF8AbKI+njnhNg10i/olxx34QCCTTKWiCgZDKtQ/K56L4ka1mUbWG6WpoJcwDHtpNkSXpU1O+///4KMjhOxqfvqbxcrjIdNqTp7MJzo6wGtQzrYGT9AG8yDo0MWJGCzvIAobBDKMkR0sfgc8p/bIo4UIqchyaKjxUVwF0RwkeXvLGwBcJqxqwFAkomwwrM0bCTUdp7wL/WAqwmUrGC1Sjnp0hHgeNXpPPyGmBRj0FQqqhx3h3I6wIP7ECakCGBxrJmCCUvSlmgvOSs+CgrMivOULGzSGTFvcqKrCDuuU0ekEGvcYfzJbcTllU1gH4sBijd7NNPP51mbRiIYbL+OXOJCZEpG1VWeiouAnyYist9fPjwYQiLxEkYX2GOTRETX8SkdITruDpyrKeZDmBX07ZaWVXDoWsVJCsYytaCYsyhxOdo0GcmSgtFHwL/GvQ6SZqp+zmen6bitI/kAfyMAXSqBZQnnpuUS05WD4lxb08PUZj6ZSHEjgJsrRuMhj9Cw7lCvQY5dUtlO+WMJSdEcmDuRau3Ujiumt1L/BgR4c/qNTV2HMAlvmvgdsGRK5F14KMzFNfFOvhbZ55baVmhqAMIVWqhulRYwB9KK4LuMOETr5gtUeleuyx7KOtKi0x+bBvtDErPzmQjA7yW+UYyXgHT7QryqDSLeDsgMjVt7LV5NQydTRf8X+IKcJmEpaKuw/2NmVQdGDsb21CberAtQFl4W2dZ1YZ4U0WlfJ/jGvFm3YGWG675IV9zg6U5FvAzB8x5HVxf4XbG3CLxBfjcxESC2k3GOmPH1lIW+RVkEPJ5G8PWWVZYpWtU1LICTSuMmwTU2qMpamnwHE/z7Rm42I85nkOj7CEzHpQW4T7C/esyG2ja1adSfPjwYaI7UYLzBeBLOgwB6F3gXuHCibkC+jNQG4IO/7cqbKOyLhxqiJUcOuBvDSr3NUMxX6BAQU6hJrCCJ3lKa9FpcqnpoMiF/+qrr47RUZEvXRDR0hGoY9rWzgbbCBuNs2ODt204UDSeqniJcgWasvV1e3rVJJfUus2Rz1GRotLLgKJKLDb3JRcptKZo9UzaRmVlxVsFNFBp47KivwlIfEsGfA6EvHYAl/nuLhUPXgpn2Me4dHXCI1QPJG4rFLAPWsxTEgi7VWHrJphQO1NcVhX14MGD2VbVrmFh1Pj02BCtA/gLXJlLX1DCESziGSbLeugMuwnaPNRtUmRNE/C8DVLPukfytVVh65QVrtk5xlJ9i1pCu9ntA7Iht+cWciNKF67zIG+8r+Q6ARyvJlhKYOvcYM7mYlwzNZTHHA2V7tquB5tOLpbZk/imrH9Y5rkBbRNYA7LrA62tZeU6GtzSgKKhe2pi9bBJ/6naldSViBbKPcyb1ZTgbwOMcoFdiiKStUsGXDKC5ySdOJq45FVH3HadmFLLBc/AUw9XJ8VbhOcpKuulZC2UM4cYJ12iN+6l6CQfI9AbSuglkepyr3ZrLddgY55QnldF66AxbPLfw86jFtzg0tsTJ8BQp8dJ3jPu6SkdblsHXLpwMwR5LwrjnS7XzgoU6w6Pbq7UGqpGyA6APT+vCNcM10bvdhE02jEnd1BOUfCgrHwl8ECUmSMQl5ZAYpBDZo74I/DCOt6qsHZl5cQEJErhm4atrZQiQRQ01iR6iEY7TEbk3dMTwdDhTV66IF60+0hARwSiOhdOiPVwdXBROV9hhtnolUfgbExYq7I6KGos4J1TWMhshMKfxgIo+ocH8lT6JhCsNQ846xXRzElvdn/lCMZX9Npmg9HouiiEdLIgr7zsUS9pFfIAtilelZPWRBygfCYyPhcTXgXk9r7JalTz5FsCa1NWjlFRGB9KFsB9O/YtmDrSM9zBExchUB1j/Jz7ryxwmAuQk8D5A5PZ+hwyTXSBBNairBxvOLhbWUV6viPWNcgqfFEcZojFnSIs5AmUb1pEM5E+lLrZCZzm1kICa1lnxbQ6Z2d9Bk6O9EEw9ElUQktNzDDvJ7i6uAJcy6Aa/Qwd08tNmZ1UFvJIjY3pcucpuvdlL+UBUJbLAPk5nbwR09mW/7UoK4TXK0GAj0EzLIFuLkk2aHQSuQ1aeQ89EDjG5M0UzyeborTgc4SO6IydIJTmS5SBHVELZXgNSz31uTbNDo9r4iDfYx5xQF7WX+WLaWzT/1pmg9HIF76FSCsGd+zIN90sesqaXiFt2YCzYDRx1rOmyvJca2hnJsG1zfxOayZwxZFCWc7B1launZqIe12W1YTHWsEKG5eO5wsoHXf7hDqgrDRaZeBGSAuy0nPiTN9sySFTTjQs9wtQLur0+B4r4UrtjFm3PJUDw7QnsOrkqYNrhivCtfZNNGuZYELBNzYod62ocRWV7wJucb8IKCe98NiTBB633Z0knut4O5AwBeUp9bR+dIIc0tywU2Be4ImKysC6Zl2xk73h5Cju1xIaZTUQO48UURVpgJUNCjov2JNnp+bHqjHvEBDzfKhlCtNzj10pwK0k2bTh+5J9unBQwgvEneIqqo8AnR9fth+kaVTxvBZl5fjSd+FQka9900zTA9+sUF8hoMtlQ0y50HQJJ1n4Sr4c44VZ6Zsah3IVKZNx0bjHGkgDQ0QXz8gwqx/B16KsfDPkRxa83WU2XF/UldvqtbGg8T235Y8WFtdT9PQHoEPXeIxryGdOtDHdlnZVeO/fv48M8zKF15JX6/3HWqCcRBiHCxvPKIecKHotE0yG7yVKCsI3PkptnKicJxJGDGECvubm8iqXwo2Q78Qw77WDk3e4lKy3roQZ31sa0Q55LrMk6yyY5WQUEs6yEsuIW4tlVQ2MlsBLgGUpfRIFeQRemE0RiV+wT0XvzCO8LFHdQf5e36ahVYSi9lwEDS+mjA48l6W1KCu5QS/JHom9qmuYVLHdDRUr6v1NC4MK75nibBO82lwx1JUJiso1dJFS6+gk0+CCO9enq7In+ZHcr01Zua0NDZVjrbmE0RwYfttFW9E5eDbRHRukBqdYAhjChLCwR1TKFHQEhTiparNLKu/aPa5lzBpLge4w3JEDrG/Z7AaaUFErfNtjBr6de+O47In/KHG/s7fKwk4pAE78mJ67tQuCW6uyUsBK2Q7VZxEka138zgt720nFFRQhP+/KCotCuk1ISMDnvuME2TJu52UQzaNpPRWWR9A1Xi2RPAadFcWAO/QacTw6ZOaahw2+8BsrpqR5av3nJkiYPaVc+rh+pvD+E/9rk4viYSP/IMs3YLzjwDzlzqFcJWHtljVdSmUxJ+n4dT+XsNzEIonLydlLDBcugENFTYdTdHJTHsFa4bAgzcMmPlP+A1vG4RWd2+La4K1tgsmG2XXiqOWm0CcPmGAbS+gpRb0CbJaiLklwZpJ7W7luK6HZwLRaSv5zG1lwMqxqd712ltVUcGqfJte7erg6uCJcU1aEUjA8+gmkid6UCsN8nAIq+0zKnzr/uCvIsAP+LgF3KIDdaBB2YJALTxxZkQvKL1Yiyh8eyRA0KDOTMKcXY4LgA7Z2Y1ZpoVRlXdKi5OEg7eSPf/zjWV66TTzH1BaVm86KS06FnzgkkmV+1u/Mphnlc/IwcZSdytFhPK0Lnjnh96qqCT/FyymyH5CHnDBH/DnX8iXDAtXhvwDOslw5NOPoGW4oX/5XGkpRViXQHkoSqNJ4nwCBgK9Bu6vo6/68NlxmpCqX40ebIFZUEkdezGfAe4PgZeKD9Qhl5Ldae4K8S5+lhyxG4IOKKg1zdCSiM6IEZZ0jU3EHIGXQBM67ssIS8H3A4wwm2BN56ZEMlaWUTymAB3YUdJ8CXKJA1xfu01jS28cEIU+bs3ydT8dXMpZam5hd/osPFk8iFd2DH5tOKyYr7rAzDA09iBnqbWpSb3HGPv+9KqtAoOydjlxdCORzAzqBVBDoPLy7w3HeqlE/xzOVNyuwzBPbMbSlss5Nl4SSjKsyUTmsAhq31yN2BO1KwqdYYSXE1gHjbTaYYysUYFBQiPh4jgKwwuSgECIBAEV5knj0eguloCU5RB4HmNw4YseADMZosE/5TKXBVelX6mgJbAsJxWCnY62ozBcy6NHDsuUhiSdsV0mUvPsLWs28xE2I9zYbjAp6JikwK5JCk86EpmlyKxoUIx299mdVngiMTH0yA4V/BeXrGdK0Vlbk46SoMZ+o52PU1SvX5Q3Q8cIP+YIs2YGUNourXOgB6utxLAf+owyv8ec8b+PNsoKZHi5RcHktjHtGRZlsCRA3Y6Aoc5PioLGcm8DHsMr97cbPrv98X9SFhuKn40Ijhdsvw7qSJocr6AxukB/fke0lL8bhuiYMjQ3urYJPZfUp1NzCqEF+lAuQkaB6toyU+kfRYoP/sQGnLuvLXocLbLCOyuGVH8pwf3+/byDLQlB2KFDSa5a1CJgw8Aqtz3DypqzozadFzHpMf2lCCwIKTeDrBqvWigsVFnVwhvHxyIF/rw2ZfKAh9/hvGXqWeLloaRc1F1CQoMbTFwA1NVQ8KXEgyGIFxJuyoteQKlDkOo5RDXK2UpKcB/BV6xP+cti+F80yo+EfIWFyLxFxTMPGBE5uWQUX96wgw6AgXZdsqgQ6Wss0KKsXmvQY0LaoqLbhwlTm3iaY0JhC9BbPwXlXxz2EZd2gknS5A0jwHuzY9w6mJA9V36tObsp8IesuFLTj2vFVUIYvK8ij8iwge45DnRRfjemnUua9WVZmSAWCMuoyF+0mkTDPsSs6iEPADlN5zhEX0tIoCywht3EwKNtsAxSVGwqcGnQdK4ZbXcHXwJU3jmHZ6UrpeLOszFBN/hzRlwcjzxIVNcP9ue1yja4wtOjMWgfjI+3N/34UvH/QCmJaDx48mn0+mrNjaIJGAmgHrzXJRUmULxXDWwA/znUGj67vjaGPb1LNJPS8KmucYV3fSY35k/z/7eufdNuL98/arXa31W71PgCpnVje/fD929bfv36E3eyt6aLder1o7U/+xzf/TyR0Sf5Vw9BKo5f3nq2jckzBkE/FiNc8XcsZuBKI8WHEHsf3Rf9e3eCizDYhHQo4wHWz1/rA6fhjKqqWb6S3sY5G+H98/ek18bXw9U703tmodWLbUr+yRczDc+QnJruWcXijrEr8tKRUNjxyhi9Q0UZ/C1ph4P/9t4+uSM8IuR7A5z7ZgNWYugx91BAn8shT6MKPRz6sSDXKCrH9498+O6ZlVMpmJcgVJFhb0ts0K4sJwgnKMV8pi8MDNiCMHdCXqFB4L6sHIMa3r5z5UeX51rVcNvg7r6xQqAs0iBc2whPgXJC+AK4WIJwghCyGnpiZ+JitVvMfoStPLJdHqxq58hPjm0zAtWOkuvxzWjx5XAeWYMTHdJiWQSnSwBTPFB4N5eynv3vny0KYZm8Mj9n8vHeSpbSMXrCXEMXkFzu9gQQ2A8br63Fso5gRfpORj03UIZfhJIi1UlbN2cERCvNUWihJwen6lmhRs1gYfvHN2zAroY5xtgoLmZZ2yiIUdgRZnRrIK0JnP/Rh4dN5OnYeS3KUFTyHozTtvOfauMGsCKU8nQxmA8RxA3Q3I804ipM/FSsqeFy84FqtMbNrQuDWRcjoKbKPhCxwrDtm41Pr7UI0ORg66xHGnQfACHExv7zAlx9OMAY/LENRmSlo01PS8ZDH2108ebx7ENxYW1bua0RlstHP0Xs57fflPkvQuBHw63xcCfPgrK+3ySQB03cgWJP94ndvxT3pHR5uKG8sOzzB7V2HhcqO8PxazZritpyATnIAysy7h6uDKw4c485Qd68ePnwIHQ2dGm9MVPpPmUB5A8Dz4m6pGS+PY1OSzQ3KeFwBICmTXPhUgrFrbqSsajzJ9/UGGQyyos7Z++HfKJi4XGgYRy69pZqhvTBi0CPwYq919NP/83YqJckGgQbIMWRPgxMBZh2fFNGwtBtJlgprrKiUptgNVoNqHt51DLysnoRxp2D+mrAkbhC6Ulj0pD0pbA7caU58JdHtD/IxF2Q5AFOSA9P4BsglO71KCtFkcicBzqPAJT5ARHgXmXODDnWKJE4ohTkg2mixsgrecIkz6vJQ6vihTv9qo0KwVp6wBisZu6oem8on7vjYkSoFX2sRdy1zuv9QwCHH06gDjkNDKqZSzgnjmMbxPJXbVj6ivcGqAYitH5jj2wQDaQ8C+LlBASID2BVQ7vXF5tCVuHU83O63+8j3rCBvuuqdApis5BeYA3DaOZRF1Gfc8qWIvdagvWg9brcXHc4ftFscb7bn3Gf94LYVfv4fbyOfeVZBS42Vi+rVmhWpZX1ukcMTA5xXUli1y0YKvgK3B6u2ErGmh8XtQisbuLNU5q4lex2M6weWuKWiUUm5FfPDXusGXeYp913HE33LfzwznukbvGWzNBlKldWm4bDBiYKywDMBsNEB2Wl6ccNIx1f+3F5o5QlPQ6vMAn5d8QVZmIFwYu/D3uKaCirCBNwmbtkUlc0SqNANVmMnS/JyNFjMopMfeD7vSE5xFZK9Ol9zq0dodwr40CpzAS6TXfEFWchBfpyBtxqCcMtmy8eGErXp5llCPnPcT+GJnLusMMgl4QZZaFmhRJFbFjJsNUg/BPTy5IfEAD0+9WEoo5QNlXxxPBui2tjv/v1RT5NjrZRNw2dhkionx98uAW8y/be+LQEaHFzXaFMvQCMp2w6e+5j84YabC4tVDFuWrPAKLSuVCAWZgzoLZhJmJsAxrHKJw/h5R/9t5F07Ub0ZdTp4Sd9VUT+Wq/3hAvSmpqdzxEuOIFLUfgdY8WBeTkbhI7Pl/BZaVpXtxCJ78aSRBe2tRoEFsOroEkKhsq89vP/+7TGYCPww0u4oekbkoIC0ph0h0gCGaSCErRxMpKxwE8aGnM3hPp8Z4pQKvrjdr0UDjgup28XE7XsxnOX/1BLPK1q71eL40FswpacOGB8YMvDcEL4ycJGyqvWjoZQrWIZh1ftEi3jbpPORXI8e4YRJkTzKTlcbPwLP+QQmJ3BYnr7fVUrumXV3coVj1jgLjiWx/jfHsgLHIHluRWmvJMV8uPwvF95b7a4LDS+42NCvo8POEe4YvZlTHVxWGifm6jCz+aG9BzknTpjLYtYiDss5rL+ZBBWy6Ejg0jDqW0xROt70Wb1oQEvdwxXzMsf9BB3qS9N6EllWEF8GbJeawL09gMKeIGLChsGL97iGSCvtlSTQdw63BUrinIGQAHfpFIFymUrJtgg0mT7HR3+fJiPWdb9o33bLyHvhbQxcBnc/0uQ+bc4yI6aPq/NjyvJ+wDTTvdxiyxpnptzbMzzz2qjQbu1DSW6P1800jy2V8MC9pFxSAOxAAO/9dAZBnnUHiWwYNLV46TyohDBohe2MMKjff0r3Dxgra5qxTXr+4nf/NcECewSeg3XxTVfcZPyMihzCnXqJnpjuVD+D7xni+GpimJEmiuIYjeM7WPLHuDoxEhoTPQCr74q25S+tx9mJ/vcM9pHD05tgNpidnUmYmACnYZXre5yO1zzzTTWRjHdKWZXAxvg3rUCNrM2SsOXRePJH9fRTrhm+f/++G+fIb9W6TOSRnlraGEBJl2ShoDF5/vdwncJSTBF/gg5hxkhJwHu7UfJQdAmOBOa2LV/WomzA+xktmIQ2YVwn51SnKs0uhmNHPIwf8v5XaiYPaNviYV1vUKag6nLRqv73b94dVp1vVn7ozan0V7g6WekZcXPEUWHDjLTMqL9//ekbfMdASj+TxmrkYv7FN+8+X43TP6kOieVkebWBHZLrh8wg14+9njane4l8xa6wXEYTTPey2NAI9PqFvVgZRbvdMztzpwweSNNCUYlGpbuAperzQRbaExmcFMqcHq0r3OEj5KDjZY70oauiSkuRAdfJiLsXtZPKyg0JcPvO7kmjxAh0t2PdRogSs84ifYFIUQNJI8P6iPfQ7t+2xml8l2dbelRYWK6nyPuQ9Y7rbhWD1pQrHCYeg0sZXHB3ccy6lBfP8YWbFsBN67sIUIgb/vSbtyMhbKlgsKoDZNB1yITj3GPgj4po8AXy7377qdGYMY8mOzvXF9KhkDPQ51W3MJcwtJOWNRbM/iefwR1eTOLnkv5DvN61Frc7pzxPcuJNojkhIgrsFDlWFwHnA9Wms8tn8S7Fpj2JcGptWbmkwN0kmGHrQRTcHeV05OmdONWNeoPjKXp/0bpYGr/omS5XDU/i7xfxLUjvcIlCuh6598lnRx++/xdcbysvpm6dnVY8nE1GezWSMXczaYmqxLYEKIZJLh1IKyrGNflnQ8D+2FOMJ3oZeHPEnWOcceaybJGmu3xfsn37AvFBOs3iOeIkVo3GqMsiqDXAK4vyZKEYH6f58SsIt6fCGeKotdg74dp4VuZ1jsNQAx2TaCNLix06Nr+cSMqjVVYq5w8//MCtUU80ijNFRq98DdANChoh36dqHIJb98D3L/kaFtw2uHlWSw7RotV6WZfxaVoinpV1DNmP0nkUPVPGtz+8GyzPobp3xMuCHfEUsn/l42SIIl7KSlfLRVRYrYU1UVTymqmszAzHidKyHRsUiJv8xy7T3waKGrPFz/gdlnECuzqK5DHGtBC4VnEjMDOFFXhVdyvgU1lR185rknElbuu/mszj+L6bKiM38hsfJXNPWZEBCV/iClIZiB45Lc7N5KYuKtfv0ACYr1FgftxDa4RkCLw8OvPBfXk8ePBoZnpygWHW3sFRvzD+7gGNzenLCO4cbBYFdpTYfRa5GJYVZVU9wQuIoeMoijnwjQ40Rt43wAls8oXCPuUbQTa4u4YDOV+jzOyQnQJc4JW240SsQRZJ4G7pBpXICvShqMy4g0u8eM5eB/ABLqsAi/zMCnE3kc49FDv0QKMhYSiBpbJyjAo8uqD89xW60jce1NKMS749F+RdwlUTgZFDmTlPMHbAb1AtJbBUVrUjJbCkoUPrK6upg/GR5rOT8cFP3Wlw651tOHEZd9lm2uDhjSBlVZ+XJQyul5ZFu6FrJwG13DUE9tyQgvHaqiH9BlwjgT2uoyK9NMuE8SQ/UtXV8OAjKfJBZJdoKHf4iLPpgnJz9xgnDEMBbANSkgQeoLIel0Q7SbaPh1kyInU/wbOLBZ6m6G3lY7z9koXDuJFvkuhkWigDhX+k1l+foS3wO689hUjavF5XqaTs2NExdMiD68v1oDUAmSe4urgCXBEulsnbJh7QygzKQC1P34BMAwDx4o4lvsgf4fY1T7IwWeJsg+gbIC6Fg/+yAo+t0I6TwMcNMg9sGNj2NT+lTC8gGza6ZJjj4RyyHSUjN/FeNe5L8B6k+A/RqE9MGrWS10UGrSTpCA9ed8CROPPWbJUlSDIs60+6dZYTTGUrKnuTwjygcMNkKQzuJ2XuUzbgoxRQNOIRrOgViHczMqBcbb82n0FuPVFs4Mj5GleAKx34WYsrNbeSTrv3DHlxeyzlFdxLXI1gOr9xkyXXVUjBE/nDxp7liYYJ76QIc1l/KN+NkoEWfjkbrIXwkAjmCwVChYNSnxlmxxP9bJW8RQFTSLzqeLAzGx7kcSqQSW2/Ni/gnS49raAucBnwWAfANFWH9ECkgcoi7gjyiLIdsUNBOy/kMYdGhx2Mqu8cEMwG56b4TZhLyKm3D8YSWMBYH71J5UQveAUBv6GQeMGy30BYvEYUvpCH0sAUD+KGx968qLJLY9aBsLIogYDEsyIY1CE7NtO6o6KJ5ZzFA/bRXyK+m5VmGKc9NqcSZYXFjKRMc/wF5TkAfJiDM0M8lxAOTcYxMS006AsqZ46rEgDuFJV3DTgfwo+zNf4HD30gdUwQIefCBm1CrwpY1EVPmE+gg1Od20AHo0mjrK0CO/ectmRFD7Qu8rw8KmtkRdUACQzMDcBbXHSHMlIh25w8ii+4vJ9TSXGFJvRiWCoq7gfxs+Y/QJq38YwmH13SY11iVprPRpNFv4w407aRx0PyiNY8GE38cjikSc9MUkpFa+4zdJSHcI8mT4qY4hrgKi2gQl7bEvc1eQRFHYAHXtJAq0blPpQi+ISDleQyik+StaSFck6FjEU6OAMLrSNjlJanVEZEsoEH6AjG6Z1itKzWipSdz/1Y16+i3adoFWPTA/KL2QOr3ByRfFkcRzZKR4eXNEMmvIrCyyKANaT3y8oT9f88TfsBXUo0SDbkIJ3o6XmS7iE80RWTQfm6AA7ECKuAT/AYrkaV/0RvBFbHtDFIGr0x83yf93a/jQX+28dtyBFfFaA8swKOYmlFyw9v7bWmBsfaDEHsClcniyitLyYfR1lpcRys3BTW1aZDjkkY/XNiDPll8mtEKAcY9d9LJ8UTTON0gsfnMmmL2MwquAjxI1BgAOsN1MYbQTlf+mKAx6/wzKR/fP3p9Ye91g0UBjOmUNh8RWXWQQtHtbQxSYdPZ1zxRH4eRqe+1ZrLGq0rGj6HG5MU0BzPY8nhAtztlMI1eZybDrcqcLu76QIslZXWlb1XOtHD81i5OR5I2ZNA2Tr22F6m5I2zV96ISUc3czlSJ2aQSvrd149GOI1wqaAFyhmj5fy3O+hAjqnsOCbnQqe0alLxKScROaEIgpxI5ITiKIf4SrRaGQhXIuUPEzlodZDpWeG7o0h5FAuWC27AikvDvisJlb/IdbkDLvkGDWYOfmxzmdkixnjKZerFz/xXPE11nRkbKlz4nwF8QBxNmCNtqEkXJfGERx4Z2m610QZgH/2GAZR2wEO/H3z62TjvOByldFObrGHtxlD0PnDBvzjw8xonYugKAXkML7KL4izvlJVCQsNgj8YF3iAGsPmnotblo77kn/zYlEPhRDa47BXVbGE/a2wTdx6QOem/RIPJPFoVCjv86quvvgU8x2NZjdB472y6PLSmH8/15Xm33pV0JTta2tvv/9X729c/GZp8+nKFSM4DrTM2uwyRB9uwJMwBdGSzXi8h7grDM5uSNO7VDBeXuSMDBe4lAaX3aFTic1ClNH3AQSnoNQSmtFAe4/OdoFzHGuXKY4GvoQ11Y6eUhY7QCUxdJ++Wk0d7i0s3dzevSLp4HDu62B+WcSIk6rqLnIuMTgSYpzrPRsc98hghnR1oaQG8rejnykMyV3XaICYVZA0cjXOKD/KOdY0tSb/qe1UeaY+7ZI9lkkxuJMuCSrzA8yAZZ3jPzSChIY4VOKxbd6/1/grWNMtiW9G0QBqWdUYw6mIAfp7govIGuCJcM1yvXGWsOk7IrrQwA48ra/y5yhqzwF4KjfYZnruwtgH+eTFEiKc1eMWZS9ce/iPJcn8NFYlnDRmdSWxIX1fY0hWWFvXD3uJ6zYoay6A0hY0zKOMf9f0GdEvp6KBb9zzUQmUto5DrpAkLK/muTQQejVwkG8utkYNxR6GhdS9peSr+9/+6qt71vceKiljMb1sPjnyPYfNy8xXvsXO+xxIMxUHaAMbrrPeAtzUCbu0JvIEjlG+SUcYIcWNM9hzCBaG7JAoc58ProPvrK/imt8IXJ5Pqo6hkrd3Za324ZCeywmjNH6BQ45JYDNOKynx2zrKmhcuxB+NcTktXE0ov0rRdn9mp+J4DUB/gunTlrST8jfpiHGUA6zrC3ynvPYVcr6r2ysolEFit5xBEl8LAPcfJL303YhdBo8KuY/5c6GTghrDww4x4qyi1RHNTk3FqZhnw9b0jg22KmTSqjvRZ/xir5q4+1NoNhhAGUMxrKOgxrh4vVMQA7scVx55VV0pWfnSBEb/sSLLSHeN6jvgr6PxCXp0Vlcy2P3i1UivlL+sBw6Yj0J55oD/EMG2SR6e2yqq2WlEhO1nMU4GpzFlpVcY5vkdZxGqgOoMiuMJ0WtWPn7IsBF0vAPYWf/fvj3rrZcIsd26qUAobmmHeQXOHHSc0tfi1VVZYVI4DMhX1roh+xwoJsvW59dUZ8JuodbeqsdTbt/w+7mYFKiyHLJxngOJNDbjnDrQDnUWNadVWWcFgN2ZS8x+kNztrYHc7aXH7bHME0O7rNv3XuRycS1EbaQ65VqoUd57geYb7Ca4hlPRzKrh0u+Pd3uAEsbrcBhJG0pudJTibBJPeH2rD+3IDhKzzsyFfCg42/fdAOPRJnDP/UB5u8umQLv5nvLKWSVzzhRJSKXl5C7VVVgpRTShpC7vuWWFMds21DDom+mhIquE7clI1+uIJcgxdc9W9UIH2xdUFLr9Qafne7MQ1vzLxa+sGQ4gvBQUPBTClgqgetBSFRQOaemL+sSc6VZLpuWYWryaAzgBXR0Ovi/Z2iRUG5zOENXk4J3lRVroXvHyOH6EEIUqn6+nq9B6ijk/rSsJkxStr5CTiohUkHzfjvt1x2dGkVgouUFadkq6IAgrbwzvdtVVYKzeYSomCPcfVR2kDuILLQqNx0aWY42GK+3NXFxUK+zRrLy8tDi7xwHylRkp4QFlfQgYDz6TnDx8+DL3QxHKIFzoVE3n//m0XWU5Ns00oqikq4Xn6/xX+V954sSHkG6dtShCCGAHnVIIXK5XruItrjfESBidcXOmR95ima4cSywFyucQ9Oy8vAR3hiY9jWsgMjlRZeGGqYiI2u5lYr55OPOGRRKOKi6zNzkhZ0SDpVgy0FO8n0tIeqbHd/dQKY5KTDci2k8g6wn3uaQ0JuNxbj42Es5Tx9H9ufiYJu6SsJsakQIYcZh1Il1UKaHlJFo9ZLRWVTFIprnyOZ21KDv6XWxeBO8CVVFSSC3A5fTZDVeoR6LBzcgmzOh2J41KQNeH62lBBC91fUxkysxUpKxs6sHnZhlJf+SpiSvFPryCtpGnUABHWn81Q3gMVNsJlHGhRuW2tTr25cSHWiIB67iL7ojo24ZDLR7UJImUFty9cOeZMm1IaV1JG+KoCqajSwMq+pFsrRUjCUWGhcJycGOOaJ9M09xHSuIm7UVSNkIqS0NkFRTAm6aBn1QZM8jCBLZwNVgrmhWkU/hmYC00Y9AB7akEj+OGHHwbAO7PAbSnLOILCn5EOyv0YdHq4knKM8DzF9RoKHuK/zBCBeFBmBmXQXtzuz03owiB0TeCLYH3TK8qvKL1QWUHAmytA64oG3KnKzWNetuMO1bFYKWssdFVO0nCiE9Oz/scnLXDMQGCNvyZE02Ne0L7mqDdv3ILWzJSYOt6HBqKrcEnj3EeHLHGDA5Wpl794CcYLsQIijnnFwi7Ipf7Jy2/P1J/NVQ4X5uurUFZj5VrN1O1J7Qm4BJVk2+H9BTzUCzfqsi+fJzN2za/BX4cE8JGodWTrkueiZW7VHL93c49dKP/re5E5EdzBB/jjnGRGD6CwI016YZLEshYSaQDqLYGPx6TgUO0NCov2g5em7Kphx8QUTwMvpoUdbM81dOKkZ/GNzb9EWWc2hOuA49jTRnUogz8e2uKG5y9Pa0qR6Xg1zonbXON7l3+MV7XfIcqg3c+IS0cF6QiTZ4myRiYEi2AdFaiI/Eo6e1oKfSVS/mDcs8tJVw+JrXsbUx5MEVnzqraPunZMbDfD6mtJn6NEWf28+QE+qDjKVdFz5TGVn/SwIMetZmcWeLVFWbrCFpM21RdoMX/wySMn2aPuqGgzB95PTPefC43C3IGnVqGyqilnp0xiBjEAt+4xYxqm/+xpIUijymevWnWnYlouG/jF/nKjhg1qZTg4fPw873OQUiZYd9wJBnhThWU7t/10icT9lsDkFrNQWRXmSS4FYQJ7Hh9rTcLsVsCwM+hEqLDLyqr7iQErhTN4UBNNEwOUqkEjV6saM0yFRXs7xDM9K9arNrB9AoAvnIRawJxE1WZ0uPzQ1CgHXRTdFkEBSK0TDaTwKbjcU8ZTcKU+cnodH9E6hYXvZWQUYkZvbOr+ZNCpdVSdD/q2eSVOIuzE5pgnUEruU+8CL8L9HPevcT+BIs0ktIpg1I4/booIFGyE/5euikpaYmUlsKXCsldjj+VFGOTDNbDykhsmfL3T6spXVfh1/IQGJpXGP/3m7agqGWxiPkbKygKqhV2uKXWKCkzXgq97beP4r6jsdU//x799doz6eVETPjfuGzfrkJuxspJJ5VYc4/YJri7jEmGO+wmPOtk1i5WQgbdbdI48zKtH9w1EI0ycTHx1fngp/QI0B96YtSCErwTM9j757Mh1Uski641DsVLWdCnZoKCcHa6h+mpI6Tx27Vl1iFSmfqrs7AxPMKwIU/FWj9/99lPJ92qtaBcjLSb7n3w2bBS1WFKE8KKssqwaKBMJoAO8BHxaUe9IwNLmfm3sDkh4Aws7ACg7hsoC+D/76e/eOa8yVMZwDTJqlLUGlZBmgbPWmJm+Ssennrk08Xkqzvrxb1//pLvfel/BR5axR3mxP/zid/81sWa2BoixN4l66pEdeJZT3LNOZmWx1yhrWZJ1oIuGIBpLooF4/9jyd18/Gn382ly741CETFRa0weffjbeVLdXc+BesrxcEprgOve9DCjdFJFkprkvWQKo6KDkLHLJc/kE48iDxcfNBFEuoDhh+bZPuH/bOqDbu4mKyvkDvquKzvEGxR7g0nVkPFP7mLDodEeA9RYay+pNlP4IFY1X45zKsKwx7fhfrcly1r+HK8AlCEsFnWJK5NX+J48mZSgoZDQAI4/jjg0KEuH5tc/ZctBrqYk+Dkm6fLYIPJPLy9laa1FWuhOYOQ7igvs6uDumt+n/qiHSFdYFr2NWXUZxGnc/8ZT8vUW7e5t1mBhecn/wvhV9/h9voxjH9786NoWyybNu3JU09nFAugdFjYvvRWErU1ZV8GNw/wxXEJci8R/h3umg7QStjb+Fwl6jELm9ORqktxP7N0VYkMkIvJ4K+Q0x2TMUwmaCoWO4gpx7mYnmkdzS+NQc7UeMSsastBTqkwYUdPBj9it3jOdB2/T1ByspO/hQ8NaIF8uxSWJVbUKqqCya0zEqzM+jopKfPr0C3tiG0i0rCn0B5gYWDDr3jEV50trzqFBMuT9JVwzGQlPEvUZa6HtWr4ivZLpy++4s7Lr5SfJW1b3yym6QX8c0T8jrwKb+0G7f2ORXwF8E63pQAJObXKqyosAj5GzSG64wCmUpzdVTvD1HhoUNAIp7hj3O42Z31kr1VPaAuhogM3b6xoF1x1ckTRBd8ivKx2VSsDQ3GAWmNbBWVBYagn7h+xs57KXBG8eD5K1QUckHOo1juOfWn9UgjSY4SeCJAzbboWl4bIoghccrmtZlkRzyLeVjBY6Khka+EmfzgJ7oBfCcBuZxvsqdusKzTQUShx/aPdgUC6ssxGPURRDLoA6ufcyL9B/88x1UKfgKHPB6KxGyBxscGWW7trekXYqy0hpaCimrwH3Ssxl3pIm9e/eOL57bKGpMiif8U9kP44g6/qeXN1INvYcO8BQwUyjB0Idc6ygDR54CR/xcdJf2V4qyojH0crm1SFD0QgvUOxS13/b4LsL+pkuLhYmC0JSE4uE58Hq4Ogn8Oe6pPC9dj5QBbxegNUjQzrxlZ4rrGvC1Ohggk1m3yMgN3Tt2st6NiJc1Zg2MuCgGdqaHWUEqia9wakKIngEs2RV4oFXu40pXGJ/7UJ5LwkGBuib0Y1jgcsgwiJ8F/8zXOj8BfV8gMwdCUwfcWqGWoqywEI89l/JnLvQ4VgV+34VGCjeQKhTh4Blc05KlaGQ+KjhjBaLVBu5xJlF9ZAf1RSWvbQB/57bMQfYvLXDnFjgiFJRlKgLMACpFWdFovBYWBXSilzxvKUMGtlH9IkQ1k01r2imCTaUT3khheRBciob4kR0ElV2MUDGgGleHptlSMSxPK5ma5iWFh6wjKWwarhRlRSbfpjNyeUYB/+mCD/ez54Jviwu+L4BrqqhxdsQjfmHwMaEHGT0rzGiNANjRdYLsZwYszHj+lwH8HSjq7fXdg+cbdCCvbEmWpayRLUNZeCigSSVlkfAeB54e64gqt7SngxGkLSeziuDQuLpFMIL0ngBmbSBcLivYgpnkzWnj/MOHD0MQmycJerqfu0wglqKsEOrEU+FIZo4ecuqRni9S2g7Eo6UqnBjzpKyBL8GURYcKi1n4Q9Af4sqSP9vdkDAua+EK97yEcjjRLGXphoXFxEqIwg5cCwwLBnLh3IUOJhl45MapC400LhTkn+m41HMv9Wz72LVFrApPbTbpI78nuAJcMc8R7md0KzGmnvha01XLZiFolxZgcM6wps6hQeApkxn4HrnQKsWykiEoxxh/TkpGfO7JJT2XUMaX69gBFPAUFKSLk4smfzwNEyIxQwqQSopOecQ3pRB1gYsKGysqoQJcffC3PGUBsBdqZp5ptQ7KQDwFk65tmOUkjSFvXEJpyqp60RMn5vb2vBwQrgQ/ceElhRtZzjKmyPh59KSsUxNuuCSldnPRY+kIcZevShJXCL9WMFjCGRg4wjV3YIS4XjaelKasLJxyV2x6FBZw6FMhYAmdxgssTyK8TNyXfgsvRdtY2DFCYacujJisRyplu0J+XYs8O8AxWpayyMMbSkJhZ6ZEWSdwpw8UDVP0e/DtezElRKjKpZtUWLksIMY4PMTaWDhFrIMP8jAogitI59jjsACGnxm5AUxQBCdJR36F9URXGUpNBTIOlDlmKY8kiGp8ynwK67KAXi0+VlbA40oy6nSAiFNcAS5dYNs9R72FOiDTtFImmNJMKMU7xHY4bqnjJEQPV4ArDhFupuzdfVrTmHj8j17uBK4bG5ltQ5sDdxjTK/ifIn1QACNJnkiAKDfI9wzyPZbAJ2DmUFZpmVoeXoaIs+6A1ws8HMURdf9XyhfS+ID3HuTG3V+Pcc928S2uCB3m1NdEWloe7XTEtj87WAZWiHjs4WLpUnXApYgwFZf7aOg9GJWJmy/Qod7kZm6RAHrezz62YGMjUEods9ZRApxsQuOnGzvGxcYqCRPTsQctHd1LCXENDF3uUJN+LwnwQ+T7FAnRvcTViNC0TPv7+/1VEu5PsETP3KnsBoVK3OA6ihKNegQre5Z3BhN4jnBNcXHsMcO/cYDSDOEiXQOxY4zsMN2vdslMOOxAvo9xdZk/3TVc1mueUCyeVUVSPgN5HPokuK20vEt+kwUF5eXL5YGtcmaVneMbxF/h6mSl58TNES92uXNoeI9GWRbeiYIgOgGrQ83K4KXONHfODdZVhnKRZzoY0zSl+EfAk9IlXO0U1bTcJvDJA99N8HYNdmfd4CorWinsISzTAPlyNryfkf8Eca8AG2akNVGNBFqNslbYCJQihswyuYWwzOWqCovXZFWyBDZuzMrlA7pN3O+rthGWLKKGfCwBeAY3uA/iZ1//6MQ2rh36KrsJnY2xrGgoIxTsGa4AExItTARxlxC32Z24vCNoIqwGdjnuDjzLQTqWt8427uA33YOpfY+mZmg5m9rV1FaI3nmoSd+ZJLUZg50a5RXLLML9jMs2fLHa1iNRO9AuQctbAE+lfXVB8fsCzAYJhrm+fGIrgwSdym9rr6wQOA8LPy6SDDcC7LKFhZfRhQwoq16BrOZI59rxqAAuM9mzK8zTH0o5NF15YqeZhcAaNryzw7K2Bebk6Rxd66UbdbZQoaJSCmik7EF3MqjND9LPE3YgJB7yza8L8N4oYHugNw8GdVbK94PU5F2eorK88b5ko7KvG7jWyoqG0TMQUEDlNoDfClBaVDT6CxTGSPFogbEp39ilVdsozzwIL/TxweMsPmA1OQzQBpZ/09pLrZUV0g60Ek8l7triurKMVDgjRY3Fxgar3MU4SvSP4cYJAEMRcDYQ91qTRikBw4FAQnjT2kutlRWNaS4R+q7CcF8zyh44lv+5jTvMCT3UDxXOtI7GwPVyAohjuTcOvdZLN+ghpwYSnfuYmqdrxLdL4Epx03ovkX+E+xmu2uwygnyeJ/izvV1+UBrIZ6YE6MZC0UP1jusA+J0cGlToCWQ6rmhSh/XUy+HlLppr9XcPG3CzCbPBookTNFzjj+Ym64fWRTW642R8zn3EiRYfnUMO/cJodirg4aYQUADAThGu7ZEAVAvC8TMAeAUEpGeEa1a1nJRsrsFCh3xkBdf2kkWz7LhaW1YWXrlaV7jNFTzSePr6mPA2gYrKw7+QFxuaJHBjBs8Roks3kiD4huF4Czx4IWtQbm1+kMUMALysg1obTdZDhPHtxGRdlNYbdUMX/QWuTgYzTu0lg14lUbW3rJSC6rE545msxKWAaBX4mQSTylwiqp9YUbNoJ+E092tRWI8nUSyLBkVbW1tQdXAMRujWZykXeQxN3WhlYU+B28MV4OLGkJdlzUKDfqlhbRVkU6qMXneienMbckscdASXuOlbEwAi3NHKjybZFmXVdcQZdbI8L2pXN7/U3g1OVpiqpEkyzuVeNXgnRWX+6PFp9Q9ceDHFRZ5zU5w8eHoneWllxie8mo4wH25m4Ddsd3K3Wq2XboQVaA2GBk+3y0fgx5Kdld6EEeVRRCY4GtiZJq20JLUpQ6qod3xAYTfmZP87pj3c7LSyQn7eFAwN6ImH+jAiAYs4MULIAeY4LieptGh6Nci3Z5kBJwSPLXE3Fm1nlZWNxWetQXECn/QktJDnOeDmEtg8GLrAruP+PNq6eA9ejS+vSMdmrdJ2Vll914KDlbBmhUsUyHdsTQCKDmUdOuC7oPZckIHLj2J1HWlsFHqjrBtVXfeZVcsQ4f2Uwhha5KOKdhRlMdPJijSJwyy8Mw2T/NYN2yirvxqY+SNlRglu7BAW1mRjfIQcduoERTOJ1hN6o5ZufIrw/fv33DLok2TkQiyxhvwlXFMuUdDyfYtLtJZMC4tNABOUiZsABriyAt3m803dFJBVoF2Ka+9SYdNlxZjnBnFBOt7yeQgLF5rigocBcKhgAa68YHzWFCfQ8LXxDpQ3gILO2Dmt0eW9Vy6U+xqR3XsJBhHYhvi57c41g2xqA7qzlpU1QCsDK/bCQ23weJKJCR21IYCbKfoCPCrcJRq4+KypqjfPC8qwAoLyvITsXZTVaL/wSuYb+uDVD9w0GfDwMPAc4XIN56Y9PF8cQKYSRU3yNoDCUsErCbTOvNix+M5QyX5uSxceA5etdirstBvMmkbjZ+9Ol8w28EtvhybIGJ+KDoHT0Czt5QEqp1oDTXckEfhhvqGGL6MkNU6/NEICMCyy0+uQpvnVBX7nlZUVAYUd4M/GYs3g/h6ZWFVf76FCobx/zAlyGEEOp7h0wbjMOmIWshcPBXT5bmLaTrvBcYXRWsCtOsJzFMcJ/nmOkJGikibGas8FtAtBfNGJMxIqKsG7yoWPUZ3+KXtYyqcgEgkI0bIPBXBbCdIoq6pWTshA+Q6hBCeIijS1zeWRIzQaq3doQT/tXmqyyk/yRYc5QFE5FCiyqElmukq5k3HW93ybirIHASriBFeEaxmgyFPWCT0JyHykonfyr3GDc6qd7mr69DsfM6xo5IucLI2j0Xi91B944hBgYMjAHPl/bojTgDtIwEtlO+S/c6g+lRXCO4TCzFyFCJ7egEbHlA49DB8dmGm+uwrfuMEbXPNwDeee2DdWVOaL/Hue8m/ICCTQKKtASHUFqdOOpLrKaJv4apS1+tp0dlsVy77oWEsAkz9r58Ga+Q1EbJS14krDzOZLH1n6oqN4mdjwhFMlpzZ4DY6dBBpltZObNZbrNjuV8VzRseYjiQgLadOBYC9IOE/Sae7LlUCjrOXK9x511cC5lusSTnwqisWpkXOsi7qWwaX8O4nbKOsaqh3LLSGy5WUTuN0utEHU4UD5hkiXuMO0psY7t3R5N2kyCezLwBoo3xL461//+uoXv/jFP0H3f0ppcycPFPW3UngTuNls9hY8/d+f//zn/wm8Lq5OBn4Ipf5fv//976OMtCaqZAm0S6bfkC+QQOITD4McUFqyKr/AtmQDGyWosLz4Aawpv7jm0/VeZtL8GEmgUVYjcZUHPMA7ozjNoYvJHl7LY11gSSv/Alt5JWwou0rg/wNp6JZe9MHFaAAAAABJRU5ErkJggg==
     mediatype: image/png
@@ -425,7 +425,14 @@ spec:
             metadata:
               labels:
                 app: 3scale-api-management
+                com.company: Red_Hat
                 control-plane: controller-manager
+                rht.comp: 3scale
+                rht.comp_ver: "2.14"
+                rht.prod_name: Red_Hat_Integration
+                rht.prod_ver: master
+                rht.subcomp: 3scale_operator
+                rht.subcomp_t: infrastructure
             spec:
               containers:
               - args:
@@ -1022,7 +1029,7 @@ spec:
   - name: GitHub
     url: https://github.com/3scale/3scale-operator
   - name: Documentation
-    url: https://github.com/3scale/3scale-operator/blob/v0.11.0/doc/operator-user-guide.md
+    url: https://github.com/3scale/3scale-operator/blob/master/doc/operator-user-guide.md
   maintainers:
   - email: [email protected]
     name: Eguzki Astiz Lezaun
@@ -1033,5 +1040,5 @@ spec:
   maturity: stable
   provider:
     name: Red Hat
-  version: 0.11.0
-  replaces: 3scale-community-operator.v0.10.1
+  replaces: 3scale-community-operator.v0.11.0
+  version: 0.0.1
diff --git a/bundle/metadata/annotations.yaml b/bundle/metadata/annotations.yaml
index e025f07d..7d7cbc95 100644
--- a/bundle/metadata/annotations.yaml
+++ b/bundle/metadata/annotations.yaml
@@ -1,10 +1,9 @@
 annotations:
-  operators.operatorframework.io.bundle.channels.v1: threescale-2.14
-  operators.operatorframework.io.bundle.channel.default.v1: threescale-2.14
+  operators.operatorframework.io.bundle.channels.v1: alpha
   operators.operatorframework.io.bundle.manifests.v1: manifests/
   operators.operatorframework.io.bundle.mediatype.v1: registry+v1
   operators.operatorframework.io.bundle.metadata.v1: metadata/
-  operators.operatorframework.io.bundle.package.v1: 3scale-community-operator
+  operators.operatorframework.io.bundle.package.v1: 3scale-operator
   operators.operatorframework.io.metrics.builder: operator-sdk-v1.2.0
   operators.operatorframework.io.metrics.mediatype.v1: metrics+v1
   operators.operatorframework.io.metrics.project_layout: go.kubebuilder.io/v2
make: *** [Makefile:290: bundle-update-test] Error 1
@eguzki , thank you for comment. - We discussed before that main goal of this PR is E2E tests. - Bundle content is "copied" finally to **Community PR** https://github.com/redhat-openshift-ecosystem/community-operators-prod/pull/4150 , and here we don't actually know how it was generated (?). Or it will have impact in Community PR build? But, anyway, it's nice to see that the bundle checking step is passing , so ok, I will try see what can I do in **config** to generate it. Thanks again

eguzki avatar Apr 25 '24 08:04 eguzki

@valerymo no strong preference but I think we could drop the olm.maxOpenshiftVersion flag from the CSV of community release.

Why drop it? the more control we have the better, right?

Only thinking about future releases of openshift as the reason why dropping it might be better. Both sides have their disadvantages. Either a patch release that will allow it to move forward in OCP/OSD versions or a patch to block to prevent unsupported setup. IMO, allowing it to be installed on more than just 4.15 is better choice, but again, both ways have their consequences.

MStokluska avatar Apr 25 '24 08:04 MStokluska

allowing

Up to you guys. I would prefer to add a patch to support new OCP releases than deal with issues.

eguzki avatar Apr 25 '24 09:04 eguzki

diff -r 0.10.1/ 0.11.0/

Result:

Issues to address:

  • [x] - name: RELATED_IMAGE_SYSTEM_SEARCHD > value: quay.io/3scale/searchd:latest -> pin that to non floating tag
  • [x] quay.io/fedora/redis-6:latest -> pin that to non floating tag
  • [x] Run fresh install with the latest manifests
  • [x] Run upgrade test from v0.10.1

Done

TEST Community Release 0.11.0 - Fresh Install and Upgrade

TEST Community Release 0.11.0

25 April 2024

Images Tags names:
0.0.1 - v0.10.1
0.0.2 - v0.11.0 - for Upgrade
0.0.7 - v0.11.0 - for Fresh Install

docker system prune -a
docker images
docker login ...

Clean quay.io repos: remove 0.0.2, Save 0.0.1 ! https://quay.io/repository/vmogilev_rhmi/3scale-index?tab=tags https://quay.io/repository/vmogilev_rhmi/3scale-operator-bundles?tab=tags https://quay.io/repository/vmogilev_rhmi/3scale-operator?tab=tags

Check Fresh installation of v0.11.0


  • Images Tag: 0.0.7
$ git switch 3scale-community-v0.11.0

docker build -f Dockerfile  -t quay.io/vmogilev_rhmi/3scale-operator:0.0.7
docker push quay.io/vmogilev_rhmi/3scale-operator:0.0.7

docker build -f bundle.Dockerfile -t quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.7 .
docker push quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.7

opm index add --bundles quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.7 --build-tool docker --tag quay.io/vmogilev_rhmi/3scale-index:0.0.7
docker push quay.io/vmogilev_rhmi/3scale-index:0.0.7
  • CatalogSource
kubectl apply -f - <<EOF
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  name: threescale-operators
  namespace: openshift-marketplace
spec:
  sourceType: grpc
  image: quay.io/vmogilev_rhmi/3scale-index:0.0.7
EOF
  • Install 3scale-operator from OperatorsHub
  • appply s3-credentials secret and apimanager CR
  • check installation

Logs:

$ oc get dc
Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+
NAME                 REVISION   DESIRED   CURRENT   TRIGGERED BY
apicast-production   1          1         1         config,image(amp-apicast:2.14)
apicast-staging      1          1         1         config,image(amp-apicast:2.14)
backend-cron         1          1         1         config,image(amp-backend:2.14)
backend-listener     1          1         1         config,image(amp-backend:2.14)
backend-redis        1          1         1         config,image(backend-redis:2.14)
backend-worker       1          1         1         config,image(amp-backend:2.14)
system-app           1          1         1         config,image(amp-system:2.14)
system-memcache      1          1         1         config,image(system-memcached:2.14)
system-mysql         1          1         1         config,image(system-mysql:2.14)
system-redis         1          1         1         config,image(system-redis:2.14)
system-searchd       1          1         1         config,image(system-searchd:2.14)
system-sidekiq       1          1         1         config,image(amp-system:2.14)
zync                 1          1         1         config,image(amp-zync:2.14)
zync-database        1          1         1         config,image(zync-database-postgresql:2.14)
zync-que             1          1         1         config,image(amp-zync:2.14)
[vmogilev@vmogilev THREESCALE-10719-Community-Builds]$ date
Thu Apr 25 10:48:25 IDT 2024

Cleanup

  • Uninstall operator from OperatorsHub
  • $ make uninstall
  • $ oc delete project 3scale-test
  • $ oc delete catalogsource threescale-operators --namespace=openshift-marketplace

Check Upgrade from v0.10.1 to v0.11.0


docker system prune -a
docker images
  • Clean quay.io repos
    https://quay.io/repository/vmogilev_rhmi/3scale-index?tab=tags https://quay.io/repository/vmogilev_rhmi/3scale-operator-bundles?tab=tags https://quay.io/repository/vmogilev_rhmi/3scale-operator?tab=tags

Prepare Image for previous release: v0.10.1


$ git switch v0.10.1 --detach

Do following changes in CSV (taken from community-operators-prod repo !)

   containerImage: quay.io/3scale/3scale-operator:v0.10.1
   - name: RELATED_IMAGE_BACKEND
              value: quay.io/3scale/3scale213:apisonator-3scale-2.13.1-GA
   - name: RELATED_IMAGE_APICAST
              value: quay.io/3scale/3scale213:apicast-3scale-2.13.1-GA
   - name: RELATED_IMAGE_SYSTEM
              value: quay.io/3scale/3scale213:porta-3scale-2.13.1-GA
   - name: RELATED_IMAGE_ZYNC
              value: quay.io/3scale/3scale213:zync-3scale-2.13.1-GA
   image: quay.io/3scale/3scale-operator:v0.10.1

Create release image(s)

docker build -f Dockerfile  -t quay.io/vmogilev_rhmi/3scale-operator:0.0.1
docker push quay.io/vmogilev_rhmi/3scale-operator:0.0.1

docker build -f bundle.Dockerfile -t quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.1 .
docker push quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.1

opm index add --bundles quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.1 --build-tool docker --tag quay.io/vmogilev_rhmi/3scale-index:0.0.1
docker push quay.io/vmogilev_rhmi/3scale-index:0.0.1

CatalogSource

kubectl apply -f - <<EOF
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  name: threescale-operators
  namespace: openshift-marketplace
spec:
  sourceType: grpc
  image: quay.io/vmogilev_rhmi/3scale-index:0.0.1
EOF
  • Install 3scale-operator from OperatorsHub
  • appply s3-credentials secret and apimanager CR
  • check installation
$ oc get dc
Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+
NAME                 REVISION   DESIRED   CURRENT   TRIGGERED BY
apicast-production   1          1         1         config,image(amp-apicast:2.13)
apicast-staging      1          1         1         config,image(amp-apicast:2.13)
backend-cron         1          1         1         config,image(amp-backend:2.13)
backend-listener     1          1         1         config,image(amp-backend:2.13)
backend-redis        1          1         1         config,image(backend-redis:2.13)
backend-worker       1          1         1         config,image(amp-backend:2.13)
system-app           1          1         1         config,image(amp-system:2.13)
system-memcache      1          1         1         config,image(system-memcached:2.13)
system-mysql         1          1         1         config,image(system-mysql:2.13)
system-redis         1          1         1         config,image(system-redis:2.13)
system-sidekiq       1          1         1         config,image(amp-system:2.13)
system-sphinx        1          1         1         config,image(amp-system:2.13)
zync                 1          1         1         config,image(amp-zync:2.13)
zync-database        1          1         1         config,image(zync-database-postgresql:2.13)
zync-que             1          1         1         config,image(amp-zync:2.13)
[vmogilev@vmogilev THREESCALE-10719-Community-Builds]$ date
Thu Apr 25 12:29:49 IDT 2024


$ oc describe deploy |grep -i redis
      RELATED_IMAGE_BACKEND_REDIS:      centos/redis-5-centos7
      RELATED_IMAGE_SYSTEM_REDIS:       centos/redis-5-centos7

Prepare Image for new release: v0.11.0 for Upgrade

git switch 3scale-community-v0.11.0
  • Update Makefile: version: 0.0.2
  • Update CSV: containerImage: quay.io/vmogilev_rhmi/3scale-operator:0.0.2 image: quay.io/vmogilev_rhmi/3scale-operator:0.0.2 name: 3scale-operator.v0.0.2 replaces: 3scale-operator.v0.0.1 version: 0.0.2 ! Check bundle.Dockerfile - to use ...bundle.package.v1=3scale-operator
  • rebuild: make ls -l bin/manager -rwxrwxr-x. 1 vmogilev vmogilev 57909321 Apr 25 14:57 bin/manager
docker build -f Dockerfile  -t quay.io/vmogilev_rhmi/3scale-operator:0.0.2
docker push quay.io/vmogilev_rhmi/3scale-operator:0.0.2

docker build -f bundle.Dockerfile -t quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.2 .
docker push quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.2

opm index add --bundles quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.1 --bundles quay.io/vmogilev_rhmi/3scale-operator-bundles:v0.0.2 --build-tool docker --tag quay.io/vmogilev_rhmi/3scale-index:0.0.2
docker push quay.io/vmogilev_rhmi/3scale-index:0.0.2
$ oc edit catalogsource threescale-operators --namespace=openshift-marketplace

check:

$ oc get dc
Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+
NAME                 REVISION   DESIRED   CURRENT   TRIGGERED BY
apicast-production   1          1         1         config,image(amp-apicast:2.13)
apicast-staging      1          1         1         config,image(amp-apicast:2.13)
backend-cron         1          1         1         config,image(amp-backend:2.13)
backend-listener     1          1         1         config,image(amp-backend:2.13)
backend-redis        1          1         1         config,image(backend-redis:2.13)
backend-worker       1          1         1         config,image(amp-backend:2.13)
system-app           1          1         1         config,image(amp-system:2.13)
system-memcache      1          1         1         config,image(system-memcached:2.13)
system-mysql         1          1         1         config,image(system-mysql:2.13)
system-redis         1          1         1         config,image(system-redis:2.13)
system-sidekiq       1          1         1         config,image(amp-system:2.13)
system-sphinx        1          1         1         config,image(amp-system:2.13)
zync                 1          1         1         config,image(amp-zync:2.13)
zync-database        1          1         1         config,image(zync-database-postgresql:2.13)
zync-que             1          1         1         config,image(amp-zync:2.13)
$ date
Thu Apr 25 15:18:19 IDT 2024
$ oc get dc
Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+
NAME                 REVISION   DESIRED   CURRENT   TRIGGERED BY
apicast-production   3          1         1         config,image(amp-apicast:2.14)
apicast-staging      2          1         1         config,image(amp-apicast:2.14)
backend-cron         3          1         1         config,image(amp-backend:2.14)
backend-listener     3          1         1         config,image(amp-backend:2.14)
backend-redis        3          1         1         config,image(backend-redis:2.14)
backend-worker       3          1         1         config,image(amp-backend:2.14)
system-app           2          1         1         config,image(amp-system:2.14)
system-memcache      2          1         1         config,image(system-memcached:2.14)
system-mysql         3          1         1         config,image(system-mysql:2.14)
system-redis         3          1         1         config,image(system-redis:2.14)
system-searchd       1          1         1         config,image(system-searchd:2.14)
system-sidekiq       2          1         1         config,image(amp-system:2.14)
zync                 3          1         1         config,image(amp-zync:2.14)
zync-database        2          1         1         config,image(zync-database-postgresql:2.14)
zync-que             3          1         1         config,image(amp-zync:2.14)
$ date
Thu Apr 25 15:22:32 IDT 2024
$ oc describe deploy threescale-operator-controller-manager-v2 |grep redis
      RELATED_IMAGE_BACKEND_REDIS:      quay.io/fedora/redis-6:20230816
      RELATED_IMAGE_SYSTEM_REDIS:       quay.io/fedora/redis-6:20230816

valerymo avatar Apr 25 '24 12:04 valerymo

@valerymo no strong preference but I think we could drop the olm.maxOpenshiftVersion flag from the CSV of community release.

Why drop it? the more control we have the better, right?

Discussed with @MStokluska , will not drop (?)

valerymo avatar Apr 25 '24 12:04 valerymo

Hi @eguzki Turns out we can't change package name via config file to include the "-community-" because:

  1. project name 3scale-operator
  2. operator SDK 1.2.0 (which is the version used by 3scale operator) does not have support for providing "--package <PACKAGE_NAME>" flag when the bundle gets build from configuration - this is supported in later versions of operator-sdk
  3. bundle annotations package name also can't be tweaked for the same reason
  4. All other values can be updated
  5. Channels are not updated as it would require change in the makefile just to suit the bundle validation test done by circleci - which also wasn't done previously and I think we don't have to be doing it now.

Because of this, config was updated were possible but some manual updates were required for the rest:

  1. CSV - .name value was set manually
  2. Metadata/annotations file - was set manually in channel, default channel and package name. Thanks to @MStokluska for help!

valerymo avatar Apr 25 '24 14:04 valerymo

Hi @eguzki , we discussed before that this PR is for TEST ONLY. But you merged it. If I understand - it's a change in Process (?) so we should follow it in future Community release preparation. I'm not asking for detailed reply, as you already noted about stable branches in https://github.com/3scale/3scale-operator/pull/979.
I just wanted to be sure that it's not a mistake with merge of current PR. Thank you for help!
cc @MStokluska

valerymo avatar Apr 30 '24 13:04 valerymo