Skip to content

ResourcePool quota may become negative #1977

Description

@keeprocking

Bug description

Tenant owners may exceed the total available resource quota specified in the ResourcePool by modifying the already existing ResourcePoolClaim.

How to reproduce

Bootstrap:

$ kind create cluster

$ helm install \
  capsule oci://ghcr.io/projectcapsule/charts/capsule \
  --version 0.13.6 \
  -n capsule-system \
  --create-namespace \
  --set certManager.generateCertificates=false \
  --set tls.enableController=true \
  --set tls.create=true

$ cat <<EOF | kubectl apply -f -
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: resourcepoolclaim-edit
rules:
- apiGroups: ["capsule.clastix.io"]
  resources: ["resourcepoolclaims"]
  verbs: ["*"]
---
apiVersion: capsule.clastix.io/v1beta2
kind: Tenant
metadata:
  name: green
spec:
  owners:
  - kind: User
    name: green
  additionalRoleBindings:
  - clusterRoleName: resourcepoolclaim-edit
    subjects:
    - kind: User
      name: green
---
apiVersion: capsule.clastix.io/v1beta2
kind: ResourcePool
metadata:
  name: green
spec:
  config:
    defaultsZero: true
  quota:
    hard:
      requests.cpu: "10"
  selectors:
  - matchLabels:
      capsule.clastix.io/tenant: green
EOF

$ kubectl --as=green --as-group=projectcapsule.dev create ns green

Now, if a tenant owner tries to create a ResourcePoolClaim that exceeds the total available quota (in this case - 10 CPU available, 55 CPU requested), Capsule will make it exhausted, as expected, and ResourceQuota will be empty:

$ cat <<EOF | kubectl --as=green --as-group=projectcapsule.dev create -f -
apiVersion: capsule.clastix.io/v1beta2
kind: ResourcePoolClaim
metadata:
  name: quota
  namespace: green
spec:
  pool: green
  claim:
    requests.cpu: "55"
EOF

$ kubectl get -n green resourcepoolclaim/quota -o yaml | yq .status
conditions:
  - lastTransitionTime: "2026-06-22T19:38:56Z"
    message: reconciled
    reason: Succeeded
    status: "True"
    type: Ready
  - lastTransitionTime: "2026-06-22T19:38:56Z"
    message: 'requested: requests.cpu=55, available: requests.cpu=10'
    observedGeneration: 1
    reason: PoolExhausted
    status: "True"
    type: Exhausted
  - lastTransitionTime: "2026-06-22T19:38:56Z"
    message: claim causes exhaustions
    observedGeneration: 1
    reason: Failed
    status: "False"
    type: Bound
observedGeneration: 1
pool:
  name: green
  uid: b5608e91-85c2-47e8-aefb-d428a57b5d80

$ kubectl get resourcepool/green -o yaml | yq .status.allocation
allocation:
  available:
    requests.cpu: "10"
  hard:
    requests.cpu: "10"
  used:
    requests.cpu: "0"

$ kubectl get -n green quota/capsule-pool-green -o yaml | yq '.status'
hard:
  requests.cpu: "0"
used:
  requests.cpu: "0"

If, however, a tenant owner first creates a valid (5/10 CPU) ResourcePoolClaim and then changes it to some extreme values (55/10 CPU), the ResourcePool will become negative.

ResourceQuota and ResourcePoolClaim will have the requested values, while the ResourcePool will not be marked exhausted:

$ cat <<EOF | kubectl --as=green --as-group=projectcapsule.dev create -f -
apiVersion: capsule.clastix.io/v1beta2
kind: ResourcePoolClaim
metadata:
  name: quota
  namespace: green
spec:
  pool: green
  claim:
    requests.cpu: "5"
EOF

$ kubectl --as=green --as-group=projectcapsule.dev patch resourcepoolclaim -n green quota --patch '{"spec": {"claim": {"requests.cpu": "55"}}}' --type merge

