mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 05:27:21 +00:00
ResourceQuota add object count support for secret and volume claims
This commit is contained in:
parent
a3e8e80572
commit
06eb45fb75
@ -25,6 +25,8 @@ are supported:
|
|||||||
| services | Total number of services |
|
| services | Total number of services |
|
||||||
| replicationcontrollers | Total number of replication controllers |
|
| replicationcontrollers | Total number of replication controllers |
|
||||||
| resourcequotas | Total number of resource quotas |
|
| resourcequotas | Total number of resource quotas |
|
||||||
|
| secrets | Total number of secrets |
|
||||||
|
| persistentvolumeclaims | Total number of persistent volume claims |
|
||||||
|
|
||||||
For example, `pods` quota counts and enforces a maximum on the number of `pods`
|
For example, `pods` quota counts and enforces a maximum on the number of `pods`
|
||||||
created in a single namespace.
|
created in a single namespace.
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
"services": "5",
|
"services": "5",
|
||||||
"replicationcontrollers":"20",
|
"replicationcontrollers":"20",
|
||||||
"resourcequotas":"1",
|
"resourcequotas":"1",
|
||||||
},
|
"secrets":"10",
|
||||||
|
"persistentvolumeclaims":"10"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,9 @@
|
|||||||
"pods": "10",
|
"pods": "10",
|
||||||
"services": "5",
|
"services": "5",
|
||||||
"replicationcontrollers":"20",
|
"replicationcontrollers":"20",
|
||||||
"resourcequotas":"1"
|
"resourcequotas":"1",
|
||||||
|
"secrets":"10",
|
||||||
|
"persistentvolumeclaims":"10"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,6 +80,8 @@ var standardResources = util.NewStringSet(
|
|||||||
string(ResourceQuotas),
|
string(ResourceQuotas),
|
||||||
string(ResourceServices),
|
string(ResourceServices),
|
||||||
string(ResourceReplicationControllers),
|
string(ResourceReplicationControllers),
|
||||||
|
string(ResourceSecrets),
|
||||||
|
string(ResourcePersistentVolumeClaims),
|
||||||
string(ResourceStorage))
|
string(ResourceStorage))
|
||||||
|
|
||||||
func IsStandardResourceName(str string) bool {
|
func IsStandardResourceName(str string) bool {
|
||||||
|
@ -1705,6 +1705,10 @@ const (
|
|||||||
ResourceReplicationControllers ResourceName = "replicationcontrollers"
|
ResourceReplicationControllers ResourceName = "replicationcontrollers"
|
||||||
// ResourceQuotas, number
|
// ResourceQuotas, number
|
||||||
ResourceQuotas ResourceName = "resourcequotas"
|
ResourceQuotas ResourceName = "resourcequotas"
|
||||||
|
// ResourceSecrets, number
|
||||||
|
ResourceSecrets ResourceName = "secrets"
|
||||||
|
// ResourcePersistentVolumeClaims, number
|
||||||
|
ResourcePersistentVolumeClaims ResourceName = "persistentvolumeclaims"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ResourceQuotaSpec defines the desired hard limits to enforce for Quota
|
// ResourceQuotaSpec defines the desired hard limits to enforce for Quota
|
||||||
|
@ -1503,6 +1503,10 @@ const (
|
|||||||
ResourceReplicationControllers ResourceName = "replicationcontrollers"
|
ResourceReplicationControllers ResourceName = "replicationcontrollers"
|
||||||
// ResourceQuotas, number
|
// ResourceQuotas, number
|
||||||
ResourceQuotas ResourceName = "resourcequotas"
|
ResourceQuotas ResourceName = "resourcequotas"
|
||||||
|
// ResourceSecrets, number
|
||||||
|
ResourceSecrets ResourceName = "secrets"
|
||||||
|
// ResourcePersistentVolumeClaims, number
|
||||||
|
ResourcePersistentVolumeClaims ResourceName = "persistentvolumeclaims"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ResourceQuotaSpec defines the desired hard limits to enforce for Quota
|
// ResourceQuotaSpec defines the desired hard limits to enforce for Quota
|
||||||
|
@ -1578,6 +1578,10 @@ const (
|
|||||||
ResourceReplicationControllers ResourceName = "replicationcontrollers"
|
ResourceReplicationControllers ResourceName = "replicationcontrollers"
|
||||||
// ResourceQuotas, number
|
// ResourceQuotas, number
|
||||||
ResourceQuotas ResourceName = "resourcequotas"
|
ResourceQuotas ResourceName = "resourcequotas"
|
||||||
|
// ResourceSecrets, number
|
||||||
|
ResourceSecrets ResourceName = "secrets"
|
||||||
|
// ResourcePersistentVolumeClaims, number
|
||||||
|
ResourcePersistentVolumeClaims ResourceName = "persistentvolumeclaims"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ResourceQuotaSpec defines the desired hard limits to enforce for Quota
|
// ResourceQuotaSpec defines the desired hard limits to enforce for Quota
|
||||||
|
@ -1606,6 +1606,10 @@ const (
|
|||||||
ResourceReplicationControllers ResourceName = "replicationcontrollers"
|
ResourceReplicationControllers ResourceName = "replicationcontrollers"
|
||||||
// ResourceQuotas, number
|
// ResourceQuotas, number
|
||||||
ResourceQuotas ResourceName = "resourcequotas"
|
ResourceQuotas ResourceName = "resourcequotas"
|
||||||
|
// ResourceSecrets, number
|
||||||
|
ResourceSecrets ResourceName = "secrets"
|
||||||
|
// ResourcePersistentVolumeClaims, number
|
||||||
|
ResourcePersistentVolumeClaims ResourceName = "persistentvolumeclaims"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ResourceQuotaSpec defines the desired hard limits to enforce for Quota
|
// ResourceQuotaSpec defines the desired hard limits to enforce for Quota
|
||||||
|
@ -23,6 +23,7 @@ import (
|
|||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/fields"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
@ -199,6 +200,18 @@ func (rm *ResourceQuotaManager) syncResourceQuota(quota api.ResourceQuota) (err
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
value = resource.NewQuantity(int64(len(items.Items)), resource.DecimalSI)
|
value = resource.NewQuantity(int64(len(items.Items)), resource.DecimalSI)
|
||||||
|
case api.ResourceSecrets:
|
||||||
|
items, err := rm.kubeClient.Secrets(usage.Namespace).List(labels.Everything(), fields.Everything())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
value = resource.NewQuantity(int64(len(items.Items)), resource.DecimalSI)
|
||||||
|
case api.ResourcePersistentVolumeClaims:
|
||||||
|
items, err := rm.kubeClient.PersistentVolumeClaims(usage.Namespace).List(labels.Everything(), fields.Everything())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
value = resource.NewQuantity(int64(len(items.Items)), resource.DecimalSI)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ignore fields we do not understand (assume another controller is tracking it)
|
// ignore fields we do not understand (assume another controller is tracking it)
|
||||||
|
@ -62,6 +62,8 @@ var resourceToResourceName = map[string]api.ResourceName{
|
|||||||
"services": api.ResourceServices,
|
"services": api.ResourceServices,
|
||||||
"replicationControllers": api.ResourceReplicationControllers,
|
"replicationControllers": api.ResourceReplicationControllers,
|
||||||
"resourceQuotas": api.ResourceQuotas,
|
"resourceQuotas": api.ResourceQuotas,
|
||||||
|
"secrets": api.ResourceSecrets,
|
||||||
|
"persistentVolumeClaims": api.ResourcePersistentVolumeClaims,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *quota) Admit(a admission.Attributes) (err error) {
|
func (q *quota) Admit(a admission.Attributes) (err error) {
|
||||||
|
@ -355,3 +355,47 @@ func TestExceedUsageReplicationControllers(t *testing.T) {
|
|||||||
t.Errorf("Expected error for exceeding hard limits")
|
t.Errorf("Expected error for exceeding hard limits")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestExceedUsageSecrets(t *testing.T) {
|
||||||
|
namespace := "default"
|
||||||
|
client := testclient.NewSimpleFake(&api.SecretList{
|
||||||
|
Items: []api.Secret{
|
||||||
|
{
|
||||||
|
ObjectMeta: api.ObjectMeta{Name: "123", Namespace: namespace},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
status := &api.ResourceQuotaStatus{
|
||||||
|
Hard: api.ResourceList{},
|
||||||
|
Used: api.ResourceList{},
|
||||||
|
}
|
||||||
|
r := api.ResourceSecrets
|
||||||
|
status.Hard[r] = resource.MustParse("1")
|
||||||
|
status.Used[r] = resource.MustParse("1")
|
||||||
|
_, err := IncrementUsage(admission.NewAttributesRecord(&api.Secret{}, "Secret", namespace, "secrets", "CREATE"), status, client)
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("Expected error for exceeding hard limits")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExceedUsagePersistentVolumeClaims(t *testing.T) {
|
||||||
|
namespace := "default"
|
||||||
|
client := testclient.NewSimpleFake(&api.PersistentVolumeClaimList{
|
||||||
|
Items: []api.PersistentVolumeClaim{
|
||||||
|
{
|
||||||
|
ObjectMeta: api.ObjectMeta{Name: "123", Namespace: namespace},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
status := &api.ResourceQuotaStatus{
|
||||||
|
Hard: api.ResourceList{},
|
||||||
|
Used: api.ResourceList{},
|
||||||
|
}
|
||||||
|
r := api.ResourcePersistentVolumeClaims
|
||||||
|
status.Hard[r] = resource.MustParse("1")
|
||||||
|
status.Used[r] = resource.MustParse("1")
|
||||||
|
_, err := IncrementUsage(admission.NewAttributesRecord(&api.PersistentVolumeClaim{}, "PersistentVolumeClaim", namespace, "persistentVolumeClaims", "CREATE"), status, client)
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("Expected error for exceeding hard limits")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user