actions / actions/actions-runner-controller
Support to pod security policies and node selectors
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 6.5k
- Forks
- 1.5k
- Avg merge
- 2d 2h
- Merged PRs (30d)
- 27
Description
Hello,
I am implementing this solution on my cluster, where the following pod security policy is applied: https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/policy/restricted-psp.yaml
As described in the Kubernetes documentation, the policy is authorised with this cluster role:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: psp:restricted
rules:
- apiGroups: ['extensions']
resources: ['podsecuritypolicies']
verbs: ['use']
resourceNames:
- restricted
and this cluster role binding:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: default:restricted
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: psp:restricted
subjects:
- kind: Group
name: system:authenticated
apiGroup: rbac.authorization.k8s.io
Besides the pod security policy, I have more than a node group and I would like to have the pods of the actions-runner-system namespace running in the non-production-nodegroup node group.
In order to have your controller-manager deployment creating a pod successfully, I had to add the following rows at the end of its definition:
...
securityContext:
runAsUser: 1000
fsGroup: 1000
nodeSelector:
eks.amazonaws.com/nodegroup: non-production-nodegroup
Then I have created a runner deployment, which needed some tweaks for the pod security policy and the node selector:
apiVersion: actions.summerwind.dev/v1alpha1
kind: RunnerDeployment
metadata:
name: example-runnerdeploy
namespace: actions-runner-system
spec:
replicas: 1
template:
spec:
repository: my-organisation/my-repository
containers:
- name: summerwind-runner
image: summerwind/actions-runner
env:
- name: RUNNER_NAME
value: summerwind-runner
- name: RUNNER_REPO
value: my-organisation/my-repository
- name: RUNNER_TOKEN
valueFrom:
secretKeyRef:
name: controller-manager
key: github_token
volumeMounts:
- name: runner-externals
mountPath: /runner/externals
securityContext:
privileged: false
runAsUser: 1000
fsGroup: 1000
volumes:
- name: runner-externals
emptyDir: {}
nodeSelector:
eks.amazonaws.com/nodegroup: non-production-nodegroup
As you can see, I had to add explicitly the envs and the volumes to have the runner and its pod running in the cluster.
Unfortunately it is not enough to have the self-hosted runner in GitHub. In the runner's pod I can find the following in the logs:
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
.path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Starting Runner listener with startup type: service
Started listener process
Started running service
An error occurred: Not configured
Runner listener exited with error code 2
Runner listener exit with retryable error, re-launch runner in 5 seconds.
Starting Runner listener with startup type: service
Started listener process
An error occurred: Not configured
Runner listener exited with error code 2
Runner listener exit with retryable error, re-launch runner in 5 seconds.
The last 5 rows are repeated infinitely.
As far as I can understand, it tries to run the pod with root privileges, but the pod security context doesn't allow it.
Is there a way to have the self-hosted runners created from a Kubernetes cluster with pod security policies? The node selector does not seem to cause troubles, but I had to adapt your solution to use it.
It would be great to have support for both the security policies and the node selectors in the future Helm chart. Thanks in advance.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the Helm chart's controller-manager and RunnerDeployment pod definitions described in the issue. Check how security contexts, node selectors, environment variables, and volumes are currently supplied, then verify that configurable values allow pods to run under the stated pod security policy and on the selected node group.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go, helm, kubernetes
- Domain
- devops, infrastructure
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100