Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
de9c1a2a
Commit
de9c1a2a
authored
Apr 23, 2016
by
k8s-merge-robot
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #24247 from sdminonne/service_loadbalancer_quotas
Automatic merge from submit-queue Adding loadBalancer services to quota system @derekwaynecarr follow up to #22154.
parents
e61e396d
f4ed4998
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
102 additions
and
2 deletions
+102
-2
helpers.go
pkg/api/helpers.go
+2
-0
types.go
pkg/api/types.go
+2
-0
types.go
pkg/api/v1/types.go
+2
-0
replenishment_controller.go
pkg/controller/resourcequota/replenishment_controller.go
+1
-1
services.go
pkg/quota/evaluator/core/services.go
+4
-1
resource_quota.go
test/e2e/resource_quota.go
+91
-0
No files found.
pkg/api/helpers.go
View file @
de9c1a2a
...
@@ -153,6 +153,7 @@ var standardQuotaResources = sets.NewString(
...
@@ -153,6 +153,7 @@ var standardQuotaResources = sets.NewString(
string
(
ResourcePersistentVolumeClaims
),
string
(
ResourcePersistentVolumeClaims
),
string
(
ResourceConfigMaps
),
string
(
ResourceConfigMaps
),
string
(
ResourceServicesNodePorts
),
string
(
ResourceServicesNodePorts
),
string
(
ResourceServicesLoadBalancers
),
)
)
// IsStandardQuotaResourceName returns true if the resource is known to
// IsStandardQuotaResourceName returns true if the resource is known to
...
@@ -192,6 +193,7 @@ var integerResources = sets.NewString(
...
@@ -192,6 +193,7 @@ var integerResources = sets.NewString(
string
(
ResourceConfigMaps
),
string
(
ResourceConfigMaps
),
string
(
ResourcePersistentVolumeClaims
),
string
(
ResourcePersistentVolumeClaims
),
string
(
ResourceServicesNodePorts
),
string
(
ResourceServicesNodePorts
),
string
(
ResourceServicesLoadBalancers
),
)
)
// IsIntegerResourceName returns true if the resource is measured in integer values
// IsIntegerResourceName returns true if the resource is measured in integer values
...
...
pkg/api/types.go
View file @
de9c1a2a
...
@@ -2218,6 +2218,8 @@ const (
...
@@ -2218,6 +2218,8 @@ const (
ResourcePersistentVolumeClaims
ResourceName
=
"persistentvolumeclaims"
ResourcePersistentVolumeClaims
ResourceName
=
"persistentvolumeclaims"
// ResourceServicesNodePorts, number
// ResourceServicesNodePorts, number
ResourceServicesNodePorts
ResourceName
=
"services.nodeports"
ResourceServicesNodePorts
ResourceName
=
"services.nodeports"
// ResourceServicesLoadBalancers, number
ResourceServicesLoadBalancers
ResourceName
=
"services.loadbalancers"
// CPU request, in cores. (500m = .5 cores)
// CPU request, in cores. (500m = .5 cores)
ResourceRequestsCPU
ResourceName
=
"requests.cpu"
ResourceRequestsCPU
ResourceName
=
"requests.cpu"
// Memory request, in bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024)
// Memory request, in bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024)
...
...
pkg/api/v1/types.go
View file @
de9c1a2a
...
@@ -2676,6 +2676,8 @@ const (
...
@@ -2676,6 +2676,8 @@ const (
ResourcePersistentVolumeClaims
ResourceName
=
"persistentvolumeclaims"
ResourcePersistentVolumeClaims
ResourceName
=
"persistentvolumeclaims"
// ResourceServicesNodePorts, number
// ResourceServicesNodePorts, number
ResourceServicesNodePorts
ResourceName
=
"services.nodeports"
ResourceServicesNodePorts
ResourceName
=
"services.nodeports"
// ResourceServicesLoadBalancers, number
ResourceServicesLoadBalancers
ResourceName
=
"services.loadbalancers"
// CPU request, in cores. (500m = .5 cores)
// CPU request, in cores. (500m = .5 cores)
ResourceCPURequest
ResourceName
=
"cpu.request"
ResourceCPURequest
ResourceName
=
"cpu.request"
// CPU limit, in cores. (500m = .5 cores)
// CPU limit, in cores. (500m = .5 cores)
...
...
pkg/controller/resourcequota/replenishment_controller.go
View file @
de9c1a2a
...
@@ -215,7 +215,7 @@ func ServiceReplenishmentUpdateFunc(options *ReplenishmentControllerOptions) fun
...
@@ -215,7 +215,7 @@ func ServiceReplenishmentUpdateFunc(options *ReplenishmentControllerOptions) fun
return
func
(
oldObj
,
newObj
interface
{})
{
return
func
(
oldObj
,
newObj
interface
{})
{
oldService
:=
oldObj
.
(
*
api
.
Service
)
oldService
:=
oldObj
.
(
*
api
.
Service
)
newService
:=
newObj
.
(
*
api
.
Service
)
newService
:=
newObj
.
(
*
api
.
Service
)
if
core
.
QuotaServiceType
(
oldService
)
&&
!
core
.
QuotaServiceType
(
newService
)
{
if
core
.
QuotaServiceType
(
oldService
)
||
core
.
QuotaServiceType
(
newService
)
{
options
.
ReplenishmentFunc
(
options
.
GroupKind
,
newService
.
Namespace
,
newService
)
options
.
ReplenishmentFunc
(
options
.
GroupKind
,
newService
.
Namespace
,
newService
)
}
}
}
}
...
...
pkg/quota/evaluator/core/services.go
View file @
de9c1a2a
...
@@ -31,6 +31,7 @@ func NewServiceEvaluator(kubeClient clientset.Interface) quota.Evaluator {
...
@@ -31,6 +31,7 @@ func NewServiceEvaluator(kubeClient clientset.Interface) quota.Evaluator {
allResources
:=
[]
api
.
ResourceName
{
allResources
:=
[]
api
.
ResourceName
{
api
.
ResourceServices
,
api
.
ResourceServices
,
api
.
ResourceServicesNodePorts
,
api
.
ResourceServicesNodePorts
,
api
.
ResourceServicesLoadBalancers
,
}
}
return
&
generic
.
GenericEvaluator
{
return
&
generic
.
GenericEvaluator
{
Name
:
"Evaluator.Service"
,
Name
:
"Evaluator.Service"
,
...
@@ -56,6 +57,8 @@ func ServiceUsageFunc(object runtime.Object) api.ResourceList {
...
@@ -56,6 +57,8 @@ func ServiceUsageFunc(object runtime.Object) api.ResourceList {
switch
service
.
Spec
.
Type
{
switch
service
.
Spec
.
Type
{
case
api
.
ServiceTypeNodePort
:
case
api
.
ServiceTypeNodePort
:
result
[
api
.
ResourceServicesNodePorts
]
=
resource
.
MustParse
(
"1"
)
result
[
api
.
ResourceServicesNodePorts
]
=
resource
.
MustParse
(
"1"
)
case
api
.
ServiceTypeLoadBalancer
:
result
[
api
.
ResourceServicesLoadBalancers
]
=
resource
.
MustParse
(
"1"
)
}
}
}
}
return
result
return
result
...
@@ -64,7 +67,7 @@ func ServiceUsageFunc(object runtime.Object) api.ResourceList {
...
@@ -64,7 +67,7 @@ func ServiceUsageFunc(object runtime.Object) api.ResourceList {
// QuotaServiceType returns true if the service type is eligible to track against a quota
// QuotaServiceType returns true if the service type is eligible to track against a quota
func
QuotaServiceType
(
service
*
api
.
Service
)
bool
{
func
QuotaServiceType
(
service
*
api
.
Service
)
bool
{
switch
service
.
Spec
.
Type
{
switch
service
.
Spec
.
Type
{
case
api
.
ServiceTypeNodePort
:
case
api
.
ServiceTypeNodePort
,
api
.
ServiceTypeLoadBalancer
:
return
true
return
true
}
}
return
false
return
false
...
...
test/e2e/resource_quota.go
View file @
de9c1a2a
...
@@ -220,6 +220,96 @@ var _ = framework.KubeDescribe("ResourceQuota", func() {
...
@@ -220,6 +220,96 @@ var _ = framework.KubeDescribe("ResourceQuota", func() {
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
})
})
It
(
"should create a ResourceQuota and capture the life of a loadBalancer service."
,
func
()
{
By
(
"Creating a ResourceQuota"
)
quotaName
:=
"test-quota"
resourceQuota
:=
newTestResourceQuota
(
quotaName
)
resourceQuota
,
err
:=
createResourceQuota
(
f
.
Client
,
f
.
Namespace
.
Name
,
resourceQuota
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
By
(
"Ensuring resource quota status is calculated"
)
usedResources
:=
api
.
ResourceList
{}
usedResources
[
api
.
ResourceQuotas
]
=
resource
.
MustParse
(
"1"
)
err
=
waitForResourceQuota
(
f
.
Client
,
f
.
Namespace
.
Name
,
quotaName
,
usedResources
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
By
(
"Creating a loadBalancer type Service"
)
service
:=
newTestServiceForQuota
(
"test-service"
,
api
.
ServiceTypeLoadBalancer
)
service
,
err
=
f
.
Client
.
Services
(
f
.
Namespace
.
Name
)
.
Create
(
service
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
By
(
"Ensuring resource quota status captures service creation"
)
usedResources
=
api
.
ResourceList
{}
usedResources
[
api
.
ResourceQuotas
]
=
resource
.
MustParse
(
"1"
)
usedResources
[
api
.
ResourceServices
]
=
resource
.
MustParse
(
"1"
)
usedResources
[
api
.
ResourceServicesLoadBalancers
]
=
resource
.
MustParse
(
"1"
)
err
=
waitForResourceQuota
(
f
.
Client
,
f
.
Namespace
.
Name
,
quotaName
,
usedResources
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
By
(
"Deleting a Service"
)
err
=
f
.
Client
.
Services
(
f
.
Namespace
.
Name
)
.
Delete
(
service
.
Name
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
By
(
"Ensuring resource quota status released usage"
)
usedResources
[
api
.
ResourceServices
]
=
resource
.
MustParse
(
"0"
)
usedResources
[
api
.
ResourceServicesLoadBalancers
]
=
resource
.
MustParse
(
"0"
)
err
=
waitForResourceQuota
(
f
.
Client
,
f
.
Namespace
.
Name
,
quotaName
,
usedResources
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
})
It
(
"should create a ResourceQuota and capture the life of a nodePort service updated to loadBalancer."
,
func
()
{
By
(
"Creating a ResourceQuota"
)
quotaName
:=
"test-quota"
resourceQuota
:=
newTestResourceQuota
(
quotaName
)
resourceQuota
,
err
:=
createResourceQuota
(
f
.
Client
,
f
.
Namespace
.
Name
,
resourceQuota
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
By
(
"Ensuring resource quota status is calculated"
)
usedResources
:=
api
.
ResourceList
{}
usedResources
[
api
.
ResourceQuotas
]
=
resource
.
MustParse
(
"1"
)
err
=
waitForResourceQuota
(
f
.
Client
,
f
.
Namespace
.
Name
,
quotaName
,
usedResources
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
By
(
"Creating a nodePort type Service"
)
service
:=
newTestServiceForQuota
(
"test-service"
,
api
.
ServiceTypeNodePort
)
service
,
err
=
f
.
Client
.
Services
(
f
.
Namespace
.
Name
)
.
Create
(
service
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
By
(
"Ensuring resource quota status captures service creation"
)
usedResources
=
api
.
ResourceList
{}
usedResources
[
api
.
ResourceQuotas
]
=
resource
.
MustParse
(
"1"
)
usedResources
[
api
.
ResourceServices
]
=
resource
.
MustParse
(
"1"
)
usedResources
[
api
.
ResourceServicesLoadBalancers
]
=
resource
.
MustParse
(
"0"
)
usedResources
[
api
.
ResourceServicesNodePorts
]
=
resource
.
MustParse
(
"1"
)
err
=
waitForResourceQuota
(
f
.
Client
,
f
.
Namespace
.
Name
,
quotaName
,
usedResources
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
By
(
"Updating the service type to loadBalancer"
)
service
.
Spec
.
Type
=
api
.
ServiceTypeLoadBalancer
service
.
Spec
.
Ports
[
0
]
.
NodePort
=
0
_
,
err
=
f
.
Client
.
Services
(
f
.
Namespace
.
Name
)
.
Update
(
service
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
By
(
"Checking resource quota status capture service update"
)
usedResources
=
api
.
ResourceList
{}
usedResources
[
api
.
ResourceQuotas
]
=
resource
.
MustParse
(
"1"
)
usedResources
[
api
.
ResourceServices
]
=
resource
.
MustParse
(
"1"
)
usedResources
[
api
.
ResourceServicesLoadBalancers
]
=
resource
.
MustParse
(
"1"
)
usedResources
[
api
.
ResourceServicesNodePorts
]
=
resource
.
MustParse
(
"0"
)
err
=
waitForResourceQuota
(
f
.
Client
,
f
.
Namespace
.
Name
,
quotaName
,
usedResources
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
By
(
"Deleting a Service"
)
err
=
f
.
Client
.
Services
(
f
.
Namespace
.
Name
)
.
Delete
(
service
.
Name
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
By
(
"Ensuring resource quota status released usage"
)
usedResources
[
api
.
ResourceServices
]
=
resource
.
MustParse
(
"0"
)
usedResources
[
api
.
ResourceServicesLoadBalancers
]
=
resource
.
MustParse
(
"0"
)
err
=
waitForResourceQuota
(
f
.
Client
,
f
.
Namespace
.
Name
,
quotaName
,
usedResources
)
Expect
(
err
)
.
NotTo
(
HaveOccurred
())
})
It
(
"should create a ResourceQuota and capture the life of a pod."
,
func
()
{
It
(
"should create a ResourceQuota and capture the life of a pod."
,
func
()
{
By
(
"Creating a ResourceQuota"
)
By
(
"Creating a ResourceQuota"
)
quotaName
:=
"test-quota"
quotaName
:=
"test-quota"
...
@@ -578,6 +668,7 @@ func newTestResourceQuota(name string) *api.ResourceQuota {
...
@@ -578,6 +668,7 @@ func newTestResourceQuota(name string) *api.ResourceQuota {
hard
[
api
.
ResourcePods
]
=
resource
.
MustParse
(
"5"
)
hard
[
api
.
ResourcePods
]
=
resource
.
MustParse
(
"5"
)
hard
[
api
.
ResourceServices
]
=
resource
.
MustParse
(
"10"
)
hard
[
api
.
ResourceServices
]
=
resource
.
MustParse
(
"10"
)
hard
[
api
.
ResourceServicesNodePorts
]
=
resource
.
MustParse
(
"1"
)
hard
[
api
.
ResourceServicesNodePorts
]
=
resource
.
MustParse
(
"1"
)
hard
[
api
.
ResourceServicesLoadBalancers
]
=
resource
.
MustParse
(
"1"
)
hard
[
api
.
ResourceReplicationControllers
]
=
resource
.
MustParse
(
"10"
)
hard
[
api
.
ResourceReplicationControllers
]
=
resource
.
MustParse
(
"10"
)
hard
[
api
.
ResourceQuotas
]
=
resource
.
MustParse
(
"1"
)
hard
[
api
.
ResourceQuotas
]
=
resource
.
MustParse
(
"1"
)
hard
[
api
.
ResourceCPU
]
=
resource
.
MustParse
(
"1"
)
hard
[
api
.
ResourceCPU
]
=
resource
.
MustParse
(
"1"
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment