# Install Kata Containers with containerd

> **Note:**
>
> - If Kata Containers and / or containerd are packaged by your distribution,
>   we recommend you install these versions to ensure they are updated when
>   new releases are available.

> **Warning:**
>
> - These instructions install the **newest** versions of Kata Containers and
>   containerd from binary release packages. These versions may not have been
>   tested with your distribution version.
>
> - Since your package manager is not being used, it is **your**
>   responsibility to ensure these packages are kept up-to-date when new
>   versions are released.
>
> - If you decide to proceed and install a Kata Containers release, you can
>   still check for the latest version of Kata Containers by running
>   `kata-runtime check --only-list-releases`.

## Install Kata Containers

> **Note:**
>
> If your distribution packages Kata Containers, we recommend you install that
> version. If it does not, or you wish to perform a manual installation,
> continue with the steps below.

- Download a release from:

  - https://github.com/kata-containers/kata-containers/releases

  Note that Kata Containers uses [semantic versioning](https://semver.org) so
  you should install a version that does *not* include a dash ("-"), since this
  indicates a pre-release version.

- Unpack the downloaded archive.

   Kata Containers packages use a `/opt/kata/` prefix so either add that to
   your `PATH`, or create symbolic links for the following commands. The
   advantage of using symbolic links is that the `systemd(1)` configuration file
   for containerd will not need to be modified to allow the daemon to find this
   binary (see the [section on installing containerd](#install-containerd) below).

   | Command | Description |
   |-|-|
   | `/opt/kata/bin/containerd-shim-kata-v2` | The main Kata 2.x binary |
   | `/opt/kata/bin/kata-collect-data.sh`    | Data collection script used for [raising issues](https://github.com/kata-containers/kata-containers/issues) |
   | `/opt/kata/bin/kata-runtime`            | Utility command |

- Check installation by showing version details:

   ```bash
   $ kata-runtime --version
   ```

## Install containerd

> **Note:**
>
> If your distribution packages containerd, we recommend you install that
> version. If it does not, or you wish to perform a manual installation,
> continue with the steps below.

- Download a release from:

  - https://github.com/containerd/containerd/releases

- Unpack the downloaded archive.

- Configure containerd

  - Download the standard `systemd(1)` service file and install to
    `/etc/systemd/system/`:

    - https://raw.githubusercontent.com/containerd/containerd/main/containerd.service

    > **Notes:**
    >
    > - You will need to reload the systemd configuration after installing this
    >   file.
    >
    > - If you have not created a symbolic link for
    >   `/opt/kata/bin/containerd-shim-kata-v2`, you will need to modify this
    >   file to ensure the containerd daemon's `PATH` contains `/opt/kata/`.
    >   See the `Environment=` command in `systemd.exec(5)` for further
    >   details.

  - Add the Kata Containers configuration to the containerd configuration file:

    ```toml
    [plugins]
      [plugins."io.containerd.grpc.v1.cri"]
        [plugins."io.containerd.grpc.v1.cri".containerd]
          default_runtime_name = "kata"
          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
            [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata]
              runtime_type = "io.containerd.kata.v2"
    ```

    > **Note:**
    >
    > The containerd daemon needs to be able to find the
    > `containerd-shim-kata-v2` binary to allow Kata Containers to be created.

  - Start the containerd service.

## Test the installation

You are now ready to run Kata Containers. You can perform a simple test by
running the following commands:

```bash
$ image="docker.io/library/busybox:latest"
$ sudo ctr image pull "$image"
$ sudo ctr run --runtime "io.containerd.kata.v2" --rm -t "$image" test-kata uname -r
```

The last command above shows details of the kernel version running inside the
container, which will likely be different to the host kernel version.