$ kubectl get -n green resourcepoolclaim/quota -o yaml | yq .status
conditions:
  - lastTransitionTime: "2026-06-22T19:40:55Z"
    message: reconciled
    reason: Succeeded
    status: "True"
    type: Ready
  - lastTransitionTime: "2026-06-22T19:48:08Z"
    message: resource claimable from pool
    observedGeneration: 2
    reason: NoExhaustions
    status: "False"
    type: Exhausted
  - lastTransitionTime: "2026-06-22T19:48:08Z"
    message: claim is unused
    observedGeneration: 2
    reason: Unused
    status: "False"
    type: Bound
observedGeneration: 2
pool:
  name: green
  uid: b5608e91-85c2-47e8-aefb-d428a57b5d80

$ kubectl get resourcepool/green -o yaml | yq .status.allocation
allocation:
  available:
    requests.cpu: "-45"
  hard:
    requests.cpu: "10"
  used:
    requests.cpu: "55"

$ kubectl get -n green quota/capsule-pool-green -o yaml | yq '.status'
hard:
  requests.cpu: "55"
used:
  requests.cpu: "0"

Expected behavior

ResourcePool should never have negative values and must be treated as an upper limit for the resource quota.

Any changes in ResourcePoolClaim must be checked against its ResourcePool limits.

Logs

