feat: Support arbitrarily setting `privileged: true` for runner container (#1383)
Resolves #1282
This commit is contained in:
parent
65a67ee61c
commit
3a7e8c844b
23
README.md
23
README.md
|
|
@ -444,6 +444,17 @@ spec:
|
||||||
requests:
|
requests:
|
||||||
cpu: "2.0"
|
cpu: "2.0"
|
||||||
memory: "4Gi"
|
memory: "4Gi"
|
||||||
|
# This is an advanced configuration. Don't touch it unless you know what you're doing.
|
||||||
|
securityContext:
|
||||||
|
# Usually, the runner container's privileged field is derived from dockerdWithinRunnerContainer.
|
||||||
|
# But in the case where you need to run privileged job steps even if you don't use docker/don't need dockerd within the runner container,
|
||||||
|
# just specified `privileged: true` like this.
|
||||||
|
# See https://github.com/actions-runner-controller/actions-runner-controller/issues/1282
|
||||||
|
# Do note that specifying `privileged: false` while using dind is very likely to fail, even if you use some vm-based container runtimes
|
||||||
|
# like firecracker and kata. Basically they run containers within dedicated micro vms and so
|
||||||
|
# it's more like you can use `privileged: true` safer with those runtimes.
|
||||||
|
#
|
||||||
|
# privileged: true
|
||||||
- name: docker
|
- name: docker
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
|
|
@ -1138,6 +1149,18 @@ spec:
|
||||||
# This must match the name of a RuntimeClass resource available on the cluster.
|
# This must match the name of a RuntimeClass resource available on the cluster.
|
||||||
# More info: https://kubernetes.io/docs/concepts/containers/runtime-class
|
# More info: https://kubernetes.io/docs/concepts/containers/runtime-class
|
||||||
runtimeClassName: "runc"
|
runtimeClassName: "runc"
|
||||||
|
# This is an advanced configuration. Don't touch it unless you know what you're doing.
|
||||||
|
containers:
|
||||||
|
- name: runner
|
||||||
|
# Usually, the runner container's privileged field is derived from dockerdWithinRunnerContainer.
|
||||||
|
# But in the case where you need to run privileged job steps even if you don't use docker/don't need dockerd within the runner container,
|
||||||
|
# just specified `privileged: true` like this.
|
||||||
|
# See https://github.com/actions-runner-controller/actions-runner-controller/issues/1282
|
||||||
|
# Do note that specifying `privileged: false` while using dind is very likely to fail, even if you use some vm-based container runtimes
|
||||||
|
# like firecracker and kata. Basically they run containers within dedicated micro vms and so
|
||||||
|
# it's more like you can use `privileged: true` safer with those runtimes.
|
||||||
|
#
|
||||||
|
# privileged: true
|
||||||
```
|
```
|
||||||
|
|
||||||
### Custom Volume mounts
|
### Custom Volume mounts
|
||||||
|
|
|
||||||
|
|
@ -388,8 +388,7 @@ func TestNewRunnerPod(t *testing.T) {
|
||||||
DockerEnabled: boolPtr(false),
|
DockerEnabled: boolPtr(false),
|
||||||
},
|
},
|
||||||
want: newTestPod(dockerDisabled, func(p *corev1.Pod) {
|
want: newTestPod(dockerDisabled, func(p *corev1.Pod) {
|
||||||
// TODO
|
p.Spec.Containers[0].SecurityContext.Privileged = boolPtr(true)
|
||||||
// p.Spec.Containers[0].SecurityContext.Privileged = boolPtr(true)
|
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -880,7 +879,7 @@ func TestNewRunnerPodFromRunnerController(t *testing.T) {
|
||||||
},
|
},
|
||||||
|
|
||||||
want: newTestPod(dockerDisabled, func(p *corev1.Pod) {
|
want: newTestPod(dockerDisabled, func(p *corev1.Pod) {
|
||||||
// p.Spec.Containers[0].SecurityContext.Privileged = boolPtr(true)
|
p.Spec.Containers[0].SecurityContext.Privileged = boolPtr(true)
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -349,24 +349,51 @@ func (r *RunnerReconciler) newPod(runner v1alpha1.Runner) (corev1.Pod, error) {
|
||||||
if len(runner.Spec.Containers) == 0 {
|
if len(runner.Spec.Containers) == 0 {
|
||||||
template.Spec.Containers = append(template.Spec.Containers, corev1.Container{
|
template.Spec.Containers = append(template.Spec.Containers, corev1.Container{
|
||||||
Name: "runner",
|
Name: "runner",
|
||||||
ImagePullPolicy: runner.Spec.ImagePullPolicy,
|
|
||||||
EnvFrom: runner.Spec.EnvFrom,
|
|
||||||
Env: runner.Spec.Env,
|
|
||||||
Resources: runner.Spec.Resources,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
if (runner.Spec.DockerEnabled == nil || *runner.Spec.DockerEnabled) && (runner.Spec.DockerdWithinRunnerContainer == nil || !*runner.Spec.DockerdWithinRunnerContainer) {
|
if (runner.Spec.DockerEnabled == nil || *runner.Spec.DockerEnabled) && (runner.Spec.DockerdWithinRunnerContainer == nil || !*runner.Spec.DockerdWithinRunnerContainer) {
|
||||||
template.Spec.Containers = append(template.Spec.Containers, corev1.Container{
|
template.Spec.Containers = append(template.Spec.Containers, corev1.Container{
|
||||||
Name: "docker",
|
Name: "docker",
|
||||||
VolumeMounts: runner.Spec.DockerVolumeMounts,
|
|
||||||
Resources: runner.Spec.DockerdContainerResources,
|
|
||||||
Env: runner.Spec.DockerEnv,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
template.Spec.Containers = runner.Spec.Containers
|
template.Spec.Containers = runner.Spec.Containers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for i, c := range template.Spec.Containers {
|
||||||
|
switch c.Name {
|
||||||
|
case "runner":
|
||||||
|
if c.ImagePullPolicy == "" {
|
||||||
|
template.Spec.Containers[i].ImagePullPolicy = runner.Spec.ImagePullPolicy
|
||||||
|
}
|
||||||
|
if len(c.EnvFrom) == 0 {
|
||||||
|
template.Spec.Containers[i].EnvFrom = runner.Spec.EnvFrom
|
||||||
|
}
|
||||||
|
if len(c.Env) == 0 {
|
||||||
|
template.Spec.Containers[i].Env = runner.Spec.Env
|
||||||
|
}
|
||||||
|
if len(c.Resources.Requests) == 0 {
|
||||||
|
template.Spec.Containers[i].Resources.Requests = runner.Spec.Resources.Requests
|
||||||
|
}
|
||||||
|
if len(c.Resources.Limits) == 0 {
|
||||||
|
template.Spec.Containers[i].Resources.Limits = runner.Spec.Resources.Limits
|
||||||
|
}
|
||||||
|
case "docker":
|
||||||
|
if len(c.VolumeMounts) == 0 {
|
||||||
|
template.Spec.Containers[i].VolumeMounts = runner.Spec.DockerVolumeMounts
|
||||||
|
}
|
||||||
|
if len(c.Resources.Limits) == 0 {
|
||||||
|
template.Spec.Containers[i].Resources.Limits = runner.Spec.DockerdContainerResources.Limits
|
||||||
|
}
|
||||||
|
if len(c.Resources.Requests) == 0 {
|
||||||
|
template.Spec.Containers[i].Resources.Requests = runner.Spec.DockerdContainerResources.Requests
|
||||||
|
}
|
||||||
|
if len(c.Env) == 0 {
|
||||||
|
template.Spec.Containers[i].Env = runner.Spec.DockerEnv
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template.Spec.SecurityContext = runner.Spec.SecurityContext
|
template.Spec.SecurityContext = runner.Spec.SecurityContext
|
||||||
template.Spec.EnableServiceLinks = runner.Spec.EnableServiceLinks
|
template.Spec.EnableServiceLinks = runner.Spec.EnableServiceLinks
|
||||||
|
|
||||||
|
|
@ -623,8 +650,11 @@ func newRunnerPod(runnerName string, template corev1.Pod, runnerSpec v1alpha1.Ru
|
||||||
if runnerContainer.SecurityContext == nil {
|
if runnerContainer.SecurityContext == nil {
|
||||||
runnerContainer.SecurityContext = &corev1.SecurityContext{}
|
runnerContainer.SecurityContext = &corev1.SecurityContext{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if runnerContainer.SecurityContext.Privileged == nil {
|
||||||
// Runner need to run privileged if it contains DinD
|
// Runner need to run privileged if it contains DinD
|
||||||
runnerContainer.SecurityContext.Privileged = &dockerdInRunnerPrivileged
|
runnerContainer.SecurityContext.Privileged = &dockerdInRunnerPrivileged
|
||||||
|
}
|
||||||
|
|
||||||
pod := template.DeepCopy()
|
pod := template.DeepCopy()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue