mirror of https://github.com/k3s-io/k3s
Improve quota performance for pvc by using shared informer
parent
835bc1b95d
commit
e88a1d0641
|
@ -23,16 +23,42 @@ import (
|
||||||
"k8s.io/kubernetes/pkg/admission"
|
"k8s.io/kubernetes/pkg/admission"
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/resource"
|
"k8s.io/kubernetes/pkg/api/resource"
|
||||||
|
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||||
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
||||||
|
"k8s.io/kubernetes/pkg/controller/informers"
|
||||||
"k8s.io/kubernetes/pkg/quota"
|
"k8s.io/kubernetes/pkg/quota"
|
||||||
"k8s.io/kubernetes/pkg/quota/generic"
|
"k8s.io/kubernetes/pkg/quota/generic"
|
||||||
"k8s.io/kubernetes/pkg/runtime"
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/util/sets"
|
"k8s.io/kubernetes/pkg/util/sets"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// listPersistentVolumeClaimsByNamespaceFuncUsingClient returns a pvc listing function based on the provided client.
|
||||||
|
func listPersistentVolumeClaimsByNamespaceFuncUsingClient(kubeClient clientset.Interface) generic.ListFuncByNamespace {
|
||||||
|
// TODO: ideally, we could pass dynamic client pool down into this code, and have one way of doing this.
|
||||||
|
// unfortunately, dynamic client works with Unstructured objects, and when we calculate Usage, we require
|
||||||
|
// structured objects.
|
||||||
|
return func(namespace string, options api.ListOptions) ([]runtime.Object, error) {
|
||||||
|
itemList, err := kubeClient.Core().PersistentVolumeClaims(namespace).List(options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
results := make([]runtime.Object, 0, len(itemList.Items))
|
||||||
|
for i := range itemList.Items {
|
||||||
|
results = append(results, &itemList.Items[i])
|
||||||
|
}
|
||||||
|
return results, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NewPersistentVolumeClaimEvaluator returns an evaluator that can evaluate persistent volume claims
|
// NewPersistentVolumeClaimEvaluator returns an evaluator that can evaluate persistent volume claims
|
||||||
func NewPersistentVolumeClaimEvaluator(kubeClient clientset.Interface) quota.Evaluator {
|
// if the specified shared informer factory is not nil, evaluator may use it to support listing functions.
|
||||||
|
func NewPersistentVolumeClaimEvaluator(kubeClient clientset.Interface, f informers.SharedInformerFactory) quota.Evaluator {
|
||||||
allResources := []api.ResourceName{api.ResourcePersistentVolumeClaims, api.ResourceRequestsStorage}
|
allResources := []api.ResourceName{api.ResourcePersistentVolumeClaims, api.ResourceRequestsStorage}
|
||||||
|
listFuncByNamespace := listPersistentVolumeClaimsByNamespaceFuncUsingClient(kubeClient)
|
||||||
|
if f != nil {
|
||||||
|
listFuncByNamespace = generic.ListResourceUsingInformerFunc(f, unversioned.GroupResource{Resource: "persistentvolumeclaims"})
|
||||||
|
}
|
||||||
|
|
||||||
return &generic.GenericEvaluator{
|
return &generic.GenericEvaluator{
|
||||||
Name: "Evaluator.PersistentVolumeClaim",
|
Name: "Evaluator.PersistentVolumeClaim",
|
||||||
InternalGroupKind: api.Kind("PersistentVolumeClaim"),
|
InternalGroupKind: api.Kind("PersistentVolumeClaim"),
|
||||||
|
@ -43,17 +69,7 @@ func NewPersistentVolumeClaimEvaluator(kubeClient clientset.Interface) quota.Eva
|
||||||
MatchesScopeFunc: generic.MatchesNoScopeFunc,
|
MatchesScopeFunc: generic.MatchesNoScopeFunc,
|
||||||
ConstraintsFunc: PersistentVolumeClaimConstraintsFunc,
|
ConstraintsFunc: PersistentVolumeClaimConstraintsFunc,
|
||||||
UsageFunc: PersistentVolumeClaimUsageFunc,
|
UsageFunc: PersistentVolumeClaimUsageFunc,
|
||||||
ListFuncByNamespace: func(namespace string, options api.ListOptions) ([]runtime.Object, error) {
|
ListFuncByNamespace: listFuncByNamespace,
|
||||||
itemList, err := kubeClient.Core().PersistentVolumeClaims(namespace).List(options)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
results := make([]runtime.Object, 0, len(itemList.Items))
|
|
||||||
for i := range itemList.Items {
|
|
||||||
results = append(results, &itemList.Items[i])
|
|
||||||
}
|
|
||||||
return results, nil
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -127,7 +127,7 @@ func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) {
|
||||||
})
|
})
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset()
|
kubeClient := fake.NewSimpleClientset()
|
||||||
evaluator := NewPersistentVolumeClaimEvaluator(kubeClient)
|
evaluator := NewPersistentVolumeClaimEvaluator(kubeClient, nil)
|
||||||
testCases := map[string]struct {
|
testCases := map[string]struct {
|
||||||
pvc *api.PersistentVolumeClaim
|
pvc *api.PersistentVolumeClaim
|
||||||
usage api.ResourceList
|
usage api.ResourceList
|
||||||
|
|
|
@ -33,7 +33,7 @@ func NewRegistry(kubeClient clientset.Interface, f informers.SharedInformerFacto
|
||||||
resourceQuota := NewResourceQuotaEvaluator(kubeClient)
|
resourceQuota := NewResourceQuotaEvaluator(kubeClient)
|
||||||
secret := NewSecretEvaluator(kubeClient)
|
secret := NewSecretEvaluator(kubeClient)
|
||||||
configMap := NewConfigMapEvaluator(kubeClient)
|
configMap := NewConfigMapEvaluator(kubeClient)
|
||||||
persistentVolumeClaim := NewPersistentVolumeClaimEvaluator(kubeClient)
|
persistentVolumeClaim := NewPersistentVolumeClaimEvaluator(kubeClient, f)
|
||||||
return &generic.GenericRegistry{
|
return &generic.GenericRegistry{
|
||||||
InternalEvaluators: map[unversioned.GroupKind]quota.Evaluator{
|
InternalEvaluators: map[unversioned.GroupKind]quota.Evaluator{
|
||||||
pod.GroupKind(): pod,
|
pod.GroupKind(): pod,
|
||||||
|
|
Loading…
Reference in New Issue