千家信息网

kubernetes 使用cri-o 替换docker

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,部署环境# 操作系统:CentOS Linux release 8.0.1905 (Core)# kubelet 版本: v1.14.0# runc版本:v1.0.0-rc9# crictl 版本:v
千家信息网最后更新 2026年11月03日kubernetes 使用cri-o 替换docker

部署环境

# 操作系统:CentOS Linux release 8.0.1905 (Core)# kubelet 版本: v1.14.0# runc版本:v1.0.0-rc9# crictl 版本:v1.16.1#crio版本:v1.15.2#conmon版本:v2.0.1# cni版本:v0.8.2# 网络插件: kube-router#工作目录: /apps# 二进制文件目录: /usr/bin# cni 目录:/apps/cni# 工作节点:win10 on Ubuntu 19.10# 工作目录:/mnt/g/work/crio# 节点IP:192.168.2.196# 节点名:node05

准备所需二进制文件

mkdir -p /mnt/g/work/criocd /mnt/g/work/criowget https://github.com/opencontainers/runc/releases/download/v1.0.0-rc9/runc.amd64wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.16.1/crictl-v1.16.1-linux-amd64.tar.gzwget https://github.com/cri-o/cri-o/releases/download/v1.15.2/crio-v1.15.2.tar.gzwget https://github.com/containernetworking/plugins/releases/download/v0.8.2/cni-plugins-linux-amd64-v0.8.2.tgzwget https://github.com/containers/conmon/archive/v2.0.1.zip

解压下载文件及编译源码

# conmon 官方不提供二进制下载所以要编译# 工作节点编译然后分发sudo apt-get install \  gcc \  git \  libc6-dev \  libglib2.0-dev \  pkg-config \  make \  unzip \  runc# 编译conmon# 解压conmon unzip  v2.0.1.zipcd conmon-2.0.1make# 二进制文件目录 ./bin/conmoncp -pdr ./bin/conmon ../rm -rf conmon-2.0.1  v2.0.1.zip # 解压cnimkdir ./cni/bincd ./cni/binmv ../../cni-plugins-linux-amd64-v0.8.2.tgz ./tar -xvf cni-plugins-linux-amd64-v0.8.2.tgzrm -rf cni-plugins-linux-amd64-v0.8.2.tgz# 回到最上级目录cd  ../../# 解压crictltar -xvf crictl-v1.16.1-linux-amd64.tar.gz rm -f crictl-v1.16.1-linux-amd64.tar.gz # 解压crio tar -xvf crio-v1.15.2.tar.gz cd crio-v1.15.2/bin/ mv crio-x86_64-static-glibc ../../crio rm -rf  crio-v1.15.2  crio-v1.15.2.tar.gz # 重命名runc.amd64 mv runc.amd64 runc chmod +x  runc

创建配置文件

cd /mnt/g/work/crio# 配置cni 测试配置文件 接入kubernetes  集群需要删除此cni 配置文件 mkdir -p ./etc/cni/net.d cat > ./etc/cni/net.d/87-bridge.conflist < ./etc/containers/policy.json < ./etc/containers/registries.conf < ./etc/crio/crio.conf# 修改生成配置vim  ./etc/crio/crio.conf# 取消注释修改存储目录root = "/apps/lib/containers/storage"# 取消注释修改容器运行存储目录runroot = "/apps/run/containers/storage"# 取消注释修改容器运行时文件打开数default_ulimits = [          "nofile=1024000:1024000",          "nproc=1024000:1024000",          "core=-1:-1",]#修改conmon 路径 默认conmon = "/usr/local/libexec/crio/conmon"conmon = "/usr/bin/conmon"# 修改pids_limit 默认1024pids_limit = 102400# pause_image 默认pause_image = "k8s.gcr.io/pause:3.1" 由于网络不通所有要修改pause_image = "docker.io/juestnow/pause-amd64:3.1"#修改cni 二进制路径plugin_dirs = [        "/apps/cni/bin/",# 创建crictl 配置cat >./etc/crictl.yaml <./crio.service <

分发文件

scp -r crio crictl 192.168.2.196:/usr/local/bin/scp conmon runc 192.168.2.196:/usr/bin/# 分发cniscp -r cni 192.168.2.196:/apps/# 分发配置文件scp -r etc 192.168.2.196:/# 分发启动文件scp  crio.service 192.168.2.196:/usr/lib/systemd/system/crio.service

启动crio 安装对应依赖

