1、 为什么弃用docker
     Kubernetes平台中,为了解决与容器运行时(例如Docker)集成 问题,在早期社区推出了CRI(Container Runtime Interface,容 器运行时接口),以支持更多的容器运行时。 当我们使用Docker作为容器运行时之后,架构是这样的,如图所示: Kubernetes 计划弃用就是kubelet中dockershim。即 Kubernetes kubelet 实现中的组件之一,它能够与 Docker Engine 进行通信
• Docker内部调用链比较复杂,多层封装和调用,导致性能降低、提升故障率、不易排查
• Docker还会在宿主机创建网络规则、存储卷,也带来了安全隐患
2、containerd介绍
     containerd原本属于docker中一部分,如今成为一个独立容器运行并支持CRI(k8s容器接口),后来docker又把containerd捐献给CNCF基金会。
3、切换引擎为Containerd
3.1、基础环境准备
检查 overlay、 br_netfilter是否已加载(此状态为已加载)
lsmod |grep overlay
lsmod |grep netfilter

若未加载,执行
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。(先检查这些参数是否已添加,部署k8s一般已经启用)
sysctl -a |grep net.ipv4.ip_forward
此为已启用
若未启用
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
sudo sysctl --system

3.2、安装containerd
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
检查
ps -ef |grep containerd
修改配置文件
  • pause镜像设置过阿里云镜像仓库地址
  • cgroups驱动设置为systemd
  • 拉取Docker Hub镜像配置加速地址设置为阿里云镜像仓库地址
如果是由docker切换containerd,配置文件内容不足,则重新生成containerd配置文件
containerd config default > /etc/containerd/config.toml
进入配置文件,通过搜索关键字来定位修改位置, [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]在新版containerd中搜不到,没关系,他是加速器,可以不配置
vi /etc/containerd/config.toml
   [plugins."io.containerd.grpc.v1.cri"]
      sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"  
         ...
         [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
             SystemdCgroup = true
             ...
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]
systemctl restart containerd
配置kubelet使用containerd
vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd
systemctl restart kubelet
注意,切换容器后之前的pods最好重新创建
验证可以看到此节点启动容器已修改
kubectl get node -o wide
管理容器工具
containerd提供了ctr命令行工具管理容器,但功能比较简单,所以一般会用crictl工具检查和调试容器。
设置crictl连接containerd
vi /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
切换回docker:清除/etc/sysconfig/kubelet的配置文件并重启kubelet即可
vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=
systemctl restart kubelet
下面是docker与crictl命令对照表:
镜像相关功能
Docker
Containerd
显示本地镜像列表
docker images
crictl images
下载镜像
docker pull
crictl pull
上传镜像
docker push
例如buildk
删除本地镜像
docker rmi
crictl rmi
查看镜像详情
docker inspect IMAGE-ID
crictl inspecti IMAGE-ID
容器相关功能
Docker
Containerd
显示容器列表
docker ps
crictl ps
创建容器
docker create
crictl create
启动容器
docker start
crictl start
停止容器
docker stop
crictl stop
删除容器
docker rm
crictl rm
查看容器详情
docker inspect
crictl inspect
附加容器
docker attach
crictl attach
执行命令
docker exec
crictl exec
查看 日志
docker logs
crictl logs
查看容器资源
docker stats
crictl stats
POD 相关功能
Docker
Containerd
显示 POD 列表
crictl pods
查看 POD 详情
crictl inspectp
运行 POD
crictl runp
停止 POD
crictl stopp
Logo

开源、云原生的融合云平台

更多推荐