k8s-worker-pod-autoscaler icon indicating copy to clipboard operation
k8s-worker-pod-autoscaler copied to clipboard

minReplicas can be manually edited to be set more than maxReplicas, no validations

Open ishanjoshi02 opened this issue 3 years ago • 8 comments

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.

ishanjoshi02 avatar Jul 06 '20 16:07 ishanjoshi02

Validation needs to be made better for the CRD

alok87 avatar Jul 08 '20 08:07 alok87

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

adityabhatia02 avatar Sep 24 '20 11:09 adityabhatia02

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

alok87 avatar Sep 24 '20 12:09 alok87

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

aleclerc-sonrai avatar Nov 17 '20 09:11 aleclerc-sonrai

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.

matkam avatar Nov 17 '20 22:11 matkam

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.

aleclerc-sonrai avatar Nov 17 '20 23:11 aleclerc-sonrai

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?

alok87 avatar Nov 18 '20 10:11 alok87

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.

aleclerc-sonrai avatar Nov 18 '20 13:11 aleclerc-sonrai