mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 20:53:33 +00:00
Merge pull request #24674 from gmarek/maxpods
Automatic merge from submit-queue Enforce --max-pods in kubelet admission; previously was only enforced in scheduler This is an ugly hack - I spent some time trying to understand what one NodeInfo has in common with the other one, but at some point decided that I just don't have time to do that. Fixes #24262 Fixes #20263 cc @HaiyangDING @lavalamp
This commit is contained in:
commit
2ec908083b
@ -2366,10 +2366,24 @@ func TestHandlePortConflicts(t *testing.T) {
|
|||||||
testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil)
|
testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil)
|
||||||
|
|
||||||
kl.nodeLister = testNodeLister{nodes: []api.Node{
|
kl.nodeLister = testNodeLister{nodes: []api.Node{
|
||||||
{ObjectMeta: api.ObjectMeta{Name: kl.nodeName}},
|
{
|
||||||
|
ObjectMeta: api.ObjectMeta{Name: kl.nodeName},
|
||||||
|
Status: api.NodeStatus{
|
||||||
|
Allocatable: api.ResourceList{
|
||||||
|
api.ResourcePods: *resource.NewQuantity(110, resource.DecimalSI),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
kl.nodeInfo = testNodeInfo{nodes: []api.Node{
|
kl.nodeInfo = testNodeInfo{nodes: []api.Node{
|
||||||
{ObjectMeta: api.ObjectMeta{Name: kl.nodeName}},
|
{
|
||||||
|
ObjectMeta: api.ObjectMeta{Name: kl.nodeName},
|
||||||
|
Status: api.NodeStatus{
|
||||||
|
Allocatable: api.ResourceList{
|
||||||
|
api.ResourcePods: *resource.NewQuantity(110, resource.DecimalSI),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
spec := api.PodSpec{NodeName: kl.nodeName, Containers: []api.Container{{Ports: []api.ContainerPort{{HostPort: 80}}}}}
|
spec := api.PodSpec{NodeName: kl.nodeName, Containers: []api.Container{{Ports: []api.ContainerPort{{HostPort: 80}}}}}
|
||||||
@ -2427,10 +2441,24 @@ func TestHandleHostNameConflicts(t *testing.T) {
|
|||||||
testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil)
|
testKubelet.fakeCadvisor.On("RootFsInfo").Return(cadvisorapiv2.FsInfo{}, nil)
|
||||||
|
|
||||||
kl.nodeLister = testNodeLister{nodes: []api.Node{
|
kl.nodeLister = testNodeLister{nodes: []api.Node{
|
||||||
{ObjectMeta: api.ObjectMeta{Name: "127.0.0.1"}},
|
{
|
||||||
|
ObjectMeta: api.ObjectMeta{Name: "127.0.0.1"},
|
||||||
|
Status: api.NodeStatus{
|
||||||
|
Allocatable: api.ResourceList{
|
||||||
|
api.ResourcePods: *resource.NewQuantity(110, resource.DecimalSI),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
kl.nodeInfo = testNodeInfo{nodes: []api.Node{
|
kl.nodeInfo = testNodeInfo{nodes: []api.Node{
|
||||||
{ObjectMeta: api.ObjectMeta{Name: "127.0.0.1"}},
|
{
|
||||||
|
ObjectMeta: api.ObjectMeta{Name: "127.0.0.1"},
|
||||||
|
Status: api.NodeStatus{
|
||||||
|
Allocatable: api.ResourceList{
|
||||||
|
api.ResourcePods: *resource.NewQuantity(110, resource.DecimalSI),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
pods := []*api.Pod{
|
pods := []*api.Pod{
|
||||||
@ -2486,10 +2514,24 @@ func TestHandleNodeSelector(t *testing.T) {
|
|||||||
testKubelet := newTestKubelet(t)
|
testKubelet := newTestKubelet(t)
|
||||||
kl := testKubelet.kubelet
|
kl := testKubelet.kubelet
|
||||||
kl.nodeLister = testNodeLister{nodes: []api.Node{
|
kl.nodeLister = testNodeLister{nodes: []api.Node{
|
||||||
{ObjectMeta: api.ObjectMeta{Name: testKubeletHostname, Labels: map[string]string{"key": "B"}}},
|
{
|
||||||
|
ObjectMeta: api.ObjectMeta{Name: testKubeletHostname, Labels: map[string]string{"key": "B"}},
|
||||||
|
Status: api.NodeStatus{
|
||||||
|
Allocatable: api.ResourceList{
|
||||||
|
api.ResourcePods: *resource.NewQuantity(110, resource.DecimalSI),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
kl.nodeInfo = testNodeInfo{nodes: []api.Node{
|
kl.nodeInfo = testNodeInfo{nodes: []api.Node{
|
||||||
{ObjectMeta: api.ObjectMeta{Name: testKubeletHostname, Labels: map[string]string{"key": "B"}}},
|
{
|
||||||
|
ObjectMeta: api.ObjectMeta{Name: testKubeletHostname, Labels: map[string]string{"key": "B"}},
|
||||||
|
Status: api.NodeStatus{
|
||||||
|
Allocatable: api.ResourceList{
|
||||||
|
api.ResourcePods: *resource.NewQuantity(110, resource.DecimalSI),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil)
|
testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil)
|
||||||
testKubelet.fakeCadvisor.On("DockerImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil)
|
testKubelet.fakeCadvisor.On("DockerImagesFsInfo").Return(cadvisorapiv2.FsInfo{}, nil)
|
||||||
|
@ -425,6 +425,10 @@ func podName(pod *api.Pod) string {
|
|||||||
func podFitsResourcesInternal(pod *api.Pod, nodeName string, nodeInfo *schedulercache.NodeInfo, info *api.Node) (bool, error) {
|
func podFitsResourcesInternal(pod *api.Pod, nodeName string, nodeInfo *schedulercache.NodeInfo, info *api.Node) (bool, error) {
|
||||||
allocatable := info.Status.Allocatable
|
allocatable := info.Status.Allocatable
|
||||||
allowedPodNumber := allocatable.Pods().Value()
|
allowedPodNumber := allocatable.Pods().Value()
|
||||||
|
if int64(len(nodeInfo.Pods()))+1 > allowedPodNumber {
|
||||||
|
return false,
|
||||||
|
newInsufficientResourceError(podCountResourceName, 1, int64(len(nodeInfo.Pods())), allowedPodNumber)
|
||||||
|
}
|
||||||
podRequest := getResourceRequest(pod)
|
podRequest := getResourceRequest(pod)
|
||||||
if podRequest.milliCPU == 0 && podRequest.memory == 0 {
|
if podRequest.milliCPU == 0 && podRequest.memory == 0 {
|
||||||
return true, nil
|
return true, nil
|
||||||
@ -451,13 +455,6 @@ func (r *NodeStatus) PodFitsResources(pod *api.Pod, nodeName string, nodeInfo *s
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
// TODO: move the following podNumber check to podFitsResourcesInternal when Kubelet allows podNumber check (See #20263).
|
|
||||||
allocatable := info.Status.Allocatable
|
|
||||||
allowedPodNumber := allocatable.Pods().Value()
|
|
||||||
if int64(len(nodeInfo.Pods()))+1 > allowedPodNumber {
|
|
||||||
return false,
|
|
||||||
newInsufficientResourceError(podCountResourceName, 1, int64(len(nodeInfo.Pods())), allowedPodNumber)
|
|
||||||
}
|
|
||||||
return podFitsResourcesInternal(pod, nodeName, nodeInfo, info)
|
return podFitsResourcesInternal(pod, nodeName, nodeInfo, info)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -775,6 +772,7 @@ func RunGeneralPredicates(pod *api.Pod, nodeName string, nodeInfo *schedulercach
|
|||||||
if !fit {
|
if !fit {
|
||||||
return fit, err
|
return fit, err
|
||||||
}
|
}
|
||||||
|
|
||||||
fit, err = PodFitsHost(pod, nodeName, nodeInfo)
|
fit, err = PodFitsHost(pod, nodeName, nodeInfo)
|
||||||
if !fit {
|
if !fit {
|
||||||
return fit, err
|
return fit, err
|
||||||
|
Loading…
Reference in New Issue
Block a user