We use cookies to make your experience better.
Learn how to run Podman in Coder.
This article will walk you through setting up Podman for use in Coder workspaces
Podman is a container engine (similar to Docker) that is compatible with the OCI containers specification. Podman is useful if you'd like an alternative to CVM workspaces or if your Linux kernel doesn't support CVMs.
Please be aware that there are limitations related to running Podman in rootless mode.
Install smarter-device-manager
and expose the FUSE device through it. To do
so, create a file called smarter-device-manager.yaml
with the following
contents:
apiVersion: v1
kind: Namespace
metadata:
name: smarter-device-manager
labels:
name: smarter-device-manager
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: smarter-device-manager
namespace: smarter-device-manager
spec:
hard:
pods: 50
scopeSelector:
matchExpressions:
- operator: In
scopeName: PriorityClass
values:
- system-node-critical
- system-cluster-critical
---
apiVersion: v1
kind: ConfigMap
metadata:
name: smarter-device-manager
namespace: smarter-device-manager
data:
conf.yaml: |+
- devicematch: ^fuse$
nummaxdevices: 50
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: smarter-device-manager
namespace: smarter-device-manager
labels:
name: smarter-device-manager
role: agent
spec:
selector:
matchLabels:
name: smarter-device-manager
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
name: smarter-device-manager
annotations:
node.kubernetes.io/bootstrap-checkpoint: "true"
spec:
nodeSelector:
smarter-device-manager: enabled
priorityClassName: "system-node-critical"
hostname: smarter-device-management
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- name: smarter-device-manager
image: registry.gitlab.com/arm-research/smarter/smarter-device-manager:v1.20.7
imagePullPolicy: IfNotPresent
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
resources:
limits:
cpu: 100m
memory: 15Mi
requests:
cpu: 10m
memory: 15Mi
volumeMounts:
- name: device-plugin
mountPath: /var/lib/kubelet/device-plugins
- name: dev-dir
mountPath: /dev
- name: sys-dir
mountPath: /sys
- name: config
mountPath: /root/config
volumes:
- name: device-plugin
hostPath:
path: /var/lib/kubelet/device-plugins
- name: dev-dir
hostPath:
path: /dev
- name: sys-dir
hostPath:
path: /sys
- name: config
configMap:
name: smarter-device-manager
terminationGracePeriodSeconds: 30
Next, apply the changes to your clusters by running:
kubectl apply -f ./smarter-device-manager.yaml
The example DaemonSet
includes a nodeSelector
that constrains the device
plugin to nodes with the smarter-device-manager
label set to enabled
.
Label the nodes that will include the FUSE device by using the following
command, or remove the nodeSelector
from the manifest:
kubectl get nodes
kubectl label nodes --all smarter-device-manager=enabled
If you haven't already done so for your Coder deployment, enable workspace templates. To do so, go to Manage > Admin > Templates, and set the Enable workspace templates to On. Click Save.
Create a workspace configuration file that includes instructions for resource requests and resource limits (the instructions ask the cluster to request the FUSE device for each workspace):
version: "0.2"
workspace:
specs:
kubernetes:
resource-requests:
policy: write
value:
smarter-devices/fuse: "1"
resource-limits:
policy: write
value:
smarter-devices/fuse: "1"
A complete workspace template might look something like
version: "0.2"
workspace:
configure:
start:
policy: write
dev-urls:
policy: write
specs:
aws-ec2-docker:
container-image:
policy: write
disk-size:
policy: write
instance-type:
policy: write
docker:
container-based-vm:
policy: write
image:
policy: write
kubernetes:
annotations:
policy: read
container-based-vm:
policy: write
cpu:
policy: write
disk:
policy: write
env:
policy: write
gpu-count:
policy: write
image:
policy: write
labels:
policy: read
memory:
policy: write
node-selector:
policy: read
privileged:
policy: read
resource-requests:
policy: write
value:
smarter-devices/fuse: "1"
resource-limits:
policy: write
value:
smarter-devices/fuse: "1"
runtime-class-name:
policy: read
tolerations:
policy: read
In the Coder UI, navigate to Manage > Admin > Templates if you haven't already done so. Under template policy, upload the configuration file you created in the previous step. Click Save.
With the above template policy, all workspaces will acquire a FUSE device, which enables Podman to operate in rootless mode.
Running Podman in rootless mode requires a FUSE device to implement the overlay filesystem (fuse-overlayfs) in unprivileged mode. The following directions work by mounting the FUSE device from the host into workspace containers, which conflicts with the isolation provided by SELinux and AppArmor.
For systems running AppArmor (typically Debian- and Ubuntu-derived systems), please disable AppArmor before proceeding.
For systems running SELinux (typically Fedora-, CentOS-, and Red Hat-based
systems), please disable SELinux or set it to permissive
mode.
At this point, you can create a workspace that leverages Podman. If you need a
sample Podman image, you can obtain one
from RedHat.
When using this image, switch to the unprivileged podman
user before creating
containers to ensure that podman
runs in rootless mode.
See an opportunity to improve our docs? Make an edit.