Merge pull request #8712 from sseago/pod-initcontainer-securitycontext

Copy SecurityContext from Containers[0] if present for PVR
pull/3355/merge
Xun Jiang/Bruce Jiang 2025-02-25 11:02:57 +08:00 committed by GitHub
commit ad08c7a3ff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 49 additions and 5 deletions

View File

@ -0,0 +1 @@
Copy SecurityContext from Containers[0] if present for PVR

View File

@ -147,7 +147,7 @@ func (a *PodVolumeRestoreAction) Execute(input *velero.RestoreItemActionExecuteI
resourceReqs, err := kube.ParseResourceRequirements(cpuRequest, memRequest, cpuLimit, memLimit)
if err != nil {
log.Errorf("Using default resource values, couldn't parse resource requirements: %s.", err)
log.Errorf("couldn't parse resource requirements: %s.", err)
resourceReqs, _ = kube.ParseResourceRequirements(
defaultCPURequestLimit, defaultMemRequestLimit, // requests
defaultCPURequestLimit, defaultMemRequestLimit, // limits
@ -157,15 +157,24 @@ func (a *PodVolumeRestoreAction) Execute(input *velero.RestoreItemActionExecuteI
runAsUser, runAsGroup, allowPrivilegeEscalation, secCtx := getSecurityContext(log, config)
var securityContext corev1.SecurityContext
if runAsUser == "" && runAsGroup == "" && allowPrivilegeEscalation == "" && secCtx == "" {
securityContext = defaultSecurityCtx()
} else {
securityContextSet := false
// Use securityContext settings from configmap if available
if runAsUser != "" || runAsGroup != "" || allowPrivilegeEscalation != "" || secCtx != "" {
securityContext, err = kube.ParseSecurityContext(runAsUser, runAsGroup, allowPrivilegeEscalation, secCtx)
if err != nil {
log.Errorf("Using default securityContext values, couldn't parse securityContext requirements: %s.", err)
securityContext = defaultSecurityCtx()
} else {
securityContextSet = true
}
}
// if first container in pod has a SecurityContext set, then copy this security context
if len(pod.Spec.Containers) != 0 && pod.Spec.Containers[0].SecurityContext != nil {
securityContext = *pod.Spec.Containers[0].SecurityContext.DeepCopy()
securityContextSet = true
}
if !securityContextSet {
securityContext = defaultSecurityCtx()
}
initContainerBuilder := newRestoreInitContainerBuilder(image, string(input.Restore.UID))
initContainerBuilder.Resources(&resourceReqs)

View File

@ -128,6 +128,18 @@ func TestPodVolumeRestoreActionExecute(t *testing.T) {
RunAsUser: &id,
RunAsNonRoot: boolptr.True(),
}
customID := int64(44444)
customSecurityContext := corev1api.SecurityContext{
AllowPrivilegeEscalation: boolptr.False(),
Capabilities: &corev1api.Capabilities{
Drop: []corev1api.Capability{"ALL"},
},
SeccompProfile: &corev1api.SeccompProfile{
Type: corev1api.SeccompProfileTypeRuntimeDefault,
},
RunAsUser: &customID,
RunAsNonRoot: boolptr.True(),
}
var (
restoreName = "my-restore"
@ -264,6 +276,28 @@ func TestPodVolumeRestoreActionExecute(t *testing.T) {
Command([]string{"/velero-restore-helper"}).Result()).
Result(),
},
{
name: "Restoring pod with custom container SecurityContext uses this SecurityContext for the restore initContainer",
pod: builder.ForPod("ns-1", "my-pod").
ObjectMeta(
builder.WithAnnotations("snapshot.velero.io/myvol", "")).
Containers(
builder.ForContainer("app-container", "app-image").
SecurityContext(&customSecurityContext).Result()).
Result(),
want: builder.ForPod("ns-1", "my-pod").
ObjectMeta(
builder.WithAnnotations("snapshot.velero.io/myvol", "")).
Containers(
builder.ForContainer("app-container", "app-image").
SecurityContext(&customSecurityContext).Result()).
InitContainers(
newRestoreInitContainerBuilder(defaultRestoreHelperImage, "").
Resources(&resourceReqs).
SecurityContext(&customSecurityContext).
VolumeMounts(builder.ForVolumeMount("myvol", "/restores/myvol").Result()).
Command([]string{"/velero-restore-helper"}).Result()).Result(),
},
}
veleroDeployment := &appsv1.Deployment{