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
a90b4c8c
Commit
a90b4c8c
authored
Oct 23, 2017
by
tanshanshan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
HugePages require cpu or memory
parent
9fe2a62b
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
75 additions
and
21 deletions
+75
-21
BUILD
pkg/apis/core/helper/qos/BUILD
+0
-1
qos.go
pkg/apis/core/helper/qos/qos.go
+3
-3
BUILD
pkg/apis/core/v1/helper/qos/BUILD
+1
-1
qos.go
pkg/apis/core/v1/helper/qos/qos.go
+4
-3
qos_test.go
pkg/apis/core/v1/helper/qos/qos_test.go
+3
-3
validation.go
pkg/apis/core/validation/validation.go
+25
-2
validation_test.go
pkg/apis/core/validation/validation_test.go
+39
-8
No files found.
pkg/apis/core/helper/qos/BUILD
View file @
a90b4c8c
...
@@ -11,7 +11,6 @@ go_library(
...
@@ -11,7 +11,6 @@ go_library(
importpath = "k8s.io/kubernetes/pkg/apis/core/helper/qos",
importpath = "k8s.io/kubernetes/pkg/apis/core/helper/qos",
deps = [
deps = [
"//pkg/apis/core:go_default_library",
"//pkg/apis/core:go_default_library",
"//pkg/apis/core/helper:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
],
],
...
...
pkg/apis/core/helper/qos/qos.go
View file @
a90b4c8c
...
@@ -22,12 +22,12 @@ import (
...
@@ -22,12 +22,12 @@ import (
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/apis/core/helper"
)
)
var
supportedQoSComputeResources
=
sets
.
NewString
(
string
(
core
.
ResourceCPU
),
string
(
core
.
ResourceMemory
))
func
isSupportedQoSComputeResource
(
name
core
.
ResourceName
)
bool
{
func
isSupportedQoSComputeResource
(
name
core
.
ResourceName
)
bool
{
supportedQoSComputeResources
:=
sets
.
NewString
(
string
(
core
.
ResourceCPU
),
string
(
core
.
ResourceMemory
))
return
supportedQoSComputeResources
.
Has
(
string
(
name
))
return
supportedQoSComputeResources
.
Has
(
string
(
name
))
||
helper
.
IsHugePageResourceName
(
name
)
}
}
// GetPodQOS returns the QoS class of a pod.
// GetPodQOS returns the QoS class of a pod.
...
...
pkg/apis/core/v1/helper/qos/BUILD
View file @
a90b4c8c
...
@@ -26,7 +26,7 @@ go_library(
...
@@ -26,7 +26,7 @@ go_library(
srcs = ["qos.go"],
srcs = ["qos.go"],
importpath = "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos",
importpath = "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos",
deps = [
deps = [
"//pkg/apis/core
/v1/helper
:go_default_library",
"//pkg/apis/core:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
...
...
pkg/apis/core/v1/helper/qos/qos.go
View file @
a90b4c8c
...
@@ -20,15 +20,16 @@ import (
...
@@ -20,15 +20,16 @@ import (
"k8s.io/api/core/v1"
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/util/sets"
v1helper
"k8s.io/kubernetes/pkg/apis/core/v1/helper
"
"k8s.io/kubernetes/pkg/apis/core
"
)
)
var
supportedQoSComputeResources
=
sets
.
NewString
(
string
(
core
.
ResourceCPU
),
string
(
core
.
ResourceMemory
))
// QOSList is a set of (resource name, QoS class) pairs.
// QOSList is a set of (resource name, QoS class) pairs.
type
QOSList
map
[
v1
.
ResourceName
]
v1
.
PodQOSClass
type
QOSList
map
[
v1
.
ResourceName
]
v1
.
PodQOSClass
func
isSupportedQoSComputeResource
(
name
v1
.
ResourceName
)
bool
{
func
isSupportedQoSComputeResource
(
name
v1
.
ResourceName
)
bool
{
supportedQoSComputeResources
:=
sets
.
NewString
(
string
(
v1
.
ResourceCPU
),
string
(
v1
.
ResourceMemory
))
return
supportedQoSComputeResources
.
Has
(
string
(
name
))
return
supportedQoSComputeResources
.
Has
(
string
(
name
))
||
v1helper
.
IsHugePageResourceName
(
name
)
}
}
// GetPodQOS returns the QoS class of a pod.
// GetPodQOS returns the QoS class of a pod.
...
...
pkg/apis/core/v1/helper/qos/qos_test.go
View file @
a90b4c8c
...
@@ -131,10 +131,10 @@ func TestGetPodQOS(t *testing.T) {
...
@@ -131,10 +131,10 @@ func TestGetPodQOS(t *testing.T) {
expected
:
v1
.
PodQOSBurstable
,
expected
:
v1
.
PodQOSBurstable
,
},
},
{
{
pod
:
newPod
(
"b
urstable
-hugepages"
,
[]
v1
.
Container
{
pod
:
newPod
(
"b
est-effort
-hugepages"
,
[]
v1
.
Container
{
newContainer
(
"b
urstable
"
,
addResource
(
"hugepages-2Mi"
,
"1Gi"
,
getResourceList
(
"0"
,
"0"
)),
addResource
(
"hugepages-2Mi"
,
"1Gi"
,
getResourceList
(
"0"
,
"0"
))),
newContainer
(
"b
est-effort
"
,
addResource
(
"hugepages-2Mi"
,
"1Gi"
,
getResourceList
(
"0"
,
"0"
)),
addResource
(
"hugepages-2Mi"
,
"1Gi"
,
getResourceList
(
"0"
,
"0"
))),
}),
}),
expected
:
v1
.
PodQOSB
urstable
,
expected
:
v1
.
PodQOSB
estEffort
,
},
},
}
}
for
id
,
testCase
:=
range
testCases
{
for
id
,
testCase
:=
range
testCases
{
...
...
pkg/apis/core/validation/validation.go
View file @
a90b4c8c
...
@@ -4252,7 +4252,13 @@ func ValidateResourceRequirements(requirements *core.ResourceRequirements, fldPa
...
@@ -4252,7 +4252,13 @@ func ValidateResourceRequirements(requirements *core.ResourceRequirements, fldPa
allErrs
:=
field
.
ErrorList
{}
allErrs
:=
field
.
ErrorList
{}
limPath
:=
fldPath
.
Child
(
"limits"
)
limPath
:=
fldPath
.
Child
(
"limits"
)
reqPath
:=
fldPath
.
Child
(
"requests"
)
reqPath
:=
fldPath
.
Child
(
"requests"
)
limContainsCpuOrMemory
:=
false
reqContainsCpuOrMemory
:=
false
limContainsHugePages
:=
false
reqContainsHugePages
:=
false
supportedQoSComputeResources
:=
sets
.
NewString
(
string
(
core
.
ResourceCPU
),
string
(
core
.
ResourceMemory
))
for
resourceName
,
quantity
:=
range
requirements
.
Limits
{
for
resourceName
,
quantity
:=
range
requirements
.
Limits
{
fldPath
:=
limPath
.
Key
(
string
(
resourceName
))
fldPath
:=
limPath
.
Key
(
string
(
resourceName
))
// Validate resource name.
// Validate resource name.
allErrs
=
append
(
allErrs
,
validateContainerResourceName
(
string
(
resourceName
),
fldPath
)
...
)
allErrs
=
append
(
allErrs
,
validateContainerResourceName
(
string
(
resourceName
),
fldPath
)
...
)
...
@@ -4263,10 +4269,17 @@ func ValidateResourceRequirements(requirements *core.ResourceRequirements, fldPa
...
@@ -4263,10 +4269,17 @@ func ValidateResourceRequirements(requirements *core.ResourceRequirements, fldPa
if
resourceName
==
core
.
ResourceEphemeralStorage
&&
!
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
LocalStorageCapacityIsolation
)
{
if
resourceName
==
core
.
ResourceEphemeralStorage
&&
!
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
LocalStorageCapacityIsolation
)
{
allErrs
=
append
(
allErrs
,
field
.
Forbidden
(
limPath
,
"ResourceEphemeralStorage field disabled by feature-gate for ResourceRequirements"
))
allErrs
=
append
(
allErrs
,
field
.
Forbidden
(
limPath
,
"ResourceEphemeralStorage field disabled by feature-gate for ResourceRequirements"
))
}
}
if
helper
.
IsHugePageResourceName
(
resourceName
)
&&
!
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
HugePages
)
{
if
helper
.
IsHugePageResourceName
(
resourceName
)
{
allErrs
=
append
(
allErrs
,
field
.
Forbidden
(
limPath
,
fmt
.
Sprintf
(
"%s field disabled by feature-gate for ResourceRequirements"
,
resourceName
)))
if
!
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
HugePages
)
{
allErrs
=
append
(
allErrs
,
field
.
Forbidden
(
limPath
,
fmt
.
Sprintf
(
"%s field disabled by feature-gate for ResourceRequirements"
,
resourceName
)))
}
else
{
limContainsHugePages
=
true
}
}
}
if
supportedQoSComputeResources
.
Has
(
string
(
resourceName
))
{
limContainsCpuOrMemory
=
true
}
}
}
for
resourceName
,
quantity
:=
range
requirements
.
Requests
{
for
resourceName
,
quantity
:=
range
requirements
.
Requests
{
fldPath
:=
reqPath
.
Key
(
string
(
resourceName
))
fldPath
:=
reqPath
.
Key
(
string
(
resourceName
))
...
@@ -4287,6 +4300,16 @@ func ValidateResourceRequirements(requirements *core.ResourceRequirements, fldPa
...
@@ -4287,6 +4300,16 @@ func ValidateResourceRequirements(requirements *core.ResourceRequirements, fldPa
}
else
if
resourceName
==
core
.
ResourceNvidiaGPU
{
}
else
if
resourceName
==
core
.
ResourceNvidiaGPU
{
allErrs
=
append
(
allErrs
,
field
.
Invalid
(
reqPath
,
quantity
.
String
(),
fmt
.
Sprintf
(
"must be equal to %s request"
,
core
.
ResourceNvidiaGPU
)))
allErrs
=
append
(
allErrs
,
field
.
Invalid
(
reqPath
,
quantity
.
String
(),
fmt
.
Sprintf
(
"must be equal to %s request"
,
core
.
ResourceNvidiaGPU
)))
}
}
if
helper
.
IsHugePageResourceName
(
resourceName
)
{
reqContainsHugePages
=
true
}
if
supportedQoSComputeResources
.
Has
(
string
(
resourceName
))
{
reqContainsCpuOrMemory
=
true
}
}
if
!
limContainsCpuOrMemory
&&
!
reqContainsCpuOrMemory
&&
(
reqContainsHugePages
||
limContainsHugePages
)
{
allErrs
=
append
(
allErrs
,
field
.
Forbidden
(
fldPath
,
fmt
.
Sprintf
(
"HugePages require cpu or memory"
)))
}
}
return
allErrs
return
allErrs
...
...
pkg/apis/core/validation/validation_test.go
View file @
a90b4c8c
...
@@ -3322,10 +3322,14 @@ func TestAlphaHugePagesIsolation(t *testing.T) {
...
@@ -3322,10 +3322,14 @@ func TestAlphaHugePagesIsolation(t *testing.T) {
Name
:
"ctr"
,
Image
:
"image"
,
ImagePullPolicy
:
"IfNotPresent"
,
TerminationMessagePolicy
:
"File"
,
Name
:
"ctr"
,
Image
:
"image"
,
ImagePullPolicy
:
"IfNotPresent"
,
TerminationMessagePolicy
:
"File"
,
Resources
:
core
.
ResourceRequirements
{
Resources
:
core
.
ResourceRequirements
{
Requests
:
core
.
ResourceList
{
Requests
:
core
.
ResourceList
{
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"1Gi"
),
core
.
ResourceName
(
core
.
ResourceCPU
)
:
resource
.
MustParse
(
"10"
),
core
.
ResourceName
(
core
.
ResourceMemory
)
:
resource
.
MustParse
(
"10G"
),
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"1Gi"
),
},
},
Limits
:
core
.
ResourceList
{
Limits
:
core
.
ResourceList
{
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"1Gi"
),
core
.
ResourceName
(
core
.
ResourceCPU
)
:
resource
.
MustParse
(
"10"
),
core
.
ResourceName
(
core
.
ResourceMemory
)
:
resource
.
MustParse
(
"10G"
),
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"1Gi"
),
},
},
},
},
},
},
...
@@ -3337,7 +3341,7 @@ func TestAlphaHugePagesIsolation(t *testing.T) {
...
@@ -3337,7 +3341,7 @@ func TestAlphaHugePagesIsolation(t *testing.T) {
}
}
failureCases
:=
[]
core
.
Pod
{
failureCases
:=
[]
core
.
Pod
{
{
// Basic fields.
{
// Basic fields.
ObjectMeta
:
metav1
.
ObjectMeta
{
Name
:
"hugepages-
shared
"
,
Namespace
:
"ns"
},
ObjectMeta
:
metav1
.
ObjectMeta
{
Name
:
"hugepages-
requireCpuOrMemory
"
,
Namespace
:
"ns"
},
Spec
:
core
.
PodSpec
{
Spec
:
core
.
PodSpec
{
Containers
:
[]
core
.
Container
{
Containers
:
[]
core
.
Container
{
{
{
...
@@ -3347,7 +3351,31 @@ func TestAlphaHugePagesIsolation(t *testing.T) {
...
@@ -3347,7 +3351,31 @@ func TestAlphaHugePagesIsolation(t *testing.T) {
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"1Gi"
),
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"1Gi"
),
},
},
Limits
:
core
.
ResourceList
{
Limits
:
core
.
ResourceList
{
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"2Gi"
),
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"1Gi"
),
},
},
},
},
RestartPolicy
:
core
.
RestartPolicyAlways
,
DNSPolicy
:
core
.
DNSClusterFirst
,
},
},
{
// Basic fields.
ObjectMeta
:
metav1
.
ObjectMeta
{
Name
:
"hugepages-shared"
,
Namespace
:
"ns"
},
Spec
:
core
.
PodSpec
{
Containers
:
[]
core
.
Container
{
{
Name
:
"ctr"
,
Image
:
"image"
,
ImagePullPolicy
:
"IfNotPresent"
,
TerminationMessagePolicy
:
"File"
,
Resources
:
core
.
ResourceRequirements
{
Requests
:
core
.
ResourceList
{
core
.
ResourceName
(
core
.
ResourceCPU
)
:
resource
.
MustParse
(
"10"
),
core
.
ResourceName
(
core
.
ResourceMemory
)
:
resource
.
MustParse
(
"10G"
),
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"1Gi"
),
},
Limits
:
core
.
ResourceList
{
core
.
ResourceName
(
core
.
ResourceCPU
)
:
resource
.
MustParse
(
"10"
),
core
.
ResourceName
(
core
.
ResourceMemory
)
:
resource
.
MustParse
(
"10G"
),
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"2Gi"
),
},
},
},
},
},
},
...
@@ -3364,12 +3392,15 @@ func TestAlphaHugePagesIsolation(t *testing.T) {
...
@@ -3364,12 +3392,15 @@ func TestAlphaHugePagesIsolation(t *testing.T) {
Name
:
"ctr"
,
Image
:
"image"
,
ImagePullPolicy
:
"IfNotPresent"
,
TerminationMessagePolicy
:
"File"
,
Name
:
"ctr"
,
Image
:
"image"
,
ImagePullPolicy
:
"IfNotPresent"
,
TerminationMessagePolicy
:
"File"
,
Resources
:
core
.
ResourceRequirements
{
Resources
:
core
.
ResourceRequirements
{
Requests
:
core
.
ResourceList
{
Requests
:
core
.
ResourceList
{
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"1Gi"
),
core
.
ResourceName
(
core
.
ResourceCPU
)
:
resource
.
MustParse
(
"10"
),
core
.
ResourceName
(
"hugepages-1Gi"
)
:
resource
.
MustParse
(
"2Gi"
),
core
.
ResourceName
(
core
.
ResourceMemory
)
:
resource
.
MustParse
(
"10G"
),
core
.
ResourceName
(
"hugepages-1Gi"
)
:
resource
.
MustParse
(
"2Gi"
),
},
},
Limits
:
core
.
ResourceList
{
Limits
:
core
.
ResourceList
{
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"1Gi"
),
core
.
ResourceName
(
core
.
ResourceCPU
)
:
resource
.
MustParse
(
"10"
),
core
.
ResourceName
(
"hugepages-1Gi"
)
:
resource
.
MustParse
(
"2Gi"
),
core
.
ResourceName
(
core
.
ResourceMemory
)
:
resource
.
MustParse
(
"10G"
),
core
.
ResourceName
(
"hugepages-2Mi"
)
:
resource
.
MustParse
(
"1Gi"
),
core
.
ResourceName
(
"hugepages-1Gi"
)
:
resource
.
MustParse
(
"2Gi"
),
},
},
},
},
},
},
...
...
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