Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tenant Resource Quota admission controller doesn't block resources creation #49

Open
bsctl opened this issue Aug 10, 2020 · 9 comments · Fixed by #1088
Open

Tenant Resource Quota admission controller doesn't block resources creation #49

bsctl opened this issue Aug 10, 2020 · 9 comments · Fixed by #1088
Assignees
Labels
bug Something isn't working help wanted Extra attention is needed needs-discussion No outline on the feature, discussion is welcome

Comments

@bsctl
Copy link
Member

bsctl commented Aug 10, 2020

Bug description

Tenant Resource Quota admission controller doesn't block resources creation

How to reproduce

As cluster admin:

cmp~/Shared/capsule$ kubectl get tenants
NAME   NAMESPACE QUOTA   NAMESPACE COUNT   OWNER   AGE
oil    3                 3                 alice   161m

A tenant owner:

$ kubectl -n oil-production get quota
NAME            AGE    REQUEST                                      LIMIT
capsule-oil-0   161m   requests.cpu: 0/8, requests.memory: 0/16Gi   limits.cpu: 0/8, limits.memory: 0/16Gi
capsule-oil-1   161m   pods: 0/10                                   
capsule-oil-2   161m   requests.storage: 0/100Gi                    
$ kubectl -n oil-development get quota
NAME            AGE    REQUEST                                      LIMIT
capsule-oil-0   161m   requests.cpu: 0/8, requests.memory: 0/16Gi   limits.cpu: 0/8, limits.memory: 0/16Gi
capsule-oil-1   161m   pods: 0/10                                   
capsule-oil-2   161m   requests.storage: 0/100Gi                    
$ kubectl -n oil-test get quota
NAME            AGE    REQUEST                                      LIMIT
capsule-oil-0   161m   requests.cpu: 0/8, requests.memory: 0/16Gi   limits.cpu: 0/8, limits.memory: 0/16Gi
capsule-oil-1   161m   pods: 0/10                                   
capsule-oil-2   161m   requests.storage: 0/100Gi

check used quota at tenant level

$ kubectl -n oil-production get quota capsule-oil-1 -o yaml | grep quota.capsule.clastix.io/used-pods
    quota.capsule.clastix.io/used-pods: "0"

scale up pods

kubectl -n oil-production scale rs nginx --replicas=3
kubectl -n oil-development scale rs nginx --replicas=3
kubectl -n oil-test scale rs nginx --replicas=5

and check quota:

kubectl -n oil-production get quota capsule-oil-1 -o yaml | grep quota.capsule.clastix.io/used-pods
    quota.capsule.clastix.io/used-pods: "11"

kubectl -n oil-production describe quota capsule-oil-1 
Name:       capsule-oil-1
Namespace:  oil-production
Resource    Used  Hard
--------    ----  ----
pods        3     3                   <-- see hard quota!!!

kubectl -n oil-test describe quota capsule-oil-1 
Name:       capsule-oil-1
Namespace:  oil-test
Resource    Used  Hard
--------    ----  ----
pods        5     5

Expected behavior

Tenant Resource Quota admission controller should block resource creation crossing the set quota.

Logs

Capsule controller has been started with following args but I do see only INFO

      containers:
      - args:
        - --metrics-addr=127.0.0.1:8080
        - --enable-leader-election
        - --zap-log-level=10
        - --zap-devel
        command:
        - /manager
        image: quay.io/clastix/capsule:latest
