diff --git a/roles/container-engine/cri-o/defaults/main.yml b/roles/container-engine/cri-o/defaults/main.yml
index 3fadc9719bc7ecb9a0613d59798d699a9b94342a..25711588cfbf94fef7002dbe1a0dc4db18a3415d 100644
--- a/roles/container-engine/cri-o/defaults/main.yml
+++ b/roles/container-engine/cri-o/defaults/main.yml
@@ -54,6 +54,13 @@ kata_runtimes:
     type: oci
     root: /run/kata-containers
 
+# crun is a fast and low-memory footprint OCI Container Runtime fully written in C.
+crun_runtime:
+  name: crun
+  path: /usr/bin/crun
+  type: oci
+  root: /run/crun
+
 # When this is true, CRI-O package repositories are added. Set this to false when using an
 # environment with preconfigured CRI-O package repositories.
 crio_add_repos: true
diff --git a/roles/container-engine/cri-o/tasks/main.yaml b/roles/container-engine/cri-o/tasks/main.yaml
index 0a9ebc93cf4667aaa38523e1d531125bffb2b649..2707a34326b95ce4ba8c09f54cda28f12a1fa03b 100644
--- a/roles/container-engine/cri-o/tasks/main.yaml
+++ b/roles/container-engine/cri-o/tasks/main.yaml
@@ -45,12 +45,18 @@
 
 - import_tasks: "crictl.yml"
 
-- name: Build a list of crio runtimes
+- name: Build a list of crio runtimes with Katacontainers runtimes
   set_fact:
     crio_runtimes: "{{ crio_runtimes + kata_runtimes  }}"
   when:
     - kata_containers_enabled
 
+- name: Build a list of crio runtimes with crun runtime
+  set_fact:
+    crio_runtimes: "{{ crio_runtimes + [crun_runtime] }}"
+  when:
+    - crun_enabled
+
 - name: Make sure needed folders exist in the system
   with_items:
     - /etc/crio
diff --git a/roles/container-engine/crun/defaults/main.yml b/roles/container-engine/crun/defaults/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..54d429221c97e51c4ab3d9f7ae2a75856f5913e2
--- /dev/null
+++ b/roles/container-engine/crun/defaults/main.yml
@@ -0,0 +1,5 @@
+---
+
+crun_version: 0.15
+crun_release_url: https://github.com/containers/crun/releases/download/{{ crun_version }}/crun-{{ crun_version }}-linux-{{ host_architecture }}
+crun_bin_dir: /usr/bin/
diff --git a/roles/container-engine/crun/tasks/main.yml b/roles/container-engine/crun/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..97a983c3511ddf530095d26d0611be34d861fcb5
--- /dev/null
+++ b/roles/container-engine/crun/tasks/main.yml
@@ -0,0 +1,19 @@
+---
+
+- name: Create binary destination folder
+  file:
+    mode: '0755'
+    state: directory
+    path: "{{ crun_bin_dir }}"
+
+- name: Check if binary exists
+  stat:
+    path: "{{ crun_bin_dir }}/crun"
+  register: crun_stat
+
+- name: Download binary
+  get_url:
+    url: "{{ crun_release_url }}"
+    dest: "{{ crun_bin_dir }}/crun"
+    mode: '0755'
+  when: not crun_stat.stat.exists
diff --git a/roles/container-engine/meta/main.yml b/roles/container-engine/meta/main.yml
index c85eb441efc9ae1001e59396527e64915cb6d06a..6218db932f4a0dfae4cd8471f73f7eb7638f6bbe 100644
--- a/roles/container-engine/meta/main.yml
+++ b/roles/container-engine/meta/main.yml
@@ -7,6 +7,13 @@ dependencies:
       - container-engine
       - kata-containers
 
+  - role: container-engine/crun
+    when:
+      - crun_enabled
+    tags:
+      - container-engine
+      - crun
+
   - role: container-engine/cri-o
     when:
       - container_manager == 'crio'
diff --git a/roles/kubernetes-apps/container_runtimes/crun/files/runtimeclass-crun.yml b/roles/kubernetes-apps/container_runtimes/crun/files/runtimeclass-crun.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1e23a4aa9fc4a095ea4c5933c743404e2c0e5f2d
--- /dev/null
+++ b/roles/kubernetes-apps/container_runtimes/crun/files/runtimeclass-crun.yml
@@ -0,0 +1,6 @@
+---
+kind: RuntimeClass
+apiVersion: node.k8s.io/v1beta1
+metadata:
+  name: crun
+handler: crun
diff --git a/roles/kubernetes-apps/container_runtimes/crun/tasks/main.yaml b/roles/kubernetes-apps/container_runtimes/crun/tasks/main.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..1d790267b70a8cd3307aec07ae0478b4de5b3e0d
--- /dev/null
+++ b/roles/kubernetes-apps/container_runtimes/crun/tasks/main.yaml
@@ -0,0 +1,19 @@
+---
+
+- name: crun | Copy runtime class manifest
+  copy:
+    src: runtimeclass-crun.yml
+    dest: "{{ kube_config_dir }}/runtimeclass-crun.yml"
+    mode: preserve
+  when:
+    - inventory_hostname == groups['kube-master'][0]
+
+- name: crun | Apply manifests
+  kube:
+    name: "runtimeclass-crun"
+    kubectl: "{{ bin_dir }}/kubectl"
+    resource: "runtimeclass"
+    filename: "{{ kube_config_dir }}/runtimeclass-crun.yml"
+    state: "latest"
+  when:
+    - inventory_hostname == groups['kube-master'][0]
diff --git a/roles/kubernetes-apps/container_runtimes/meta/main.yml b/roles/kubernetes-apps/container_runtimes/meta/main.yml
index e964f2be4f10a1d232836e6ba8ab842af8dc86db..3c56e992e7d44b7c768afd34f68ddf964f03f2b1 100644
--- a/roles/kubernetes-apps/container_runtimes/meta/main.yml
+++ b/roles/kubernetes-apps/container_runtimes/meta/main.yml
@@ -6,3 +6,10 @@ dependencies:
       - apps
       - kata-containers
       - container-runtimes
+
+  - role: kubernetes-apps/container_runtimes/crun
+    when: crun_enabled
+    tags:
+      - apps
+      - crun
+      - container-runtimes
diff --git a/roles/kubespray-defaults/defaults/main.yaml b/roles/kubespray-defaults/defaults/main.yaml
index 72b9fb616c18fed341095e9e5a9c6a0750cf44a7..aa6cf675e22999ebebef2c4661c558bb1bf554fe 100644
--- a/roles/kubespray-defaults/defaults/main.yaml
+++ b/roles/kubespray-defaults/defaults/main.yaml
@@ -224,6 +224,10 @@ container_manager: docker
 # When enabled, it requires `container_manager` different than Docker
 kata_containers_enabled: false
 
+# Enable crun as additional container runtime
+# When enabled, it requires container_manager=crio
+crun_enabled: false
+
 # Container on localhost (download images when download_localhost is true)
 container_manager_on_localhost: "{{ container_manager }}"