dnf -y install  epel-releasednf install   dnf-utils ipvsadm telnet wget net-tools conntrack ipset jq iptables curl sysstat libseccomp socat nfs-utils fuse fuse-devel  device-mapper# 启动 criosystemctl daemon-reloadsystemctl enable criosystemctl start crio[root@node05 ~]# systemctl status crio● crio.service - OCI-based implementation of Kubernetes Container Runtime Interface   Loaded: loaded (/usr/lib/systemd/system/crio.service; enabled; vendor preset: disabled)   Active: active (running) since Mon 2019-10-28 10:22:14 CST; 10h ago     Docs: https://github.com/github.com/cri-o/cri-o  Process: 714 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)  Process: 659 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS) Main PID: 726 (crio)    Tasks: 17 (limit: 49836)   Memory: 89.3M   CGroup: /system.slice/crio.service           └─726 /usr/local/bin/crio --log-level info# 创建测试应用cat > sandbox_config.json <

配置 kubelet以支持cri-o

vim /apps/kubernetes/conf/kubelet----------------------------------------------------------------------------------------------------------------------KUBELET_OPTS="--bootstrap-kubeconfig=/apps/kubernetes/conf/bootstrap.kubeconfig \              --fail-swap-on=false \              --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/apps/cni/bin \              --kubeconfig=/apps/kubernetes/conf/kubelet.kubeconfig \              --address=192.168.2.196 \              --node-ip=192.168.2.196 \              --hostname-override=node05 \              --cluster-dns=10.64.0.2 \              --cluster-domain=cluster.local \              --authorization-mode=Webhook \              --authentication-token-webhook=true \              --client-ca-file=/apps/kubernetes/ssl/k8s/k8s-ca.pem \              --rotate-certificates=true \              --cgroup-driver=cgroupfs \              --allow-privileged=true \              --healthz-port=10248 \              --healthz-bind-address=192.168.2.196 \              --cert-dir=/apps/kubernetes/ssl \              --feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true \              --node-labels=node-role.kubernetes.io/k8s-node=true \              --serialize-image-pulls=false \              --enforce-node-allocatable=pods,kube-reserved,system-reserved \              --pod-manifest-path=/apps/work/kubernetes/manifests \              --runtime-cgroups=/systemd/system.slice/kubelet.service \              --kube-reserved-cgroup=/systemd/system.slice/kubelet.service \              --system-reserved-cgroup=/systemd/system.slice \              --root-dir=/apps/work/kubernetes/kubelet \              --log-dir=/apps/kubernetes/log \              --alsologtostderr=true \              --logtostderr=false \              --anonymous-auth=true \              --container-log-max-files=10 \              --container-log-max-size=100Mi \              --container-runtime=remote \              --container-runtime-endpoint=unix:///var/run/crio/crio.sock \              --containerd=unix:///var/run/crio/crio.sock \              --runtime-request-timeout=15m \              --image-gc-high-threshold=70 \              --image-gc-low-threshold=50 \              --kube-reserved=cpu=500m,memory=512Mi,ephemeral-storage=1Gi \              --system-reserved=cpu=1000m,memory=1024Mi,ephemeral-storage=1Gi \              --eviction-hard=memory.available<500Mi,nodefs.available<10% \              --serialize-image-pulls=false \              --sync-frequency=30s \              --resolv-conf=/etc/resolv.conf \              --pod-infra-container-image=docker.io/juestnow/pause-amd64:3.1 \              --image-pull-progress-deadline=30s \              --v=2 \              --event-burst=30 \              --event-qps=15 \              --kube-api-burst=30 \              --kube-api-qps=15 \              --max-pods=100 \              --pods-per-core=10 \              --read-only-port=0 \              --volume-plugin-dir=/apps/kubernetes/kubelet-plugins/volume"---------------------------------------------------------------------------------------------------------------------------------------------# 修改启动文件kubelet.servicevim /usr/lib/systemd/system/kubelet.service--------------------------------------------------------------------------------------------------------------------------------------------[Unit]Description=Kubernetes KubeletAfter=crio.serviceRequires=crio.service[Service]ExecStartPre=-/bin/mkdir -p /sys/fs/cgroup/hugetlb/systemd/system.slice/kubelet.serviceExecStartPre=-/bin/mkdir -p /sys/fs/cgroup/blkio/systemd/system.slice/kubelet.serviceExecStartPre=-/bin/mkdir -p /sys/fs/cgroup/cpuset/systemd/system.slice/kubelet.serviceExecStartPre=-/bin/mkdir -p /sys/fs/cgroup/devices/systemd/system.slice/kubelet.serviceExecStartPre=-/bin/mkdir -p /sys/fs/cgroup/net_cls,net_prio/systemd/system.slice/kubelet.serviceExecStartPre=-/bin/mkdir -p /sys/fs/cgroup/perf_event/systemd/system.slice/kubelet.serviceExecStartPre=-/bin/mkdir -p /sys/fs/cgroup/cpu,cpuacct/systemd/system.slice/kubelet.serviceExecStartPre=-/bin/mkdir -p /sys/fs/cgroup/freezer/systemd/system.slice/kubelet.serviceExecStartPre=-/bin/mkdir -p /sys/fs/cgroup/memory/systemd/system.slice/kubelet.serviceExecStartPre=-/bin/mkdir -p /sys/fs/cgroup/pids/systemd/system.slice/kubelet.serviceExecStartPre=-/bin/mkdir -p /sys/fs/cgroup/systemd/systemd/system.slice/kubelet.serviceEnvironmentFile=-/apps/kubernetes/conf/kubeletExecStart=/apps/kubernetes/bin/kubelet $KUBELET_OPTSRestart=on-failureKillMode=processLimitNOFILE=1024000LimitNPROC=1024000LimitCORE=infinityLimitMEMLOCK=infinity[Install]WantedBy=multi-user.target# 说明在使用docker 时可以不需要创建kubelet.service 目录# 使用crio 必须手动创建目录# 配置生效systemctl daemon-reload# 启动 crio.service systemctl start crio.service# 启动 kubelet systemctl restart kubelet.service# 创建cni 配置文件10-kuberouter.conflistcat > /etc/cni/net.d/10-kuberouter.conflist <        CentOS Linux 7 (Core)   3.10.0-1062.1.2.el7.x86_64    docker://19.3.3nginx-2   Ready    k8s-node     47d     v1.14.0   192.168.2.189           CentOS Linux 7 (Core)   5.1.0-1.el7.elrepo.x86_64     docker://18.9.6node01    Ready    k8s-master   194d    v1.14.0   192.168.2.253           CentOS Linux 7 (Core)   5.0.7-1.el7.elrepo.x86_64     docker://18.9.4node02    Ready    k8s-master   194d    v1.14.0   192.168.3.4             CentOS Linux 7 (Core)   5.0.7-1.el7.elrepo.x86_64     docker://18.9.4node03    Ready    k8s-node     47d     v1.14.0   192.168.2.165           CentOS Linux 7 (Core)   5.1.0-1.el7.elrepo.x86_64     docker://18.9.6node04    Ready    k8s-node     47d     v1.14.0   192.168.2.167           CentOS Linux 7 (Core)   5.1.14-1.el7.elrepo.x86_64    docker://18.9.6node05    Ready    k8s-node     5h34m   v1.14.0   192.168.2.196           CentOS Linux 8 (Core)   4.18.0-80.11.2.el8_0.x86_64   cri-o://1.15.2[root@node05 conf]#  crictl psCONTAINER           IMAGE                                                                                                         CREATED             STATE               NAME                ATTEMPT             POD ID5942e8c161029       docker.io/library/traefik@sha256:9a77d02ad23622cd85e38eec127a85110ad73ba8258d8b457cf17bd3ad1eeef0             3 hours ago         Running             traefik             0                   b03a2afb9dd919b23f9bc1d51a       docker.io/juestnow/process-exporter@sha256:8ef99f0488d8ea30770e048b4e4255a0ace7732422f243ab57fede0a003945bf   3 hours ago         Running             process-exporter    1                   7d133f4fba6c21e5a5a07676f1       docker.io/prom/node-exporter@sha256:b630fb29d99b3483c73a2a7db5fc01a967392a3d7ad754c8eccf9f4a67e7ee31          3 hours ago         Running             node-exporter       1                   cfa2a3d2b851c[root@node05 conf]#  crictl podsPOD ID              CREATED             STATE               NAME                      NAMESPACE           ATTEMPTb03a2afb9dd91       3 hours ago         Ready               traefik-f94cf4494-2n4x5   kube-system         0cfa2a3d2b851c       3 hours ago         Ready               node-exporter-rmv24       monitoring          17d133f4fba6c2       3 hours ago         Ready               process-exporter-hrbcv    monitoring          1# 容器能正常运行cri-o 替换docker 成功# kube-router 下载地址 https://github.com/cloudnativelabs/kube-router/releases/download/v0.3.2/kube-router_0.3.2_linux_amd64.tar.gz

文件 配置 目录 版本 二进制 节点 工作 编译 容器 注释 网络 测试 运行 路径 存储 成功 操作系统 上级 地址 官方 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中智农互联网科技 天津市摩尔互联网科技 广东万易互联网科技有限公司惠州分公司 苏州找大状互联网科技有限公司 金融科技还是互联网 互联网科技的发展 嘟嘟瓜互联网科技 艾特科技互联网 电子科技大学互联网 苏州大垚互联网科技 联恩商钥互联网科技有限公司 滨湖区互联网智能科技产品供应 成都互联网科技公司100强 和信科技工业互联网 众安科技工业互联网合作 工业互联网科技创业 宁波跨境商互联网科技有限公司 萌小萌互联网科技河南有限公司 广州三三互联网科技有限公司 平安好医生打造互联网科技医疗 互联网科技股 保险科技 互联网保险 浩特互联网科技 撒么互联网科技公司 大白互联网科技 健康食品互联网创新科技园项目 工业互联网等科技实现智能化赋能 互联网金融科技公司的优势 网互联网络科技 互联网科技快速发展优美句子
0