2020-08-10T10:22:00.793Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 0   {"Request.Name": "oil"}
2020-08-10T10:22:00.942Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-test"}
2020-08-10T10:22:00.942Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:22:00.942Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:22:01.093Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-test"}
2020-08-10T10:22:01.093Z        INFO    controllers.Tenant      Ensuring RoleBinding for owner  {"Request.Name": "oil"}
2020-08-10T10:22:01.096Z        INFO    controllers.Tenant      Role Binding sync result: updated       {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-development"}
2020-08-10T10:22:01.096Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-development"}
2020-08-10T10:22:01.097Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-production"}
2020-08-10T10:22:01.097Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-production"}
2020-08-10T10:22:01.097Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-test"}
2020-08-10T10:22:01.097Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-test"}
2020-08-10T10:22:01.097Z        INFO    controllers.Tenant      Ensuring Namespace count        {"Request.Name": "oil"}
2020-08-10T10:22:01.107Z        INFO    controllers.Tenant      Tenant reconciling completed    {"Request.Name": "oil"}
2020-08-10T10:32:29.193Z        INFO    controllers.Tenant      Starting processing of Namespaces       {"Request.Name": "oil", "items": 3}
2020-08-10T10:32:29.203Z        INFO    controllers.Tenant      Starting processing of Network Policies {"Request.Name": "oil", "items": 1}
2020-08-10T10:32:29.204Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:32:29.220Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:32:29.220Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:32:29.252Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:32:29.252Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:32:29.262Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:32:29.262Z        INFO    controllers.Tenant      Starting processing of Node Selector    {"Request.Name": "oil"}
2020-08-10T10:32:29.263Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-development"}
2020-08-10T10:32:29.263Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-production"}
2020-08-10T10:32:29.263Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-test"}
2020-08-10T10:32:29.263Z        INFO    controllers.Tenant      Starting processing of Limit Ranges     {"Request.Name": "oil", "items": 1}
2020-08-10T10:32:29.263Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:32:29.290Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:32:29.290Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:32:29.330Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:32:29.330Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:32:29.340Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:32:29.341Z        INFO    controllers.Tenant      Starting processing of Resource Quotas  {"Request.Name": "oil", "items": 3}
2020-08-10T10:32:29.342Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:32:29.358Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:32:29.358Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 30Mi     {"Request.Name": "oil"}
2020-08-10T10:32:29.380Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:32:29.381Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 600m  {"Request.Name": "oil"}
2020-08-10T10:32:29.459Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:32:29.459Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 300Mi      {"Request.Name": "oil"}
2020-08-10T10:32:29.485Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:32:29.485Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 300m        {"Request.Name": "oil"}
2020-08-10T10:32:29.519Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:32:29.520Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:32:29.520Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 3   {"Request.Name": "oil"}
2020-08-10T10:32:29.546Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-development"}
2020-08-10T10:32:29.546Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:32:29.546Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:32:29.565Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-development"}
2020-08-10T10:32:29.565Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:32:29.568Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:32:29.568Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 30Mi     {"Request.Name": "oil"}
2020-08-10T10:32:29.579Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:32:29.579Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 600m  {"Request.Name": "oil"}
2020-08-10T10:32:29.595Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:32:29.595Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 300Mi      {"Request.Name": "oil"}
2020-08-10T10:32:29.607Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:32:29.607Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 300m        {"Request.Name": "oil"}
2020-08-10T10:32:29.631Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:32:29.631Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:32:29.631Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 3   {"Request.Name": "oil"}
2020-08-10T10:32:29.748Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-production"}
2020-08-10T10:32:29.748Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:32:29.748Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:32:29.919Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-production"}
2020-08-10T10:32:29.919Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:32:29.950Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:32:29.950Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 30Mi     {"Request.Name": "oil"}
2020-08-10T10:32:30.098Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:32:30.098Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 600m  {"Request.Name": "oil"}
2020-08-10T10:32:30.248Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:32:30.248Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 300Mi      {"Request.Name": "oil"}
2020-08-10T10:32:30.398Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:32:30.398Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 300m        {"Request.Name": "oil"}
2020-08-10T10:32:30.548Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:32:30.548Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:32:30.548Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 3   {"Request.Name": "oil"}
2020-08-10T10:32:30.697Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-test"}
2020-08-10T10:32:30.697Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:32:30.697Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:32:30.850Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-test"}
2020-08-10T10:32:30.850Z        INFO    controllers.Tenant      Ensuring RoleBinding for owner  {"Request.Name": "oil"}
2020-08-10T10:32:30.856Z        INFO    controllers.Tenant      Role Binding sync result: updated       {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-test"}
2020-08-10T10:32:30.856Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-test"}
2020-08-10T10:32:30.857Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-development"}
2020-08-10T10:32:30.857Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-development"}
2020-08-10T10:32:30.857Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-production"}
2020-08-10T10:32:30.857Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-production"}
2020-08-10T10:32:30.857Z        INFO    controllers.Tenant      Ensuring Namespace count        {"Request.Name": "oil"}
2020-08-10T10:32:30.871Z        INFO    controllers.Tenant      Tenant reconciling completed    {"Request.Name": "oil"}
2020-08-10T10:32:30.871Z        INFO    controllers.Tenant      Starting processing of Namespaces       {"Request.Name": "oil", "items": 3}
2020-08-10T10:32:30.884Z        INFO    controllers.Tenant      Starting processing of Network Policies {"Request.Name": "oil", "items": 1}
2020-08-10T10:32:30.884Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:32:30.887Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:32:30.887Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:32:30.891Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:32:30.891Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:32:30.894Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:32:30.894Z        INFO    controllers.Tenant      Starting processing of Node Selector    {"Request.Name": "oil"}
2020-08-10T10:32:30.894Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-development"}
2020-08-10T10:32:30.895Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-production"}
2020-08-10T10:32:30.895Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-test"}
2020-08-10T10:32:30.895Z        INFO    controllers.Tenant      Starting processing of Limit Ranges     {"Request.Name": "oil", "items": 1}
2020-08-10T10:32:30.895Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:32:30.898Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:32:30.898Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:32:30.903Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:32:30.903Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:32:30.907Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:32:30.907Z        INFO    controllers.Tenant      Starting processing of Resource Quotas  {"Request.Name": "oil", "items": 3}
2020-08-10T10:32:30.907Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:32:30.912Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:32:30.912Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 300Mi      {"Request.Name": "oil"}
2020-08-10T10:32:31.050Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:32:31.050Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 300m        {"Request.Name": "oil"}
2020-08-10T10:32:31.198Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:32:31.198Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 30Mi     {"Request.Name": "oil"}
2020-08-10T10:32:31.347Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:32:31.347Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 600m  {"Request.Name": "oil"}
2020-08-10T10:32:31.497Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:32:31.498Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:32:31.498Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 3   {"Request.Name": "oil"}
2020-08-10T10:32:31.647Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-development"}
2020-08-10T10:32:31.648Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:32:31.648Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:32:31.797Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-development"}
2020-08-10T10:32:31.797Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:32:31.846Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:32:31.846Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 30Mi     {"Request.Name": "oil"}
2020-08-10T10:32:31.997Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:32:31.997Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 600m  {"Request.Name": "oil"}
2020-08-10T10:32:32.147Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:32:32.147Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 300Mi      {"Request.Name": "oil"}
2020-08-10T10:32:32.303Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:32:32.303Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 300m        {"Request.Name": "oil"}
2020-08-10T10:32:32.450Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:32:32.451Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:32:32.451Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 3   {"Request.Name": "oil"}
2020-08-10T10:32:32.600Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-production"}
2020-08-10T10:32:32.601Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:32:32.601Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:32:32.747Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-production"}
2020-08-10T10:32:32.747Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:32:32.795Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:32:32.796Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 30Mi     {"Request.Name": "oil"}
2020-08-10T10:32:32.947Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:32:32.947Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 600m  {"Request.Name": "oil"}
2020-08-10T10:32:33.097Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:32:33.097Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 300Mi      {"Request.Name": "oil"}
2020-08-10T10:32:33.247Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:32:33.247Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 300m        {"Request.Name": "oil"}
2020-08-10T10:32:33.398Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:32:33.398Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:32:33.398Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 3   {"Request.Name": "oil"}
2020-08-10T10:32:33.546Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-test"}
2020-08-10T10:32:33.547Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:32:33.547Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:32:33.697Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-test"}
2020-08-10T10:32:33.697Z        INFO    controllers.Tenant      Ensuring RoleBinding for owner  {"Request.Name": "oil"}
2020-08-10T10:32:33.701Z        INFO    controllers.Tenant      Role Binding sync result: updated       {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-development"}
2020-08-10T10:32:33.701Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-development"}
2020-08-10T10:32:33.702Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-production"}
2020-08-10T10:32:33.702Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-production"}
2020-08-10T10:32:33.702Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-test"}
2020-08-10T10:32:33.702Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-test"}
2020-08-10T10:32:33.702Z        INFO    controllers.Tenant      Ensuring Namespace count        {"Request.Name": "oil"}
2020-08-10T10:32:33.712Z        INFO    controllers.Tenant      Tenant reconciling completed    {"Request.Name": "oil"}
2020-08-10T10:32:43.303Z        INFO    controllers.Tenant      Starting processing of Namespaces       {"Request.Name": "oil", "items": 3}
2020-08-10T10:32:43.357Z        INFO    controllers.Tenant      Starting processing of Network Policies {"Request.Name": "oil", "items": 1}
2020-08-10T10:32:43.358Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:32:43.388Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:32:43.388Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:32:43.410Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:32:43.410Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:32:43.427Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:32:43.427Z        INFO    controllers.Tenant      Starting processing of Node Selector    {"Request.Name": "oil"}
2020-08-10T10:32:43.427Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-development"}
2020-08-10T10:32:43.428Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-production"}
2020-08-10T10:32:43.428Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-test"}
2020-08-10T10:32:43.428Z        INFO    controllers.Tenant      Starting processing of Limit Ranges     {"Request.Name": "oil", "items": 1}
2020-08-10T10:32:43.428Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:32:43.441Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:32:43.441Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:32:43.447Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:32:43.447Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:32:43.460Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:32:43.460Z        INFO    controllers.Tenant      Starting processing of Resource Quotas  {"Request.Name": "oil", "items": 3}
2020-08-10T10:32:43.460Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:32:43.463Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:32:43.463Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 1200m {"Request.Name": "oil"}
2020-08-10T10:32:43.499Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:32:43.499Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 600Mi      {"Request.Name": "oil"}
2020-08-10T10:32:43.513Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:32:43.513Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 600m        {"Request.Name": "oil"}
2020-08-10T10:32:43.534Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:32:43.535Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 60Mi     {"Request.Name": "oil"}
2020-08-10T10:32:43.547Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:32:43.547Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:32:43.547Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 6   {"Request.Name": "oil"}
2020-08-10T10:32:43.579Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-development"}
2020-08-10T10:32:43.579Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:32:43.579Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:32:43.603Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-development"}
2020-08-10T10:32:43.603Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:32:43.609Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:32:43.609Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 600m        {"Request.Name": "oil"}
2020-08-10T10:32:43.621Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:32:43.621Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 60Mi     {"Request.Name": "oil"}
2020-08-10T10:32:43.632Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:32:43.632Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 1200m {"Request.Name": "oil"}
2020-08-10T10:32:43.644Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:32:43.644Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 600Mi      {"Request.Name": "oil"}
2020-08-10T10:32:43.657Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:32:43.657Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:32:43.657Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 6   {"Request.Name": "oil"}
2020-08-10T10:32:43.717Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-production"}
2020-08-10T10:32:43.717Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:32:43.717Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:32:43.898Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-production"}
2020-08-10T10:32:43.899Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:32:43.914Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:32:43.914Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 1200m {"Request.Name": "oil"}
2020-08-10T10:32:44.066Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:32:44.066Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 600Mi      {"Request.Name": "oil"}
2020-08-10T10:32:44.219Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:32:44.219Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 600m        {"Request.Name": "oil"}
2020-08-10T10:32:44.366Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:32:44.366Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 60Mi     {"Request.Name": "oil"}
2020-08-10T10:32:44.517Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:32:44.517Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:32:44.517Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 6   {"Request.Name": "oil"}
2020-08-10T10:32:44.667Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-test"}
2020-08-10T10:32:44.667Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:32:44.667Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:32:44.816Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-test"}
2020-08-10T10:32:44.816Z        INFO    controllers.Tenant      Ensuring RoleBinding for owner  {"Request.Name": "oil"}
2020-08-10T10:32:44.820Z        INFO    controllers.Tenant      Role Binding sync result: updated       {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-development"}
2020-08-10T10:32:44.820Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-production"}
2020-08-10T10:32:44.821Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-production"}
2020-08-10T10:32:44.821Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-test"}
2020-08-10T10:32:44.821Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-test"}
2020-08-10T10:32:44.821Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-development"}
2020-08-10T10:32:44.821Z        INFO    controllers.Tenant      Ensuring Namespace count        {"Request.Name": "oil"}
2020-08-10T10:32:44.833Z        INFO    controllers.Tenant      Tenant reconciling completed    {"Request.Name": "oil"}
2020-08-10T10:32:44.833Z        INFO    controllers.Tenant      Starting processing of Namespaces       {"Request.Name": "oil", "items": 3}
2020-08-10T10:32:44.845Z        INFO    controllers.Tenant      Starting processing of Network Policies {"Request.Name": "oil", "items": 1}
2020-08-10T10:32:44.845Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:32:44.850Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:32:44.850Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:32:44.854Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:32:44.854Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:32:44.858Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:32:44.858Z        INFO    controllers.Tenant      Starting processing of Node Selector    {"Request.Name": "oil"}
2020-08-10T10:32:44.859Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-development"}
2020-08-10T10:32:44.859Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-production"}
2020-08-10T10:32:44.859Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-test"}
2020-08-10T10:32:44.859Z        INFO    controllers.Tenant      Starting processing of Limit Ranges     {"Request.Name": "oil", "items": 1}
2020-08-10T10:32:44.859Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:32:44.863Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:32:44.863Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:32:44.866Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:32:44.866Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:32:44.871Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:32:44.871Z        INFO    controllers.Tenant      Starting processing of Resource Quotas  {"Request.Name": "oil", "items": 3}
2020-08-10T10:32:44.871Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:32:44.876Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:32:44.876Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 1200m {"Request.Name": "oil"}
2020-08-10T10:32:45.016Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:32:45.016Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 600Mi      {"Request.Name": "oil"}
2020-08-10T10:32:45.166Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:32:45.166Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 600m        {"Request.Name": "oil"}
2020-08-10T10:32:45.315Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:32:45.315Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 60Mi     {"Request.Name": "oil"}
2020-08-10T10:32:45.466Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:32:45.466Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:32:45.466Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 6   {"Request.Name": "oil"}
2020-08-10T10:32:45.615Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-development"}
2020-08-10T10:32:45.615Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:32:45.615Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:32:45.765Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-development"}
2020-08-10T10:32:45.765Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:32:45.814Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:32:45.814Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 600m        {"Request.Name": "oil"}
2020-08-10T10:32:45.965Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:32:45.965Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 60Mi     {"Request.Name": "oil"}
2020-08-10T10:32:46.115Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:32:46.115Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 1200m {"Request.Name": "oil"}
2020-08-10T10:32:46.265Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:32:46.265Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 600Mi      {"Request.Name": "oil"}
2020-08-10T10:32:46.416Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:32:46.416Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:32:46.416Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 6   {"Request.Name": "oil"}
2020-08-10T10:32:46.564Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-production"}
2020-08-10T10:32:46.565Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:32:46.565Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:32:46.726Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-production"}
2020-08-10T10:32:46.726Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:32:46.764Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:32:46.764Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 600m        {"Request.Name": "oil"}
2020-08-10T10:32:46.918Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:32:46.918Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 60Mi     {"Request.Name": "oil"}
2020-08-10T10:32:47.065Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:32:47.065Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 1200m {"Request.Name": "oil"}
2020-08-10T10:32:47.215Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:32:47.215Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 600Mi      {"Request.Name": "oil"}
2020-08-10T10:32:47.366Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:32:47.366Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:32:47.366Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 6   {"Request.Name": "oil"}
2020-08-10T10:32:47.515Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-test"}
2020-08-10T10:32:47.516Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:32:47.516Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:32:47.667Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-test"}
2020-08-10T10:32:47.667Z        INFO    controllers.Tenant      Ensuring RoleBinding for owner  {"Request.Name": "oil"}
2020-08-10T10:32:47.673Z        INFO    controllers.Tenant      Role Binding sync result: updated       {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-development"}
2020-08-10T10:32:47.674Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-production"}
2020-08-10T10:32:47.674Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-production"}
2020-08-10T10:32:47.674Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-test"}
2020-08-10T10:32:47.674Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-test"}
2020-08-10T10:32:47.674Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-development"}
2020-08-10T10:32:47.674Z        INFO    controllers.Tenant      Ensuring Namespace count        {"Request.Name": "oil"}
2020-08-10T10:32:47.683Z        INFO    controllers.Tenant      Tenant reconciling completed    {"Request.Name": "oil"}
2020-08-10T10:33:11.273Z        INFO    controllers.Tenant      Starting processing of Namespaces       {"Request.Name": "oil", "items": 3}
2020-08-10T10:33:11.283Z        INFO    controllers.Tenant      Starting processing of Network Policies {"Request.Name": "oil", "items": 1}
2020-08-10T10:33:11.284Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:33:11.292Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:33:11.292Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:33:11.318Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:33:11.318Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:33:11.347Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:33:11.347Z        INFO    controllers.Tenant      Starting processing of Node Selector    {"Request.Name": "oil"}
2020-08-10T10:33:11.347Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-development"}
2020-08-10T10:33:11.347Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-production"}
2020-08-10T10:33:11.347Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-test"}
2020-08-10T10:33:11.347Z        INFO    controllers.Tenant      Starting processing of Limit Ranges     {"Request.Name": "oil", "items": 1}
2020-08-10T10:33:11.347Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:33:11.353Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:33:11.353Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:33:11.361Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:33:11.362Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:33:11.375Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:33:11.375Z        INFO    controllers.Tenant      Starting processing of Resource Quotas  {"Request.Name": "oil", "items": 3}
2020-08-10T10:33:11.375Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:33:11.414Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:33:11.414Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 1800m {"Request.Name": "oil"}
2020-08-10T10:33:11.507Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:33:11.507Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 900Mi      {"Request.Name": "oil"}
2020-08-10T10:33:11.608Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:33:11.609Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 900m        {"Request.Name": "oil"}
2020-08-10T10:33:11.654Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:33:11.654Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 90Mi     {"Request.Name": "oil"}
2020-08-10T10:33:11.730Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:33:11.730Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:33:11.730Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 11  {"Request.Name": "oil"}
2020-08-10T10:33:11.769Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-development"}
2020-08-10T10:33:11.769Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:33:11.769Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:33:11.806Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-development"}
2020-08-10T10:33:11.806Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:33:11.822Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:33:11.822Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 2200m {"Request.Name": "oil"}
2020-08-10T10:33:11.869Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:33:11.869Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 1100Mi     {"Request.Name": "oil"}
2020-08-10T10:33:11.889Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:33:11.889Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 1100m       {"Request.Name": "oil"}
2020-08-10T10:33:11.925Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:33:11.925Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 110Mi    {"Request.Name": "oil"}
2020-08-10T10:33:11.939Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:33:11.939Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:33:11.939Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 11  {"Request.Name": "oil"}
2020-08-10T10:33:12.000Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-production"}
2020-08-10T10:33:12.001Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:33:12.001Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:33:12.010Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-production"}
2020-08-10T10:33:12.010Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:33:12.014Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:33:12.014Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 2200m {"Request.Name": "oil"}
2020-08-10T10:33:12.135Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:33:12.135Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 1100Mi     {"Request.Name": "oil"}
2020-08-10T10:33:12.282Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:33:12.282Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 1100m       {"Request.Name": "oil"}
2020-08-10T10:33:12.434Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:33:12.434Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 110Mi    {"Request.Name": "oil"}
2020-08-10T10:33:12.599Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:33:12.599Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:33:12.599Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 11  {"Request.Name": "oil"}
2020-08-10T10:33:12.731Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-test"}
2020-08-10T10:33:12.731Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:33:12.731Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:33:12.881Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-test"}
2020-08-10T10:33:12.882Z        INFO    controllers.Tenant      Ensuring RoleBinding for owner  {"Request.Name": "oil"}
2020-08-10T10:33:12.886Z        INFO    controllers.Tenant      Role Binding sync result: updated       {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-development"}
2020-08-10T10:33:12.886Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-development"}
2020-08-10T10:33:12.886Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-production"}
2020-08-10T10:33:12.887Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-production"}
2020-08-10T10:33:12.887Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-test"}
2020-08-10T10:33:12.887Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-test"}
2020-08-10T10:33:12.887Z        INFO    controllers.Tenant      Ensuring Namespace count        {"Request.Name": "oil"}
2020-08-10T10:33:12.898Z        INFO    controllers.Tenant      Tenant reconciling completed    {"Request.Name": "oil"}
2020-08-10T10:33:12.898Z        INFO    controllers.Tenant      Starting processing of Namespaces       {"Request.Name": "oil", "items": 3}
2020-08-10T10:33:12.909Z        INFO    controllers.Tenant      Starting processing of Network Policies {"Request.Name": "oil", "items": 1}
2020-08-10T10:33:12.909Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:33:12.914Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:33:12.914Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:33:12.917Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:33:12.917Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/network-policy notin (0) {"Request.Name": "oil"}
2020-08-10T10:33:12.921Z        INFO    controllers.Tenant      Network Policy sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:33:12.921Z        INFO    controllers.Tenant      Starting processing of Node Selector    {"Request.Name": "oil"}
2020-08-10T10:33:12.921Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-development"}
2020-08-10T10:33:12.921Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-production"}
2020-08-10T10:33:12.921Z        INFO    controllers.Tenant      Namespace Node  sync result: unchanged  {"Request.Name": "oil", "name": "oil-test"}
2020-08-10T10:33:12.921Z        INFO    controllers.Tenant      Starting processing of Limit Ranges     {"Request.Name": "oil", "items": 1}
2020-08-10T10:33:12.921Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:33:12.925Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:33:12.925Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:33:12.928Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:33:12.928Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/limit-range notin (0)    {"Request.Name": "oil"}
2020-08-10T10:33:12.931Z        INFO    controllers.Tenant      LimitRange sync result: unchanged       {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:33:12.931Z        INFO    controllers.Tenant      Starting processing of Resource Quotas  {"Request.Name": "oil", "items": 3}
2020-08-10T10:33:12.931Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:33:12.935Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:33:12.935Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 1100Mi     {"Request.Name": "oil"}
2020-08-10T10:33:13.082Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:33:13.082Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 1100m       {"Request.Name": "oil"}
2020-08-10T10:33:13.237Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:33:13.237Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 110Mi    {"Request.Name": "oil"}
2020-08-10T10:33:13.399Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:33:13.399Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 2200m {"Request.Name": "oil"}
2020-08-10T10:33:13.531Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-development"}
2020-08-10T10:33:13.532Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:33:13.532Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 11  {"Request.Name": "oil"}
2020-08-10T10:33:13.680Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-development"}
2020-08-10T10:33:13.681Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:33:13.681Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:33:13.830Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-development"}
2020-08-10T10:33:13.830Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:33:13.880Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:33:13.880Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 1100Mi     {"Request.Name": "oil"}
2020-08-10T10:33:14.032Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:33:14.032Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 1100m       {"Request.Name": "oil"}
2020-08-10T10:33:14.181Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:33:14.181Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 110Mi    {"Request.Name": "oil"}
2020-08-10T10:33:14.330Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:33:14.330Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 2200m {"Request.Name": "oil"}
2020-08-10T10:33:14.481Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-production"}
2020-08-10T10:33:14.482Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:33:14.482Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 11  {"Request.Name": "oil"}
2020-08-10T10:33:14.630Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-production"}
2020-08-10T10:33:14.630Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:33:14.630Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:33:14.781Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-production"}
2020-08-10T10:33:14.781Z        INFO    controllers.Tenant      Pruning objects with label selector capsule.clastix.io/resource-quota notin (0,1,2)     {"Request.Name": "oil"}
2020-08-10T10:33:14.829Z        INFO    controllers.Tenant      Desired hard limits.cpu quota is 8      {"Request.Name": "oil"}
2020-08-10T10:33:14.829Z        INFO    controllers.Tenant      Computed limits.cpu quota for the whole Tenant is 2200m {"Request.Name": "oil"}
2020-08-10T10:33:14.981Z        INFO    controllers.Tenant      Desired hard limits.memory quota is 16Gi        {"Request.Name": "oil"}
2020-08-10T10:33:14.981Z        INFO    controllers.Tenant      Computed limits.memory quota for the whole Tenant is 1100Mi     {"Request.Name": "oil"}
2020-08-10T10:33:15.130Z        INFO    controllers.Tenant      Desired hard requests.cpu quota is 8    {"Request.Name": "oil"}
2020-08-10T10:33:15.130Z        INFO    controllers.Tenant      Computed requests.cpu quota for the whole Tenant is 1100m       {"Request.Name": "oil"}
2020-08-10T10:33:15.280Z        INFO    controllers.Tenant      Desired hard requests.memory quota is 16Gi      {"Request.Name": "oil"}
2020-08-10T10:33:15.281Z        INFO    controllers.Tenant      Computed requests.memory quota for the whole Tenant is 110Mi    {"Request.Name": "oil"}
2020-08-10T10:33:15.431Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-0", "namespace": "oil-test"}
2020-08-10T10:33:15.431Z        INFO    controllers.Tenant      Desired hard pods quota is 10   {"Request.Name": "oil"}
2020-08-10T10:33:15.431Z        INFO    controllers.Tenant      Computed pods quota for the whole Tenant is 11  {"Request.Name": "oil"}
2020-08-10T10:33:15.580Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-1", "namespace": "oil-test"}
2020-08-10T10:33:15.581Z        INFO    controllers.Tenant      Desired hard requests.storage quota is 100Gi    {"Request.Name": "oil"}
2020-08-10T10:33:15.581Z        INFO    controllers.Tenant      Computed requests.storage quota for the whole Tenant is 0       {"Request.Name": "oil"}
2020-08-10T10:33:15.730Z        INFO    controllers.Tenant      Resource Quota sync result: unchanged   {"Request.Name": "oil", "name": "capsule-oil-2", "namespace": "oil-test"}
2020-08-10T10:33:15.730Z        INFO    controllers.Tenant      Ensuring RoleBinding for owner  {"Request.Name": "oil"}
2020-08-10T10:33:15.734Z        INFO    controllers.Tenant      Role Binding sync result: updated       {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-development"}
2020-08-10T10:33:15.734Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-development"}
2020-08-10T10:33:15.734Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-production"}
2020-08-10T10:33:15.734Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-production"}
2020-08-10T10:33:15.734Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:admin", "namespace": "oil-test"}
2020-08-10T10:33:15.735Z        INFO    controllers.Tenant      Role Binding sync result: unchanged     {"Request.Name": "oil", "name": "namespace:deleter", "namespace": "oil-test"}
2020-08-10T10:33:15.735Z        INFO    controllers.Tenant      Ensuring Namespace count        {"Request.Name": "oil"}
2020-08-10T10:33:15.743Z        INFO    controllers.Tenant      Tenant reconciling completed    {"Request.Name": "oil"}

Additional context

  • Capsule version: (capsule --version)
  • Kubernetes version: (kubectl version)
@bsctl bsctl added bug Something isn't working blocked-needs-validation Issue need triage and validation high-priority Feature Request with high-priority labels Aug 10, 2020
@bsctl
Copy link
Member Author

bsctl commented Aug 10, 2020

#14

@prometherion
Copy link
Member

I'm aware of this behavior and it's a viable trade-off, although not entirely satisfying.

I'm still trying to figure out how to apply these constraints without reinventing the wheel and ensuring the hard quota is absolutely honored.

Right now, Capsule is setting the Tenant quotas to each Namespace handled by it and watching for events: once the sum of the used resources across all the Namespace resources is exceeded, we're blocking them as you noticed.

Using this poor trick works well since we don't need a further CRD, and no need to listen on multiple Validating webhooks since there could be tons of resources handled by Quota ones.

Regarding #14, I guess it's not related: as you said, the update is processed correctly.

Let's keep this one open and try to figure out in the future how to implement a better strategy.

@prometherion prometherion removed the blocked-needs-validation Issue need triage and validation label Aug 10, 2020
@prometherion prometherion self-assigned this Aug 10, 2020
@prometherion prometherion added help wanted Extra attention is needed needs-discussion No outline on the feature, discussion is welcome labels Aug 10, 2020
@prometherion prometherion added the v0.1.0 To be implemented/hotfixed for 0.1.0 label Sep 9, 2020
@bsctl bsctl removed high-priority Feature Request with high-priority v0.1.0 To be implemented/hotfixed for 0.1.0 labels May 6, 2021
@bsctl bsctl removed this from 0.1.0 in Capsule Release Planning May 6, 2021
@oliverbaehler
Copy link
Collaborator

Hi @prometherion, I think it's going to be important to address this problem in a future release. While it may be viable for use to scope a tenant quota to eg. hosts which kinda hard enforce the tenant quota, we should honour the resource stretched on a tenant. I am happy to develop this with you.

The last call was, that we are looking for new ideas how to solve, while I am certainly not experienced enough to come up with a smart idea, I asked ChatGPT what it thinks about the problem. Here are it's best thoughts:

Here are a few ideas for how you might address these issues:
  1. Enforce quotas at the API level: Instead of relying on annotations to enforce quotas, you could use the Kubernetes API server to enforce quotas directly. The API server has built-in support for resource quotas, and you can use it to enforce limits on the number of objects that can be created in a namespace, as well as limits on the resource usage of those objects. By enforcing quotas at the API level, you can ensure that they can't be bypassed or modified by users.

  2. Use resource quotas in combination with limit ranges: Limit ranges allow you to specify minimum and maximum resource limits for objects in a namespace. You can use limit ranges in combination with resource quotas to provide a more fine-grained level of control over resource allocation. For example, you could use a limit range to set a minimum limit for CPU and memory usage, and then use a resource quota to set a maximum limit. This way, you can ensure that each tenant has access to a minimum level of resources, while still enforcing a maximum limit to prevent overuse.

  3. Implement a queueing system for resource allocation: If you are concerned about racing conditions when multiple tenants are trying to allocate resources simultaneously, you could implement a queueing system to manage resource allocation requests. This could be as simple as a first-in, first-out queue, or you could use a more sophisticated system that takes into account factors such as the priority of the request or the available resources in the cluster. By using a queueing system, you can ensure that resource allocation requests are processed in a predictable and fair manner.

idea 3 seems interesting. tell me more

  1. Define a custom resource definition (CRD) for resource allocation requests. This resource should contain metadata about the tenant making the request, the resources being requested, and any other relevant information.

  2. Create a controller for the resource allocation request CRD. This controller will watch for new resource allocation requests and add them to a queue.

  3. Implement a resource allocation process that runs periodically (e.g., every minute). This process should dequeue resource allocation requests from the queue and process them one by one.

  4. When processing a resource allocation request, the resource allocation process should check if the requested resources are available in the cluster. If they are not, the request should be rejected. If the resources are available, the process should create the requested objects (e.g., pods, services, etc.) and update the tenant's resource quota to reflect the additional usage.

  5. To ensure that the queue is processed in a predictable and fair manner, you might want to consider implementing priority levels for resource allocation requests. For example, you could give higher priority to requests from tenants with lower usage or to requests that are requesting fewer resources. You could also implement a maximum queue size to prevent the queue from growing too large and consuming too many resources.

Do you think something similar is achievable without a dedicated controller? We tried to overcome this odd scenario by creating a validation webhook to stop the update of the ResourceQuota object, thinking this would have prevented the odd scenario

It is possible to implement a queueing system for resource allocation without using a dedicated controller, but it will likely be more complex and may not provide the same level of control and guarantees as a dedicated controller.

One approach you could take is to use a combination of Kubernetes custom resources, admission webhooks, and a separate application to manage resource allocation requests. Here's an overview of how this might work:

  1. Define a custom resource definition (CRD) for resource allocation requests. This resource should contain metadata about the tenant making the request, the resources being requested, and any other relevant information.

  2. Implement an admission webhook that intercepts resource allocation requests and adds them to a queue. The admission webhook could be implemented as a separate application that communicates with the Kubernetes API server using the webhook admission control mechanism.

  3. Implement a resource allocation process that runs periodically (e.g., every minute). This process should dequeue resource allocation requests from the queue and process them one by one.

  4. When processing a resource allocation request, the resource allocation process should check if the requested resources are available in the cluster. If they are not, the request should be rejected. If the resources are available, the process should create the requested objects (e.g., pods, services, etc.) and update the tenant's resource quota to reflect the additional usage.

Using this approach, you can intercept resource allocation requests and add them to a queue before they are processed by the Kubernetes API server. This allows you to implement a more sophisticated resource allocation process that can take into account factors such as the priority of the request or the available resources in the cluster.

However, it's important to note that this approach may not provide the same level of control and guarantees as a dedicated controller. For example, if the resource allocation process fails or is unable to complete a request, it may be difficult to handle the error and ensure that the request is eventually processed. Additionally, the admission webhook may not be able to intercept all resource allocation requests, depending on the scope of the webhook and the types of objects being created.

Already some interesting approaches. I ll have some more conversations and see what comes around.. :)

@prometherion
Copy link
Member

prometherion commented Jan 2, 2023

All the proposals suggested by ChatGPT are valuable and not effective for a production use case since missing the knowledge of the underlying internals of Kubernetes.

The problem with the following issue is the fact that a ResourceQuota object is controlled by an admission controller (named ResourceQuota) and there's no way in preventing with a validation webhook the change of that object in order to calculate, in advance, if the resource request (like the creation of a pod, or a volume) is allowed or not.

The basic idea behind Capsule has been simplicity and reusing the same Kubernetes API primitives, trying to deliver new ones at minimum reducing the cognitive load in operating a multi-tenant environment.

There are just two concrete ways to address this:

  1. implementing yet another ResourceQuota admission controller

This is cumbersome and repetitive, also considering that there's already an implementation, although non-Tenant aware.

  1. creating a Kubernetes Enhancement Proposal supporting a GlobalResourceQuota

Essentially, it would be pretty similar to ResourceQuota but living at the cluster-scope level, with the same specification, but with a label selector that we could use to address the Tenant namespaces.

The latter one is the most reasonable solution to me, although requiring to deal with the community and finding its consensus, besides making the fix compatible only starting from the release where the new resource is going to land. If you'd like to help me in drafting a KEP eager to work together, as well as attend the community meeting.

@oliverbaehler
Copy link
Collaborator

Just read about SchedulingGates as new feature gate:

https://kubernetes.io/blog/2022/12/26/pod-scheduling-readiness-alpha/

This could be interesting. In the use case the mention this:

Scheduling gates allows an external quota manager to address the above limitation of ResourceQuota. Specifically, the manager could add a example.com/quota-check scheduling gate to all Pods created in the cluster (using a mutating webhook). The manager would then remove the gate when there is quota to start the Pod.

I will have to play around with this feature a bit, maybe delaying scheduling might already help. But i obv. would also love to create a KEP :3 !

@prometherion
Copy link
Member

Yeah, this could be interesting, although remember that we're using ResourceQuota for multiple resources like PVC, Secret, PV, ConfigMap and, in the end, Pods.

@lukasboettcher
Copy link
Contributor

I just created a PR #1088 that might help with this issue and #643.

By subtracting the resource usage of all other namespaces from the desired tenant-level hard quota, instead of assigning the full tenant-level hard quota on every rq object, we prevent the creation of resources that would go over the tenants quota.

I have tested the proposed change somewhat locally, but if this might cause some problems elsewhere that I am not aware of, feel free to disregard the proposal.

@maxgio92
Copy link
Collaborator

maxgio92 commented May 23, 2024

I propose to reopen this issue @oliverbaehler @prometherion to keep track of the racing condition we still have, even though with the smart PR by @lukasboettcher we now have a considerable improvement against this issue.

I guess that as long as we don't have an admission webhook there's space for racing.

WDYT?

@oliverbaehler
Copy link
Collaborator

Yeah ofc, just merged the feat to keep complexity low.

Me and Dario have talked about a possible solution. I have time this afternoon to verify if thats working

@oliverbaehler oliverbaehler reopened this May 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working help wanted Extra attention is needed needs-discussion No outline on the feature, discussion is welcome
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants