将Kubernetes的容器运行时替换为CRI-O

首先

树莓派的“Home Kubernetes”项目,我打算考虑将容器运行时从cri-o换成crio。之前我们已经在文章中提到过,使用crio来新增节点是可行的。但是在删除和加入节点时,无法继承之前的运行时间。为了保留运行时间,我希望尝试将其切换到crio。

前提和前期准备

考虑到使用ceph,因此我们要从其他来源构建内核。但是,我认为使用发行版提供的内核也不会有太大的差别。

接下来,作为准备工作,我们将对其进行隔离再进行排水处理。(我们已经删除了指定节点的Pod。)

$ kubectl get nodes -o wide | grep chiya
chiya   Ready    worker                 449d   v1.22.0   10.0.0.5      <none>        Debian GNU/Linux 10 (buster)     5.10.52-v8+      docker://20.10.8
$ kubectl cordon chiya
$ kubectl drain chiya --ignore-daemonsets
$ kubectl get nodes | grep chiya
chiya   Ready,SchedulingDisabled   worker                 449d   v1.22.0

将docker更改为crio

我会登录到目标节点(chiya)并成为root。
接下来将在root权限下进行操作。

删除Docker

再见,Docker。

# systemctl stop docker.socket
# systemctl stop docker
# apt remove docker-ce docker-ce-cli
# apt autoremove

安装Crio和Podman。

这是某种官方步骤加上额外的α。

# OS=Debian_10
# VERSION=1.22:1.22.1
# curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/Release.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/libcontainers.gpg add -
# curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/libcontainers.gpg add -
# cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list
> deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /
> EOF
deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.22:1.22.1/Debian_10/ /
# cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
> deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /
> EOF
deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_10/ /
# perl -pi -e 's/22:/22:\//' /etc/apt/sources.list.d/devel\:kubic\:libcontainers\:stable\:cri-o\:1.22\:1.22.1.list
# echo 'deb http://deb.debian.org/debian buster-backports main' >> /etc/apt/sources.list
# apt update
# apt -t buster-backports install libseccomp2
# apt install cri-o cri-o-runc podman-rootless

Crio相关配置和启动

我們將進行操作系統和kubelet的設定。

# systemctl enable crio
# cat <<EOF > /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> net.ipv4.ip_forward = 1
> vm.max_map_count = 262144
> EOF
# echo "br_netfilter" >> /etc/modules
# echo "KUBELET_EXTRA_ARGS=--cgroup-driver=systemd" >> /etc/default/kubelet
# echo 'KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/var/run/crio/crio.sock"' > /var/lib/kubelet/kubeadm-flags.env

操作系统重新启动。

# reboot

一旦启动,我们可以使用kubectl命令行工具从可用的客户端进行uncordon操作。

$ kubectl uncordon chiya
$ kubectl get nodes -o wide | grep chiya
chiya   Ready    worker                 449d   v1.22.0   10.0.0.5      <none>        Debian GNU/Linux 10 (buster)     5.10.52-v8+      cri-o://1.22.1

一切没事,工作时间顺利切换到了crio!

补充(2022年8月15日)

在进行从kubeadm升级到1.24时,我确认需要将节点资源的annotations中的kubeadm.alpha.kubernetes.io/cri-socket更改为crio的路径。

$ kubectl get nodes/chino -o yaml
apiVersion: v1
kind: Node
metadata:
  annotations:
      :
    kubeadm.alpha.kubernetes.io/cri-socket: unix:///var/run/crio/crio.sock
      :

赠品

我不确定是否与环境有关,但是由于crio节点经常出现问题,我将把以前遇到的情况记录下来供参考。

重新启动操作系统后,可能会出现启动的 Pod 之间无法通信的情况。因此,最好是先删除节点上的 Pod。特别是删除 flannel 和 node-exporter 的 Pod,以便通过自我修复机制重新生成。RESTARTS 为 0 的话也更美观一些。

