mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-05 10:19:50 +00:00
set qos class field in pod status
This commit is contained in:
parent
4c30459e49
commit
e2402b781b
@ -51,7 +51,6 @@ import (
|
|||||||
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
|
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
|
||||||
"k8s.io/kubernetes/pkg/fieldpath"
|
"k8s.io/kubernetes/pkg/fieldpath"
|
||||||
"k8s.io/kubernetes/pkg/fields"
|
"k8s.io/kubernetes/pkg/fields"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/qos"
|
|
||||||
"k8s.io/kubernetes/pkg/labels"
|
"k8s.io/kubernetes/pkg/labels"
|
||||||
"k8s.io/kubernetes/pkg/runtime/schema"
|
"k8s.io/kubernetes/pkg/runtime/schema"
|
||||||
"k8s.io/kubernetes/pkg/types"
|
"k8s.io/kubernetes/pkg/types"
|
||||||
@ -538,7 +537,7 @@ func describePod(pod *api.Pod, events *api.EventList) (string, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
describeVolumes(pod.Spec.Volumes, w, "")
|
describeVolumes(pod.Spec.Volumes, w, "")
|
||||||
w.Write(LEVEL_0, "QoS Class:\t%s\n", qos.InternalGetPodQOS(pod))
|
w.Write(LEVEL_0, "QoS Class:\t%s\n", pod.Status.QOSClass)
|
||||||
printLabelsMultiline(w, "Node-Selectors", pod.Spec.NodeSelector)
|
printLabelsMultiline(w, "Node-Selectors", pod.Spec.NodeSelector)
|
||||||
printTolerationsInAnnotationMultiline(w, "Tolerations", pod.Annotations)
|
printTolerationsInAnnotationMultiline(w, "Tolerations", pod.Annotations)
|
||||||
if events != nil {
|
if events != nil {
|
||||||
|
@ -72,6 +72,7 @@ go_library(
|
|||||||
"//pkg/kubelet/pod:go_default_library",
|
"//pkg/kubelet/pod:go_default_library",
|
||||||
"//pkg/kubelet/prober:go_default_library",
|
"//pkg/kubelet/prober:go_default_library",
|
||||||
"//pkg/kubelet/prober/results:go_default_library",
|
"//pkg/kubelet/prober/results:go_default_library",
|
||||||
|
"//pkg/kubelet/qos:go_default_library",
|
||||||
"//pkg/kubelet/remote:go_default_library",
|
"//pkg/kubelet/remote:go_default_library",
|
||||||
"//pkg/kubelet/rkt:go_default_library",
|
"//pkg/kubelet/rkt:go_default_library",
|
||||||
"//pkg/kubelet/server:go_default_library",
|
"//pkg/kubelet/server:go_default_library",
|
||||||
|
@ -43,6 +43,7 @@ import (
|
|||||||
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/envvars"
|
"k8s.io/kubernetes/pkg/kubelet/envvars"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/images"
|
"k8s.io/kubernetes/pkg/kubelet/images"
|
||||||
|
"k8s.io/kubernetes/pkg/kubelet/qos"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/server/remotecommand"
|
"k8s.io/kubernetes/pkg/kubelet/server/remotecommand"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/status"
|
"k8s.io/kubernetes/pkg/kubelet/status"
|
||||||
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
|
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
|
||||||
@ -1120,6 +1121,8 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po
|
|||||||
func (kl *Kubelet) convertStatusToAPIStatus(pod *v1.Pod, podStatus *kubecontainer.PodStatus) *v1.PodStatus {
|
func (kl *Kubelet) convertStatusToAPIStatus(pod *v1.Pod, podStatus *kubecontainer.PodStatus) *v1.PodStatus {
|
||||||
var apiPodStatus v1.PodStatus
|
var apiPodStatus v1.PodStatus
|
||||||
apiPodStatus.PodIP = podStatus.IP
|
apiPodStatus.PodIP = podStatus.IP
|
||||||
|
// set status for Pods created on versions of kube older than 1.6
|
||||||
|
apiPodStatus.QOSClass = qos.GetPodQOS(pod)
|
||||||
|
|
||||||
apiPodStatus.ContainerStatuses = kl.convertToAPIContainerStatuses(
|
apiPodStatus.ContainerStatuses = kl.convertToAPIContainerStatuses(
|
||||||
pod, podStatus,
|
pod, podStatus,
|
||||||
|
@ -14,7 +14,6 @@ go_library(
|
|||||||
"doc.go",
|
"doc.go",
|
||||||
"policy.go",
|
"policy.go",
|
||||||
"qos.go",
|
"qos.go",
|
||||||
"types.go",
|
|
||||||
],
|
],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
deps = [
|
deps = [
|
||||||
|
@ -23,6 +23,7 @@ go_library(
|
|||||||
"//pkg/fields:go_default_library",
|
"//pkg/fields:go_default_library",
|
||||||
"//pkg/genericapiserver/api/request:go_default_library",
|
"//pkg/genericapiserver/api/request:go_default_library",
|
||||||
"//pkg/kubelet/client:go_default_library",
|
"//pkg/kubelet/client:go_default_library",
|
||||||
|
"//pkg/kubelet/qos:go_default_library",
|
||||||
"//pkg/labels:go_default_library",
|
"//pkg/labels:go_default_library",
|
||||||
"//pkg/registry/generic:go_default_library",
|
"//pkg/registry/generic:go_default_library",
|
||||||
"//pkg/runtime:go_default_library",
|
"//pkg/runtime:go_default_library",
|
||||||
@ -41,6 +42,7 @@ go_test(
|
|||||||
deps = [
|
deps = [
|
||||||
"//pkg/api:go_default_library",
|
"//pkg/api:go_default_library",
|
||||||
"//pkg/api/errors:go_default_library",
|
"//pkg/api/errors:go_default_library",
|
||||||
|
"//pkg/api/resource:go_default_library",
|
||||||
"//pkg/api/testing:go_default_library",
|
"//pkg/api/testing:go_default_library",
|
||||||
"//pkg/apimachinery/registered:go_default_library",
|
"//pkg/apimachinery/registered:go_default_library",
|
||||||
"//pkg/apis/meta/v1:go_default_library",
|
"//pkg/apis/meta/v1:go_default_library",
|
||||||
|
@ -32,6 +32,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/fields"
|
"k8s.io/kubernetes/pkg/fields"
|
||||||
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
|
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/client"
|
"k8s.io/kubernetes/pkg/kubelet/client"
|
||||||
|
"k8s.io/kubernetes/pkg/kubelet/qos"
|
||||||
"k8s.io/kubernetes/pkg/labels"
|
"k8s.io/kubernetes/pkg/labels"
|
||||||
"k8s.io/kubernetes/pkg/registry/generic"
|
"k8s.io/kubernetes/pkg/registry/generic"
|
||||||
"k8s.io/kubernetes/pkg/runtime"
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
@ -61,6 +62,7 @@ func (podStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.O
|
|||||||
pod := obj.(*api.Pod)
|
pod := obj.(*api.Pod)
|
||||||
pod.Status = api.PodStatus{
|
pod.Status = api.PodStatus{
|
||||||
Phase: api.PodPending,
|
Phase: api.PodPending,
|
||||||
|
QOSClass: qos.InternalGetPodQOS(pod),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
|
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/errors"
|
"k8s.io/kubernetes/pkg/api/errors"
|
||||||
|
"k8s.io/kubernetes/pkg/api/resource"
|
||||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||||
"k8s.io/kubernetes/pkg/apimachinery/registered"
|
"k8s.io/kubernetes/pkg/apimachinery/registered"
|
||||||
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
|
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
|
||||||
@ -92,6 +93,80 @@ func TestMatchPod(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getResourceList(cpu, memory string) api.ResourceList {
|
||||||
|
res := api.ResourceList{}
|
||||||
|
if cpu != "" {
|
||||||
|
res[api.ResourceCPU] = resource.MustParse(cpu)
|
||||||
|
}
|
||||||
|
if memory != "" {
|
||||||
|
res[api.ResourceMemory] = resource.MustParse(memory)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func addResource(rName, value string, rl api.ResourceList) api.ResourceList {
|
||||||
|
rl[api.ResourceName(rName)] = resource.MustParse(value)
|
||||||
|
return rl
|
||||||
|
}
|
||||||
|
|
||||||
|
func getResourceRequirements(requests, limits api.ResourceList) api.ResourceRequirements {
|
||||||
|
res := api.ResourceRequirements{}
|
||||||
|
res.Requests = requests
|
||||||
|
res.Limits = limits
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func newContainer(name string, requests api.ResourceList, limits api.ResourceList) api.Container {
|
||||||
|
return api.Container{
|
||||||
|
Name: name,
|
||||||
|
Resources: getResourceRequirements(requests, limits),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newPod(name string, containers []api.Container) *api.Pod {
|
||||||
|
return &api.Pod{
|
||||||
|
ObjectMeta: api.ObjectMeta{
|
||||||
|
Name: name,
|
||||||
|
},
|
||||||
|
Spec: api.PodSpec{
|
||||||
|
Containers: containers,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetPodQOS(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
pod *api.Pod
|
||||||
|
expected api.PodQOSClass
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
pod: newPod("guaranteed", []api.Container{
|
||||||
|
newContainer("guaranteed", getResourceList("100m", "100Mi"), getResourceList("100m", "100Mi")),
|
||||||
|
}),
|
||||||
|
expected: api.PodQOSGuaranteed,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pod: newPod("best-effort", []api.Container{
|
||||||
|
newContainer("best-effort", getResourceList("", ""), getResourceList("", "")),
|
||||||
|
}),
|
||||||
|
expected: api.PodQOSBestEffort,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pod: newPod("burstable", []api.Container{
|
||||||
|
newContainer("burstable", getResourceList("100m", "100Mi"), getResourceList("", "")),
|
||||||
|
}),
|
||||||
|
expected: api.PodQOSBurstable,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for id, testCase := range testCases {
|
||||||
|
Strategy.PrepareForCreate(genericapirequest.NewContext(), testCase.pod)
|
||||||
|
actual := testCase.pod.Status.QOSClass
|
||||||
|
if actual != testCase.expected {
|
||||||
|
t.Errorf("[%d]: invalid qos pod %s, expected: %s, actual: %s", id, testCase.pod.Name, testCase.expected, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestCheckGracefulDelete(t *testing.T) {
|
func TestCheckGracefulDelete(t *testing.T) {
|
||||||
defaultGracePeriod := int64(30)
|
defaultGracePeriod := int64(30)
|
||||||
tcs := []struct {
|
tcs := []struct {
|
||||||
|
@ -24,6 +24,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"k8s.io/kubernetes/pkg/api/resource"
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
|
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
|
||||||
"k8s.io/kubernetes/pkg/labels"
|
"k8s.io/kubernetes/pkg/labels"
|
||||||
@ -36,8 +37,10 @@ import (
|
|||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = framework.KubeDescribe("Pods Delete Grace Period", func() {
|
var _ = framework.KubeDescribe("Pods Extended", func() {
|
||||||
f := framework.NewDefaultFramework("pods")
|
f := framework.NewDefaultFramework("pods")
|
||||||
|
|
||||||
|
framework.KubeDescribe("Delete Grace Period", func() {
|
||||||
var podClient *framework.PodClient
|
var podClient *framework.PodClient
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
podClient = f.PodClient()
|
podClient = f.PodClient()
|
||||||
@ -187,4 +190,50 @@ var _ = framework.KubeDescribe("Pods Delete Grace Period", func() {
|
|||||||
Expect(len(pods.Items)).To(Equal(0))
|
Expect(len(pods.Items)).To(Equal(0))
|
||||||
|
|
||||||
})
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
framework.KubeDescribe("Pods Set QOS Class", func() {
|
||||||
|
var podClient *framework.PodClient
|
||||||
|
BeforeEach(func() {
|
||||||
|
podClient = f.PodClient()
|
||||||
|
})
|
||||||
|
It("should be submitted and removed [Conformance]", func() {
|
||||||
|
By("creating the pod")
|
||||||
|
name := "pod-qos-class-" + string(uuid.NewUUID())
|
||||||
|
pod := &v1.Pod{
|
||||||
|
ObjectMeta: v1.ObjectMeta{
|
||||||
|
Name: name,
|
||||||
|
Labels: map[string]string{
|
||||||
|
"name": name,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Spec: v1.PodSpec{
|
||||||
|
Containers: []v1.Container{
|
||||||
|
{
|
||||||
|
Name: "nginx",
|
||||||
|
Image: "gcr.io/google_containers/nginx-slim:0.7",
|
||||||
|
Resources: v1.ResourceRequirements{
|
||||||
|
Limits: v1.ResourceList{
|
||||||
|
"cpu": resource.MustParse("100m"),
|
||||||
|
"memory": resource.MustParse("100Mi"),
|
||||||
|
},
|
||||||
|
Requests: v1.ResourceList{
|
||||||
|
"cpu": resource.MustParse("100m"),
|
||||||
|
"memory": resource.MustParse("100Mi"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
By("submitting the pod to kubernetes")
|
||||||
|
podClient.Create(pod)
|
||||||
|
|
||||||
|
By("verifying QOS class is set on the pod")
|
||||||
|
pod, err := podClient.Get(name, metav1.GetOptions{})
|
||||||
|
Expect(err).NotTo(HaveOccurred(), "failed to query for pod")
|
||||||
|
Expect(pod.Status.QOSClass == v1.PodQOSGuaranteed)
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
@ -86,7 +86,6 @@ go_test(
|
|||||||
"//pkg/kubelet/dockertools:go_default_library",
|
"//pkg/kubelet/dockertools:go_default_library",
|
||||||
"//pkg/kubelet/images:go_default_library",
|
"//pkg/kubelet/images:go_default_library",
|
||||||
"//pkg/kubelet/metrics:go_default_library",
|
"//pkg/kubelet/metrics:go_default_library",
|
||||||
"//pkg/kubelet/qos:go_default_library",
|
|
||||||
"//pkg/labels:go_default_library",
|
"//pkg/labels:go_default_library",
|
||||||
"//pkg/metrics:go_default_library",
|
"//pkg/metrics:go_default_library",
|
||||||
"//pkg/runtime:go_default_library",
|
"//pkg/runtime:go_default_library",
|
||||||
|
Loading…
Reference in New Issue
Block a user