容器运行时

你需要在每个边缘节点上安装一个容器运行时,以使边缘引擎EdgeCore能够成功安装,并且边缘Pod可以运行在边缘节点上。

本页简要介绍在KubeEdge中常见的几种容器运行时的安装与配置过程。

containerd

安装与配置containerd

首先你需要安装containerd,请参考containerd安装指南进行操作。

容器运行时 - 图1提示

如果你使用KubeEdge v1.15.0以及以上版本,请安装v1.6.0或更高版本的containerd。

如果在/etc/containerd/目录下没有containerd的配置文件,你可以执行如下命令生成配置文件并重启containerd。

  1. containerd config default > /etc/containerd/config.toml
  2. systemctl restart containerd

容器运行时 - 图2提示

如果你从软件包(例如RPM或者.deb)中安装 containerd,你可能会发现其中默认禁止了 CRI 集成插件。

你需要启用 CRI 支持在KubeEdge场景下使用 containerd。 要确保 cri 没有出现在 /etc/containerd/config.toml 文件中 disabled_plugins 列表内。如果你更改了这个文件,也请记得要重启 containerd。

如果你需要更新沙箱(pause)镜像,你也可以通过在containerd的配置文件中修改如下设置来实现:

  1. [plugins."io.containerd.grpc.v1.cri"]
  2. sandbox_image = "kubeedge/pause:3.6"