$ kubectl get pods -o wide -A | grep chiya
kube-system      kube-flannel-ds-cqv5m                        1/1     Running     0              9m25s   10.0.0.5       chiya   <none>           <none>
kube-system      kube-proxy-cbl45                             1/1     Running     0              8m34s   10.0.0.5       chiya   <none>           <none>
monitoring       node-exporter-qhdwf                          2/2     Running     0              9m1s    10.0.0.5       chiya   <none>           <none>

如果存在没有进行SSL化的本地注册表服务器,则可能需要在crio.conf中进行设置。

# cat /etc/crio/crio.conf
[crio.image]
registries = ['docker.io', 'quay.io', 'localhost:30500']
insecure_registries = ['localhost:30500']

据说在一些Pod中使用了Elasticsearch之类的容器,在crio节点中需要在securityContext中添加SYS_CHROOT来进行chroot操作。

securityContext:
  capabilities:
    add: ["SYS_CHROOT"]

可以在 Podman 中检查容器的镜像,但无法检查 ps。基本上请使用 crictl。
如果想要进行容器的构建,可以使用 Podman 进行 Docker 兼容操作。

# podman images
REPOSITORY                           TAG           IMAGE ID      CREATED        SIZE
quay.io/prometheus/node-exporter     latest        bb203ba967a8  25 hours ago   22 MB
k8s.gcr.io/kube-proxy                v1.22.0       fef37187b238  4 months ago   99.4 MB
quay.io/coreos/flannel               v0.14.0       85fc911ceba5  6 months ago   68.1 MB
k8s.gcr.io/pause                     3.5           f7ff3c404263  8 months ago   491 kB
docker.io/ccrisan/motioneye          master-armhf  611591554283  18 months ago  331 MB
docker.io/carlosedp/kube-rbac-proxy  v0.5.0        f5fb70afc410  20 months ago  44.8 MB
# crictl images
IMAGE                                 TAG                 IMAGE ID            SIZE
docker.io/carlosedp/kube-rbac-proxy   v0.5.0              f5fb70afc410c       44.8MB
docker.io/ccrisan/motioneye           master-armhf        6115915542836       331MB
k8s.gcr.io/kube-proxy                 v1.22.0             fef37187b2389       99.4MB
k8s.gcr.io/pause                      3.5                 f7ff3c4042631       491kB
quay.io/coreos/flannel                v0.14.0             85fc911ceba5a       68.1MB
quay.io/prometheus/node-exporter      latest              bb203ba967a80       22MB
# crictl ps  -a
CONTAINER ID        IMAGE                                                                                                      CREATED             STATE               NAME                ATTEMPT             POD ID
63458a82e4d7d       docker.io/ccrisan/motioneye@sha256:1d7abea3e92e8cc3de1072a0c102a9d91ef2aea2a285d7863b1a5dadd61a81e1        23 minutes ago      Running             motioneye           0                   2dc18fe53add2
4803f8ed3f145       fef37187b2389b314196fc3dfaabd8e9a4d2124cc497ac672743ecb7c27d51e1                                           38 minutes ago      Running             kube-proxy          0                   9b79e03fb2a97
0bd68f60ee8ba       f5fb70afc410c0dd73f2fa76e6f16b7e7c4b0d0d088d2be44ed7e90951b0da2b                                           39 minutes ago      Running             kube-rbac-proxy     0                   14ba959338c72
b582af7dfe542       quay.io/prometheus/node-exporter@sha256:c4376d28a346a403dd6227b8d9d61b866b77c76e42fe8d54ed68632eb8cced6b   39 minutes ago      Running             node-exporter       0                   14ba959338c72
560d0648a74c3       85fc911ceba5a5a5e43a7c613738b2d6c0a14dad541b1577cdc6f921c16f5b75                                           39 minutes ago      Running             kube-flannel        0                   be1b6c28aad4b
71901ef126d17       85fc911ceba5a5a5e43a7c613738b2d6c0a14dad541b1577cdc6f921c16f5b75                                           39 minutes ago      Exited              install-cni         0                   be1b6c28aad4b

我认为Crio节点与Docker相比会出现各种问题,因此偶尔监控日志和事件会更好。

广告
将在 10 秒后关闭
bannerAds