k8s-worker-pod-autoscaler
k8s-worker-pod-autoscaler copied to clipboard
minReplicas can be manually edited to be set more than maxReplicas, no validations
Used k edit wpa -n <context>
to open the WPA spec in vim.
Was able to set minReplicas to 10, and maxReplicas to 1 for the same pod.
Validation needs to be made better for the CRD
Unable to edit min-replicas in kubernetes v1.18.0; Failing with error:
Invalid value: "": "spec" must validate one and only one schema (oneOf). Found 2 valid alternatives
Issue is happening because the WPA has got created and the object has both replicasSetName
and deploymentName
.
spec:
maxDisruption: null
maxReplicas: 1
minReplicas: 0
queueURI: URI-sample
replicaSetName: ""
deploymentName: mailsender
secondsToProcessOneJob: 0
targetMessagesPerWorker: 1
cc @matkam
I have the same issue as @adityabhatia02 with both deploymentName
and replicasSetName
having been set, however replicasSetName
got defaulted to "" when it was never specified in the yaml. I'm using Helm3 and k8s 1.15
I'm not too familiar with CRD validation rules. Is it possible to set the validation oneOf
to be "not empty/blank" instead of required
? Here's the CRD currently: https://github.com/practo/k8s-worker-pod-autoscaler/blob/master/artifacts/crd.yaml#L42
Would it make sense to use anyOf
instead of oneOf
validation? Or to even remove the oneOf
requirement and handle incorrect states in the operator code. If both fields exist, use deploymentName
first. If invalid, try replicaSetName
next. If both values are invalid, then throw an error.
To be honest I'm not either, as a temporary measure I did delete the restriction and everything is fine. What I'm trying to figure out and I think is ultimately the problem, is why is replicaName getting defaulted when it's not in my yaml.
oneOf
does work as we expect it to. Here is an example:
$ cat wpa.yaml
apiVersion: k8s.practo.dev/v1
kind: WorkerPodAutoScaler
metadata:
labels:
app: voice
name: testoneof
spec:
maxDisruption: null
maxReplicas: 1
minReplicas: 0
queueURI: beanstalk://beanstalkd/mail-sender
replicaSetName: ""
deploymentName: mailsender
secondsToProcessOneJob: 0
targetMessagesPerWorker: 1
$ k create -f wpa.yaml
The WorkerPodAutoScaler "testoneof" is invalid: : Invalid value: "": "spec" must validate one and only one schema (oneOf). Found 2 valid alternatives
oneOf prevents both replicaSetName and deploymetName to get set. As @aleclerc-sonrai we should may be find out how did the value get set? Was the CRD validation updated after the object was created?
No it wasn't. My current theory is that the operator itself, when it is updating the status, is somehow also updating the spec.replicaSetName
to ""
...my yaml definitely doesn't have the field specified anywhere.