make kubelet call updatePodSandboxResources on PodResizeAction

This commit is contained in:
Filipe Xavier 2024-11-06 09:21:36 -03:00
parent b27c303ac2
commit ce4de97c2e
6 changed files with 910 additions and 546 deletions

View File

@ -272,6 +272,15 @@ func (in instrumentedRuntimeService) PortForward(ctx context.Context, req *runti
return resp, err
}
func (in instrumentedRuntimeService) UpdatePodSandboxResources(ctx context.Context, req *runtimeapi.UpdatePodSandboxResourcesRequest) (*runtimeapi.UpdatePodSandboxResourcesResponse, error) {
const operation = "update_podsandbox"
defer recordOperation(operation, time.Now())
resp, err := in.service.UpdatePodSandboxResources(ctx, req)
recordError(operation, err)
return resp, err
}
func (in instrumentedRuntimeService) UpdateRuntimeConfig(ctx context.Context, runtimeConfig *runtimeapi.RuntimeConfig) error {
const operation = "update_runtime_config"
defer recordOperation(operation, time.Now())

View File

@ -33,6 +33,7 @@ import (
"sync"
"time"
codes "google.golang.org/grpc/codes"
crierror "k8s.io/cri-api/pkg/errors"
"github.com/opencontainers/selinux/go-selinux"
@ -411,6 +412,25 @@ func (m *kubeGenericRuntimeManager) updateContainerResources(pod *v1.Pod, contai
return err
}
func (m *kubeGenericRuntimeManager) updatePodSandboxResources(sandboxID string, pod *v1.Pod) error {
podResourcesRequest := &runtimeapi.UpdatePodSandboxResourcesRequest{
PodSandboxId: sandboxID,
Overhead: m.convertOverheadToLinuxResources(pod),
Resources: m.calculateSandboxResources(pod),
}
ctx := context.Background()
_, err := m.runtimeService.UpdatePodSandboxResources(ctx, podResourcesRequest)
if err != nil {
stat, _ := grpcstatus.FromError(err)
if stat.Code() == codes.Unimplemented {
klog.ErrorS(err, "updatePodSandboxResources failed: method unimplemented on runtime service", "sandboxID", sandboxID)
return nil
}
}
return err
}
// makeDevices generates container devices for kubelet runtime v1.
func makeDevices(opts *kubecontainer.RunContainerOptions) []*runtimeapi.Device {
devices := make([]*runtimeapi.Device, len(opts.Devices))

View File

@ -969,3 +969,39 @@ func TestUpdateContainerResources(t *testing.T) {
// Verify container is updated
assert.Contains(t, fakeRuntime.Called, "UpdateContainerResources")
}
// TestUpdatePodSandboxResources tests updating a podSandBox resources.
func TestUpdatePodSandboxResources(t *testing.T) {
fakeRuntime, _, m, errCreate := createTestRuntimeManager()
require.NoError(t, errCreate)
pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
UID: "12345678",
Name: "bar",
Namespace: "new",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "foo",
Image: "busybox",
ImagePullPolicy: v1.PullIfNotPresent,
},
},
},
}
// Create fake sandbox and container
fakeSandbox, fakeContainers := makeAndSetFakePod(t, m, fakeRuntime, pod)
assert.Len(t, fakeContainers, 1)
ctx := context.Background()
_, err := m.getPodContainerStatuses(ctx, pod.UID, pod.Name, pod.Namespace)
require.NoError(t, err)
err = m.updatePodSandboxResources(fakeSandbox.Id, pod)
require.NoError(t, err)
// Verify sandbox is updated
assert.Contains(t, fakeRuntime.Called, "UpdatePodSandboxResources")
}

View File

@ -775,6 +775,9 @@ func (m *kubeGenericRuntimeManager) doPodResizeAction(pod *v1.Pod, podContainerC
result.Fail(errResize)
return
}
if errUpdate := m.updatePodSandboxResources(podContainerChanges.SandboxID, pod); errUpdate != nil {
klog.ErrorS(err, "updatePodSandboxResources failed", "pod", pod.Name)
}
}
if len(podContainerChanges.ContainersToUpdate[v1.ResourceCPU]) > 0 || podContainerChanges.UpdatePodResources {
if podResources.CPUShares == nil {
@ -801,6 +804,9 @@ func (m *kubeGenericRuntimeManager) doPodResizeAction(pod *v1.Pod, podContainerC
result.Fail(errResize)
return
}
if errUpdate := m.updatePodSandboxResources(podContainerChanges.SandboxID, pod); errUpdate != nil {
klog.ErrorS(err, "updatePodSandboxResources failed", "pod", pod.Name)
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1077,6 +1077,19 @@ message WindowsContainerResources {
int64 memory_limit_in_bytes = 4;
// Specifies the size of the rootfs / scratch space in bytes to be configured for this container. Default: 0 (not specified).
int64 rootfs_size_in_bytes = 5;
// Optionally specifies the set of CPUs to affinitize for this container.
repeated WindowsCpuGroupAffinity affinity_cpus = 6;
}
// WindowsCpuGroupAffinity specifies the CPU mask and group to affinitize.
// This is similar to the following _GROUP_AFFINITY structure:
// https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/miniport/ns-miniport-_group_affinity
message WindowsCpuGroupAffinity {
// CPU mask relative to this CPU group.
uint64 cpu_mask = 1;
// Processor group the mask refers to, as returned by
// GetLogicalProcessorInformationEx.
uint32 cpu_group = 2;
}
// ContainerMetadata holds all necessary information for building the container