2026/06/23 11:52:50 maxprocs: Leaving GOMAXPROCS=4: CPU quota undefined
{"level":"info","ts":"2026-06-23T11:52:50.176Z","logger":"setup","msg":"Capsule Version v0.13.6 f4085fd"}
{"level":"info","ts":"2026-06-23T11:52:50.176Z","logger":"setup","msg":"Build from: https://github.com/projectcapsule/capsule"}
{"level":"info","ts":"2026-06-23T11:52:50.176Z","logger":"setup","msg":"Build date: 2026-06-17T04:33:51"}
{"level":"info","ts":"2026-06-23T11:52:50.176Z","logger":"setup","msg":"Go Version: go1.26.4"}
{"level":"info","ts":"2026-06-23T11:52:50.176Z","logger":"setup","msg":"Go OS/Arch: linux/amd64"}
{"level":"info","ts":"2026-06-23T11:52:50.217Z","logger":"setup","msg":"Initializing webhook certificate watcher using provided certificates","webhook-cert-path":"/tmp/k8s-webhook-server/serving-certs","webhook-cert-name":"tls.crt","webhook-cert-key":"tls.key"}
{"level":"info","ts":"2026-06-23T11:52:50.217Z","logger":"controller-runtime.certwatcher","msg":"Updated current TLS certificate","cert":"/tmp/k8s-webhook-server/serving-certs/tls.crt","key":"/tmp/k8s-webhook-server/serving-certs/tls.key"}
{"level":"info","ts":"2026-06-23T11:52:50.217Z","logger":"setup","msg":"initializing manager"}
{"level":"info","ts":"2026-06-23T11:52:50.220Z","logger":"setup","msg":"initializing capsule configuration"}
{"level":"info","ts":"2026-06-23T11:52:50.220Z","logger":"setup","msg":"initializing caches"}
{"level":"info","ts":"2026-06-23T11:52:50.232Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/convert"}
{"level":"info","ts":"2026-06-23T11:52:50.232Z","logger":"controller-runtime.builder","msg":"Conversion webhook enabled","GVK":"capsule.clastix.io/v1beta1, Kind=Tenant"}
{"level":"info","ts":"2026-06-23T11:52:50.232Z","logger":"setup","msg":"registering indexers"}
{"level":"info","ts":"2026-06-23T11:52:50.233Z","logger":"setup","msg":"skipping setup of Indexer ingress.HostnamePath for object *v1beta1.Ingress","error":"no matches for kind \"Ingress\" in version \"extensions/v1beta1\""}
{"level":"info","ts":"2026-06-23T11:52:50.234Z","logger":"setup","msg":"skipping setup of Indexer ingress.HostnamePath for object *v1beta1.Ingress","error":"no matches for kind \"Ingress\" in version \"networking.k8s.io/v1beta1\""}
{"level":"info","ts":"2026-06-23T11:52:50.234Z","logger":"setup","msg":"registering webhooks"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/generic/replications"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/generic/managed"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/pods/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/ingresses/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/persistentvolumeclaims/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/persistentvolumeclaims/mutating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/services/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/nodes/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/generic/cordoning"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/serviceaccounts/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/generic/customresources"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/gateways/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/devices/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/defaults"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/tenants/mutating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/tenants/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/tenantowners/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/namespaces/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/namespaces/mutating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/resourcepools/mutating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/resourcepools/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/resourcepools/claim/mutating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/resourcepools/claim/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/custom-quotas/namespaced/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.235Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/custom-quotas/cluster/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.236Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/custom-quotas/calculations"}
{"level":"info","ts":"2026-06-23T11:52:50.236Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/generic/metadata"}
{"level":"info","ts":"2026-06-23T11:52:50.236Z","logger":"controller-runtime.webhook","msg":"Registering webhook","path":"/config/validating"}
{"level":"info","ts":"2026-06-23T11:52:50.236Z","logger":"setup","msg":"initializing controllers"}
{"level":"info","ts":"2026-06-23T11:52:50.241Z","logger":"setup","msg":"starting manager"}
{"level":"info","ts":"2026-06-23T11:52:50.241Z","logger":"controller-runtime.metrics","msg":"Starting metrics server"}
{"level":"info","ts":"2026-06-23T11:52:50.241Z","logger":"controller-runtime.metrics","msg":"Serving metrics server","bindAddress":":8080","secure":false}
{"level":"info","ts":"2026-06-23T11:52:50.241Z","msg":"starting server","name":"health probe","addr":"[::]:10080"}
{"level":"info","ts":"2026-06-23T11:52:50.241Z","logger":"controller-runtime.webhook","msg":"Starting webhook server"}
{"level":"info","ts":"2026-06-23T11:52:50.241Z","logger":"setup","msg":"disabling http/2"}
{"level":"info","ts":"2026-06-23T11:52:50.241Z","logger":"controller-runtime.webhook","msg":"Serving webhook server","host":"","port":9443}
I0623 11:52:50.342317       1 leaderelection.go:258] "Attempting to acquire leader lease..." lock="capsule-system/42c733ea.clastix.capsule.io"
{"level":"info","ts":"2026-06-23T11:52:50.342Z","logger":"controller-runtime.certwatcher","msg":"Starting certificate poll+watcher","cert":"/tmp/k8s-webhook-server/serving-certs/tls.crt","key":"/tmp/k8s-webhook-server/serving-certs/tls.key","interval":10}
I0623 11:52:50.353629       1 leaderelection.go:272] "Successfully acquired lease" lock="capsule-system/42c733ea.clastix.capsule.io"
{"level":"info","ts":"2026-06-23T11:52:50.360Z","msg":"Starting EventSource","controller":"capsule/tls","controllerGroup":"","controllerKind":"Secret","source":"kind source: *v1.CustomResourceDefinition"}
{"level":"info","ts":"2026-06-23T11:52:50.360Z","msg":"Starting EventSource","controller":"capsule/tls","controllerGroup":"","controllerKind":"Secret","source":"kind source: *v1.Secret"}
{"level":"info","ts":"2026-06-23T11:52:50.360Z","msg":"Starting EventSource","controller":"capsule/tls","controllerGroup":"","controllerKind":"Secret","source":"kind source: *v1.ValidatingWebhookConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.360Z","msg":"Starting EventSource","controller":"capsule/tls","controllerGroup":"","controllerKind":"Secret","source":"kind source: *v1.MutatingWebhookConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.360Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1.ServiceAccount"}
{"level":"info","ts":"2026-06-23T11:52:50.360Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1beta2.Tenant"}
{"level":"info","ts":"2026-06-23T11:52:50.360Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1.NetworkPolicy"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/rbac/roles","controllerGroup":"rbac.authorization.k8s.io","controllerKind":"ClusterRole","source":"kind source: *v1.ClusterRole"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1.LimitRange"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1.ResourceQuota"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/services","controllerGroup":"","controllerKind":"Service","source":"kind source: *v1.Service"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1.RoleBinding"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/rbac/bindings","controllerGroup":"rbac.authorization.k8s.io","controllerKind":"ClusterRoleBinding","source":"kind source: *v1.ClusterRoleBinding"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/rbac/bindings","controllerGroup":"rbac.authorization.k8s.io","controllerKind":"ClusterRoleBinding","source":"kind source: *v1beta2.CapsuleConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1beta2.CapsuleConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1.Namespace"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/tenant-owner-status","controllerGroup":"capsule.clastix.io","controllerKind":"TenantOwner","source":"kind source: *v1beta2.Tenant"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1beta2.RuleStatus"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/pod","controllerGroup":"","controllerKind":"Pod","source":"kind source: *v1.Pod"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/tenant-owner-status","controllerGroup":"capsule.clastix.io","controllerKind":"TenantOwner","source":"kind source: *v1beta2.TenantOwner"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1.StorageClass"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1.PriorityClass"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1.RuntimeClass"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/endpointslices","controllerGroup":"discovery.k8s.io","controllerKind":"EndpointSlice","source":"kind source: *v1.EndpointSlice"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","source":"kind source: *v1beta2.TenantOwner"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/configuration","controllerGroup":"capsule.clastix.io","controllerKind":"CapsuleConfiguration","source":"kind source: *v1beta2.TenantOwner"}
{"level":"info","ts":"2026-06-23T11:52:50.360Z","msg":"Starting EventSource","controller":"capsule/rbac/bindings","controllerGroup":"rbac.authorization.k8s.io","controllerKind":"ClusterRoleBinding","source":"kind source: *v1.ServiceAccount"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/persistentvolumes","controllerGroup":"","controllerKind":"PersistentVolume","source":"kind source: *v1.PersistentVolume"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"config/caches","controllerGroup":"capsule.clastix.io","controllerKind":"CapsuleConfiguration","source":"kind source: *v1.ServiceAccount"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/configuration","controllerGroup":"capsule.clastix.io","controllerKind":"CapsuleConfiguration","source":"kind source: *v1beta2.CapsuleConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/configuration","controllerGroup":"capsule.clastix.io","controllerKind":"CapsuleConfiguration","source":"kind source: *v1beta2.Tenant"}
{"level":"info","ts":"2026-06-23T11:52:50.362Z","msg":"Starting EventSource","controller":"capsule/rule-status","controllerGroup":"capsule.clastix.io","controllerKind":"RuleStatus","source":"kind source: *v1beta2.RuleStatus"}
{"level":"info","ts":"2026-06-23T11:52:50.362Z","msg":"Starting EventSource","controller":"tenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"TenantResource","source":"kind source: *v1beta2.Tenant"}
{"level":"info","ts":"2026-06-23T11:52:50.362Z","msg":"Starting EventSource","controller":"globaltenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"GlobalTenantResource","source":"kind source: *v1beta2.Tenant"}
{"level":"info","ts":"2026-06-23T11:52:50.362Z","msg":"Starting EventSource","controller":"capsule/admission/mutating","controllerGroup":"admissionregistration.k8s.io","controllerKind":"MutatingWebhookConfiguration","source":"kind source: *v1beta2.CapsuleConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.362Z","msg":"Starting EventSource","controller":"tenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"TenantResource","source":"kind source: *v1beta2.TenantResource"}
{"level":"info","ts":"2026-06-23T11:52:50.362Z","msg":"Starting EventSource","controller":"tenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"TenantResource","source":"kind source: *v1beta2.TenantResource"}
{"level":"info","ts":"2026-06-23T11:52:50.362Z","msg":"Starting EventSource","controller":"tenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"TenantResource","source":"kind source: *v1beta2.CapsuleConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.362Z","msg":"Starting EventSource","controller":"tenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"TenantResource","source":"kind source: *v1.Namespace"}
{"level":"info","ts":"2026-06-23T11:52:50.362Z","msg":"Starting EventSource","controller":"globaltenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"GlobalTenantResource","source":"kind source: *v1beta2.GlobalTenantResource"}
{"level":"info","ts":"2026-06-23T11:52:50.362Z","msg":"Starting EventSource","controller":"globaltenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"GlobalTenantResource","source":"kind source: *v1beta2.CapsuleConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.362Z","msg":"Starting EventSource","controller":"globaltenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"GlobalTenantResource","source":"kind source: *v1beta2.GlobalTenantResource"}
{"level":"info","ts":"2026-06-23T11:52:50.362Z","msg":"Starting EventSource","controller":"capsule/admission/validating","controllerGroup":"admissionregistration.k8s.io","controllerKind":"ValidatingWebhookConfiguration","source":"kind source: *v1beta2.CapsuleConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.363Z","msg":"Starting EventSource","controller":"capsule/resourcepools/claims","controllerGroup":"capsule.clastix.io","controllerKind":"ResourcePoolClaim","source":"kind source: *v1beta2.ResourcePool"}
{"level":"info","ts":"2026-06-23T11:52:50.363Z","msg":"Starting EventSource","controller":"capsule/admission/validating","controllerGroup":"admissionregistration.k8s.io","controllerKind":"ValidatingWebhookConfiguration","source":"kind source: *v1.ValidatingWebhookConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.363Z","msg":"Starting EventSource","controller":"capsule/admission/mutating","controllerGroup":"admissionregistration.k8s.io","controllerKind":"MutatingWebhookConfiguration","source":"kind source: *v1.MutatingWebhookConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.363Z","msg":"Starting EventSource","controller":"capsule/resourcepools/claims","controllerGroup":"capsule.clastix.io","controllerKind":"ResourcePoolClaim","source":"kind source: *v1beta2.ResourcePoolClaim"}
{"level":"info","ts":"2026-06-23T11:52:50.361Z","msg":"Starting EventSource","controller":"capsule/configuration","controllerGroup":"capsule.clastix.io","controllerKind":"CapsuleConfiguration","source":"kind source: *v1beta2.Tenant"}
{"level":"info","ts":"2026-06-23T11:52:50.363Z","msg":"Starting EventSource","controller":"globalcustomquota","controllerGroup":"capsule.clastix.io","controllerKind":"GlobalCustomQuota","source":"kind source: *v1.Namespace"}
{"level":"info","ts":"2026-06-23T11:52:50.363Z","msg":"Starting EventSource","controller":"customquota","controllerGroup":"capsule.clastix.io","controllerKind":"CustomQuota","source":"kind source: *v1beta2.QuantityLedger"}
{"level":"info","ts":"2026-06-23T11:52:50.364Z","msg":"Starting EventSource","controller":"globalcustomquota","controllerGroup":"capsule.clastix.io","controllerKind":"GlobalCustomQuota","source":"kind source: *v1beta2.GlobalCustomQuota"}
{"level":"info","ts":"2026-06-23T11:52:50.364Z","msg":"Starting EventSource","controller":"globalcustomquota","controllerGroup":"capsule.clastix.io","controllerKind":"GlobalCustomQuota","source":"kind source: *v1beta2.QuantityLedger"}
{"level":"info","ts":"2026-06-23T11:52:50.364Z","msg":"Starting EventSource","controller":"customquota","controllerGroup":"capsule.clastix.io","controllerKind":"CustomQuota","source":"kind source: *v1beta2.CustomQuota"}
{"level":"info","ts":"2026-06-23T11:52:50.364Z","msg":"Starting EventSource","controller":"capsule/resourcepools/pools","controllerGroup":"capsule.clastix.io","controllerKind":"ResourcePool","source":"kind source: *v1.ResourceQuota"}
{"level":"info","ts":"2026-06-23T11:52:50.364Z","msg":"Starting EventSource","controller":"config/caches","controllerGroup":"capsule.clastix.io","controllerKind":"CapsuleConfiguration","source":"kind source: *v1beta2.CapsuleConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.364Z","msg":"Starting EventSource","controller":"capsule/resourcepools/pools","controllerGroup":"capsule.clastix.io","controllerKind":"ResourcePool","source":"kind source: *v1beta2.ResourcePoolClaim"}
{"level":"info","ts":"2026-06-23T11:52:50.363Z","msg":"Starting EventSource","controller":"capsule/resourcepools/pools","controllerGroup":"capsule.clastix.io","controllerKind":"ResourcePool","source":"kind source: *v1.Namespace"}
{"level":"info","ts":"2026-06-23T11:52:50.364Z","msg":"Starting EventSource","controller":"config/caches","controllerGroup":"capsule.clastix.io","controllerKind":"CapsuleConfiguration","source":"kind source: *v1beta2.CapsuleConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.364Z","msg":"Starting EventSource","controller":"capsule/resourcepools/pools","controllerGroup":"capsule.clastix.io","controllerKind":"ResourcePool","source":"kind source: *v1beta2.ResourcePool"}
{"level":"info","ts":"2026-06-23T11:52:50.461Z","msg":"Starting Controller","controller":"capsule/tenant-owner-status","controllerGroup":"capsule.clastix.io","controllerKind":"TenantOwner"}
{"level":"info","ts":"2026-06-23T11:52:50.462Z","msg":"Starting Controller","controller":"capsule/rule-status","controllerGroup":"capsule.clastix.io","controllerKind":"RuleStatus"}
{"level":"info","ts":"2026-06-23T11:52:50.462Z","msg":"Starting workers","controller":"capsule/rule-status","controllerGroup":"capsule.clastix.io","controllerKind":"RuleStatus","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.462Z","msg":"Starting workers","controller":"capsule/tenant-owner-status","controllerGroup":"capsule.clastix.io","controllerKind":"TenantOwner","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.462Z","msg":"Starting Controller","controller":"capsule/persistentvolumes","controllerGroup":"","controllerKind":"PersistentVolume"}
{"level":"info","ts":"2026-06-23T11:52:50.462Z","msg":"Starting workers","controller":"capsule/persistentvolumes","controllerGroup":"","controllerKind":"PersistentVolume","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.463Z","msg":"Starting Controller","controller":"capsule/resourcepools/claims","controllerGroup":"capsule.clastix.io","controllerKind":"ResourcePoolClaim"}
{"level":"info","ts":"2026-06-23T11:52:50.463Z","msg":"Starting workers","controller":"capsule/resourcepools/claims","controllerGroup":"capsule.clastix.io","controllerKind":"ResourcePoolClaim","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.464Z","msg":"Starting Controller","controller":"globalcustomquota","controllerGroup":"capsule.clastix.io","controllerKind":"GlobalCustomQuota"}
{"level":"info","ts":"2026-06-23T11:52:50.464Z","msg":"Starting workers","controller":"globalcustomquota","controllerGroup":"capsule.clastix.io","controllerKind":"GlobalCustomQuota","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.464Z","msg":"Starting Controller","controller":"customquota","controllerGroup":"capsule.clastix.io","controllerKind":"CustomQuota"}
{"level":"info","ts":"2026-06-23T11:52:50.464Z","msg":"Starting workers","controller":"customquota","controllerGroup":"capsule.clastix.io","controllerKind":"CustomQuota","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.465Z","msg":"Starting Controller","controller":"capsule/resourcepools/pools","controllerGroup":"capsule.clastix.io","controllerKind":"ResourcePool"}
{"level":"info","ts":"2026-06-23T11:52:50.465Z","msg":"Starting workers","controller":"capsule/resourcepools/pools","controllerGroup":"capsule.clastix.io","controllerKind":"ResourcePool","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.560Z","msg":"Starting Controller","controller":"capsule/tls","controllerGroup":"","controllerKind":"Secret"}
{"level":"info","ts":"2026-06-23T11:52:50.560Z","msg":"Starting workers","controller":"capsule/tls","controllerGroup":"","controllerKind":"Secret","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting Controller","controller":"capsule/services","controllerGroup":"","controllerKind":"Service"}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting workers","controller":"capsule/services","controllerGroup":"","controllerKind":"Service","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting Controller","controller":"capsule/rbac/roles","controllerGroup":"rbac.authorization.k8s.io","controllerKind":"ClusterRole"}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting workers","controller":"capsule/rbac/roles","controllerGroup":"rbac.authorization.k8s.io","controllerKind":"ClusterRole","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting Controller","controller":"capsule/configuration","controllerGroup":"capsule.clastix.io","controllerKind":"CapsuleConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting workers","controller":"capsule/configuration","controllerGroup":"capsule.clastix.io","controllerKind":"CapsuleConfiguration","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting Controller","controller":"capsule/pod","controllerGroup":"","controllerKind":"Pod"}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting workers","controller":"capsule/pod","controllerGroup":"","controllerKind":"Pod","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting Controller","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant"}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting workers","controller":"capsule/tenants","controllerGroup":"capsule.clastix.io","controllerKind":"Tenant","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting Controller","controller":"tenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"TenantResource"}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting workers","controller":"tenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"TenantResource","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting Controller","controller":"capsule/rbac/bindings","controllerGroup":"rbac.authorization.k8s.io","controllerKind":"ClusterRoleBinding"}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting workers","controller":"capsule/rbac/bindings","controllerGroup":"rbac.authorization.k8s.io","controllerKind":"ClusterRoleBinding","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting Controller","controller":"capsule/admission/mutating","controllerGroup":"admissionregistration.k8s.io","controllerKind":"MutatingWebhookConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.562Z","msg":"Starting workers","controller":"capsule/admission/mutating","controllerGroup":"admissionregistration.k8s.io","controllerKind":"MutatingWebhookConfiguration","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.563Z","msg":"Starting Controller","controller":"globaltenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"GlobalTenantResource"}
{"level":"info","ts":"2026-06-23T11:52:50.563Z","msg":"Starting workers","controller":"globaltenantresource","controllerGroup":"capsule.clastix.io","controllerKind":"GlobalTenantResource","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.563Z","msg":"Starting Controller","controller":"capsule/endpointslices","controllerGroup":"discovery.k8s.io","controllerKind":"EndpointSlice"}
{"level":"info","ts":"2026-06-23T11:52:50.563Z","msg":"Starting workers","controller":"capsule/endpointslices","controllerGroup":"discovery.k8s.io","controllerKind":"EndpointSlice","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.563Z","msg":"Starting Controller","controller":"capsule/admission/validating","controllerGroup":"admissionregistration.k8s.io","controllerKind":"ValidatingWebhookConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.563Z","msg":"Starting workers","controller":"capsule/admission/validating","controllerGroup":"admissionregistration.k8s.io","controllerKind":"ValidatingWebhookConfiguration","worker count":1}
{"level":"info","ts":"2026-06-23T11:52:50.565Z","msg":"Starting Controller","controller":"config/caches","controllerGroup":"capsule.clastix.io","controllerKind":"CapsuleConfiguration"}
{"level":"info","ts":"2026-06-23T11:52:50.565Z","msg":"Starting workers","controller":"config/caches","controllerGroup":"capsule.clastix.io","controllerKind":"CapsuleConfiguration","worker count":1}

Additional context

  • Capsule version: 0.13.6
  • Helm Chart version: capsule-0.13.6
  • Kubernetes version:
Client Version: v1.32.3
Kustomize Version: v5.5.0
Server Version: v1.33.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    blocked-needs-validationIssue need triage and validationbugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions