使用CRI设置不同的container runtime

containerd

Docker 18.09 及更高版本自带 containerd ,因此您无需手动安装。如果您没有 containerd ,可以通过运行以下命令进行安装:

  1. # Install containerd
  2. apt-get update && apt-get install -y containerd.io
  3. # Configure containerd
  4. mkdir -p /etc/containerd
  5. containerd config default > /etc/containerd/config.toml
  6. # Restart containerd
  7. systemctl restart containerd

使用Docker自带的 containerd 时,默认情况下cri插件是不可使用的。 您需要更新 containerd 的配置,来使 KubeEdge 能够 containerd 作为它的runtime:

  1. # Configure containerd
  2. mkdir -p /etc/containerd
  3. containerd config default > /etc/containerd/config.toml

更新 edgecore 配置文件 edgecore.yaml,为被作为 runtime 的 containerd 指定以下参数:

  1. remoteRuntimeEndpoint: unix:///var/run/containerd/containerd.sock
  2. remoteImageEndpoint: unix:///var/run/containerd/containerd.sock
  3. runtimeRequestTimeout: 2
  4. podSandboxImage: k8s.gcr.io/pause:3.2
  5. runtimeType: remote

默认情况下,cri的cgroup驱动程序配置为cgroupfs。如果不是这种情况,您可以在中 edgecore.yaml 手动切换成 systemd

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

设置containerd的配置文件(/etc/containerd/config.toml)中的 systemd_cgrouptrue ,然后重新启动containerd

  1. # /etc/containerd/config.toml
  2. systemd_cgroup = true
  1. # Restart containerd
  2. systemctl restart containerd

创建nginx应用程序,检查该服务容器含有 containerd 并位于边缘端:

  1. kubectl apply -f $GOPATH/src/github.com/kubeedge/kubeedge/build/deployment.yaml
  2. deployment.apps/nginx-deployment created
  3. ctr --namespace=k8s.io container ls
  4. CONTAINER IMAGE RUNTIME
  5. 41c1a07fe7bf7425094a9b3be285c312127961c158f30fc308fd6a3b7376eab2 docker.io/library/nginx:1.15.12 io.containerd.runtime.v1.linux

注意:cri 不支持 multi-tenancy 但是 containerd 支持,因此默认情况下,容器的命名空间需要设置为“ k8s.io”。在cri支持 实现之前,没有办法改变这一点。

CRI-O

请遵循 CRI-O安装指南 来设置CRI-O。

如果您的边缘节点需要在ARM平台上运行,而发行版是ubuntu18.04,那么您可能需要构建二进制形式的源文件然后进行安装,因为 Kubic 存储库中没有针对此组合的CRI-O软件包。

  1. git clone https://github.com/cri-o/cri-o
  2. cd cri-o
  3. make
  4. sudo make install
  5. # generate and install configuration files
  6. sudo make install.config

遵循以下指导来配置CNI网络:设置CNI。 更新 edgecore 配置文件,为CRI-O-based runtime 指定以下参数:

  1. remoteRuntimeEndpoint: unix:///var/run/crio/crio.sock
  2. remoteImageEndpoint: unix:////var/run/crio/crio.sock
  3. runtimeRequestTimeout: 2
  4. podSandboxImage: k8s.gcr.io/pause:3.2
  5. runtimeType: remote

默认情况下 CRI-O 使用 cgroupfs 作为一个 cgroup 的程序管理器。如果您想替换成 systemd ,请更新CRI-O配置文件(/etc/crio/crio.conf.d/00-default.conf):

  1. # Cgroup management implementation used for the runtime.
  2. cgroup_manager = "systemd"

注意:如果您在ARM平台上使用 pause 镜像,并且 pause 镜像不是 multi-arch 镜像,您应该更新 pause 镜像。要配置 pause 镜像,更新 CRI-O 配置文件:

  1. pause_image = "k8s.gcr.io/pause-arm64:3.1"

同时更新 edgecore.yaml 里面的 cgroup driver manager:

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

启动 CRI-Oedgecore 服务(假设两项服务均由 systemd 负责),

  1. sudo systemctl daemon-reload
  2. sudo systemctl enable crio
  3. sudo systemctl start crio
  4. sudo systemctl start edgecore

创建应用程序,并检查 CRI-O 容器是在边缘端创建:

  1. kubectl apply -f $GOPATH/src/github.com/kubeedge/kubeedge/build/deployment.yaml
  2. deployment.apps/nginx-deployment created
  3. # crictl ps
  4. CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT POD ID
  5. 41c1a07fe7bf7 f6d22dec9931b 2 days ago Running nginx 0 51f727498b06f

Kata Containers

Kata Containers 是一个 container runtime,旨在解决多租户、不受信任的云环境中的安全挑战。但是,多租户支持仍在KubeEdge的backlog中。如果您的下游定制KubeEdge已经支持多租户,那么Kata Containers是轻量级且安全的 container runtime 的理想选择。

按照 安装指南 安装和配置容器和 Kata Containers。

如果安装了“ kata-runtime”,请运行以下命令以检查主机系统是否可以运行并创建Kata容器:

  1. kata-runtime kata-check

RuntimeClass 是一项功能,用于选择自 containerdv1.2.0 以来受支持的container runtime配置,以用于运行 Pod 的容器。如果您的 containerd 版本高于v1.2.0,则有两种选择来配置 containerd 以使用Kata容器:

  • Kata Containers 作为 RuntimeClass
  • Kata Containers 作为不受信任的工作负载的 runtime

假设您已将 Kata Containers 配置为不受信任的工作负载的 runtime 。为了验证它是否可以在边缘节点上运行,可以运行:

  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

确保没有libvirt在工作程序节点上运行。

步骤

  1. 安装 CNI 插件:

    下载 CNI 插件安装包并解压它:

    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/

    配置 CNI 插件:

    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. 设置 VM runtime: 使用 hack/setup-vmruntime.sh脚本来设置VM runtime。它利用 Arktos Runtime 安装包来启动三个容器:

    1. vmruntime_vms
    2. vmruntime_libvirt
    3. vmruntime_virtlet

最近更新于 Apr 1, 2021