你还可以通过containerd的配置文件查看或更新containerd的cgroup驱动

  1. [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  2. ...
  3. [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  4. SystemdCgroup = true

容器运行时 - 图3提示

如果你修改了配置文件,请确保重新启动 containerd。

使用Keadm安装EdgeCore的运行时配置

如果你使用Keadm安装EdgeCore时,你需要设置—remote-runtime-endpoint=unix:///run/containerd/containerd.sock。

容器运行时 - 图4提示

如果你使用的是KubeEdge v1.12或之前的版本,你还需要在执行keadm join时设置—runtimetype=remote

在Windows上,请使用—remote-runtime-endpoint=npipe://./pipe/containerd-containerd来配置CRI端点

KubeEdge默认使用cgroupfs cgroup驱动,如果你需要使用systemd cgroup驱动,你需要保证containerd配置了systemd cgroup,在执行keadm join时设置—cgroupdriver=systemd。

使用二进制安装EdgeCore的运行时配置

如果使用二进制方式安装EdgeCore,你需要更新EdgeCore的配置文件edgecore.yaml,修改如下参数:

KubeEdge v1.15以及之前的版本:

  1. modules:
  2. edged:
  3. containerRuntime: remote
  4. remoteImageEndpoint: unix:///run/containerd/containerd.sock
  5. remoteRuntimeEndpoint: unix:///run/containerd/containerd.sock

KubeEdge默认使用cgroupfs cgroup驱动,如果你需要使用systemd cgroup驱动,你需要保证containerd配置了systemd cgroup,并且修改edgecore.yaml的如下参数”:

  1. modules:
  2. edged:
  3. tailoredKubeletConfig:
  4. cgroupDriver: systemd

CRI-O

安装与配置CRI-O

请先按照CRI-O安装指南安装CRI-O。

如果你需要更新沙箱(pause)镜像,你也可以通过在CRI-O的配置文件(通常是/etc/crio/crio.conf)中修改如下设置来实现:

  1. [crio.image]
  2. pause_image="kubeedge/pause:3.6"

CRI-O默认使用systemd cgroup驱动,如果需要切换到cgroupfs cgroup驱动,可通过编辑CRI-O的配置文件实现。

  1. [crio.runtime]
  2. conmon_cgroup = "pod"
  3. cgroup_manager = "cgroupfs"

容器运行时 - 图5提示

当使用 CRI-O时,并且CRI-O的cgroup设置为cgroupfs时,必须将conmon_cgroup设置为值 pod。

使用Keadm安装EdgeCore的运行时配置

如果你使用Keadm安装EdgeCore时,你需要设置—remote-runtime-endpoint=unix:///var/run/crio/crio.sock。

容器运行时 - 图6提示

如果你使用的是KubeEdge v1.12或之前的版本,你还需要在执行keadm join时设置—runtimetype=remote

KubeEdge默认使用cgroupfs cgroup驱动,如果你使用systemd cgroup驱动,你需要保证CRI-O配置了systemd cgroup,在执行keadm join时设置—cgroupdriver=systemd。

使用二进制安装EdgeCore的运行时配置

如果使用二进制方式安装EdgeCore,你需要更新EdgeCore的配置文件edgecore.yaml,修改如下参数:

KubeEdge v1.15以及之前的版本:

  1. modules:
  2. edged:
  3. containerRuntime: remote
  4. remoteImageEndpoint: unix:///var/run/crio/crio.sock
  5. remoteRuntimeEndpoint: unix:///var/run/crio/crio.sock

KubeEdge默认使用cgroupfs cgroup驱动,如果你使用systemd cgroup驱动,你需要保证CRI-O配置了systemd cgroup,并且修改edgecore.yaml的如下参数”

  1. modules:
  2. edged:
  3. tailoredKubeletConfig:
  4. cgroupDriver: systemd

Docker Engine

容器运行时 - 图7提示

自KubeEdge v1.14版本起,KubeEdge移除了对dockershim的支持,不再支持直接使用docker运行时管理边缘容器。阅读Dockershim移除的常见问题了解更多详情。

安装与配置Docker和cri-dockerd

以下安装步骤只针对KubeEdge v1.14以及之后的版本,如果你使用的是更早的版本,你只需要安装docker,执行keadm join时配置—runtimetype=docker以及—remote-runtime-endpoint=unix:///var/run/dockershim.sock即可。

  1. 遵循Docker Engine安装指南安装Docker。

  2. 按照cri-dockerd安装指南安装cri-dockerd。

  3. 安装CNI Plugin。

你可以参考kubeedge脚本中的install_cni_plugins函数安装CNI Plugin,仅供参考。

使用Keadm安装EdgeCore的运行时配置

如果你使用Keadm安装EdgeCore时,你需要设置—remote-runtime-endpoint=unix:///var/run/cri-dockerd.sock。

容器运行时 - 图8提示

当使用cri-dockerd时,对应的runtimetype也是remote,而不是docker。

KubeEdge默认使用cgroupfs cgroup驱动,如果你使用systemd cgroup驱动,你需要保证docker配置了systemd cgroup,在执行keadm join时设置—cgroupdriver=systemd。

使用二进制安装EdgeCore的运行时配置

如果使用二进制方式安装EdgeCore,你需要更新EdgeCore的配置文件edgecore.yaml,修改如下参数:

KubeEdge v1.15以及之前的版本:

  1. modules:
  2. edged:
  3. containerRuntime: remote
  4. remoteImageEndpoint: unix:///var/run/cri-dockerd.sock
  5. remoteRuntimeEndpoint: unix:///var/run/cri-dockerd.sock

KubeEdge默认使用cgroupfs cgroup驱动,如果你使用systemd cgroup驱动,你需要保证docker配置了systemd cgroup,并且修改edgecore.yaml的如下参数”

  1. modules:
  2. edged:
  3. tailoredKubeletConfig:
  4. cgroupDriver: systemd

Kata Containers

Kata Containers is a container runtime created to address security challenges in the multi-tenant, untrusted cloud environment. However, multi-tenancy support is still in KubeEdge’s backlog. If you have a downstream customized KubeEdge which supports multi-tenancy already then Kata Containers is a good option for a lightweight and secure container runtime.

Follow the install guide to install and configure containerd and Kata Containers.

If you have “kata-runtime” installed, run this command to check if your host system can run and create a Kata Container:

  1. kata-runtime kata-check

RuntimeClass is a feature for selecting the container runtime configuration to use to run a pod’s containers that is supported since containerd v1.2.0. If your containerd version is later than v1.2.0, you have two choices to configure containerd to use Kata Containers:

  • Kata Containers as a RuntimeClass
  • Kata Containers as a runtime for untrusted workloads

Suppose you have configured Kata Containers as the runtime for untrusted workloads. In order to verify whether it works on your edge node, you can run:

  1. cat nginx-untrusted.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: nginx-untrusted
  6. annotations:
  7. io.kubernetes.cri.untrusted-workload: "true"
  8. spec:
  9. containers:
  10. - name: nginx
  11. image: nginx
  1. kubectl create -f nginx-untrusted.yaml
  2. # verify the container is running with qemu hypervisor on edge side,
  3. ps aux | grep qemu
  4. root 3941 3.0 1.0 2971576 174648 ? Sl 17:38 0:02 /usr/bin/qemu-system-aarch64
  5. crictl pods
  6. POD ID CREATED STATE NAME NAMESPACE ATTEMPT
  7. b1c0911644cb9 About a minute ago Ready nginx-untrusted default 0

Virtlet

Make sure no libvirt is running on the worker nodes.

Steps

  1. Install CNI plugin:

    Download CNI plugin release and extract it:

    1. $ wget https://github.com/containernetworking/plugins/releases/download/v0.8.2/cni-plugins-linux-amd64-v0.8.2.tgz
    2. # Extract the tarball
    3. $ mkdir cni
    4. $ tar -zxvf v0.2.0.tar.gz -C cni
    5. $ mkdir -p /opt/cni/bin
    6. $ cp ./cni/* /opt/cni/bin/

    Configure CNI plugin:

    1. $ mkdir -p /etc/cni/net.d/
    2. $ cat >/etc/cni/net.d/bridge.conf <<EOF
    3. {
    4. "cniVersion": "0.3.1",
    5. "name": "containerd-net",
    6. "type": "bridge",
    7. "bridge": "cni0",
    8. "isGateway": true,
    9. "ipMasq": true,
    10. "ipam": {
    11. "type": "host-local",
    12. "subnet": "10.88.0.0/16",
    13. "routes": [
    14. { "dst": "0.0.0.0/0" }
    15. ]
    16. }
    17. }
    18. EOF
  2. Setup VM runtime: Use the script hack/setup-vmruntime.sh to set up a VM runtime. It makes use of the Arktos Runtime release to start three containers:

    vmruntime_vms vmruntime_libvirt vmruntime_virtlet