Centos8 安装高版本 k8s(cri-docker)
一、前言
在Kubernetes(k8s)的容器运行时生态中,Docker、Containerd和CRI-Docker是三个关键组件。随着k8s版本的迭代,对容器运行时的要求也在不断变化,理解它们的关系对部署高版本k8s至关重要。
1. Docker的演变
传统k8s集群常使用Docker作为容器运行时,但其设计并非专为k8s定制。Docker的架构包含:
Docker Engine:包含守护进程、API和CLI
containerd:实际管理容器生命周期的核心层
runc:底层OCI容器运行时
2. Containerd的崛起
从k8s 1.20起,Docker作为运行时被标记为废弃(deprecated),原因包括:
冗余架构(k8s只需容器管理功能)
性能开销(Docker的额外抽象层)
维护复杂性
Containerd作为CNCF毕业项目,成为k8s推荐的轻量级运行时,直接通过CRI(Container Runtime Interface)与kubelet交互。
3. CRI-Docker的定位
对于仍希望使用Docker生态的用户,CRI-Docker提供了折中方案:
作为shim层实现CRI接口
将kubelet的CRI请求转换为Docker API
保留Docker工具链(如
docker ps/docker logs)的兼容性
二、为什么选择CRI-Docker?
在CentOS8上安装高版本k8s时选择CRI-Docker方案,主要考虑:
兼容现有Docker工作流程
平滑过渡到纯Containerd架构
满足k8s CRI接口规范要求
下文将详细介绍在CentOS8系统上,通过CRI-Docker方案部署高版本k8s集群的具体步骤和注意事项。
1. 卸载无用程序和依赖
$ yum remove -y containerd runc docker-* podman containerd2. 配置安装源
$ cd /etc/yum.repos.d/ && mkdir backup && mv *repo backup/
$ curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
$ sed -i -e "s|mirrors.cloud.aliyuncs.com|mirrors.aliyun.com|g " /etc/yum.repos.d/CentOS-*
$ sed -i -e "s|releasever|releasever-stream|g" /etc/yum.repos.d/CentOS-*
$ curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
$ yum clean all && yum makecache3. 关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
$ swapoff -a
$ sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
$ hostnamectl set-hostname k8s-master
$ echo "192.168.1.100 k8s-master" >> /etc/hosts4. 内核调整
$ modprobe br_netfilter
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ cat > /etc/sysctl.conf <<EOF
net.ipv4.ip_forward = 1
EOF5. 安装 docker
# 查看 docker 的版本
$ yum list docker-ce --showduplicates | sort -r
# 安装指定版本的 docker
$ yum install -y docker-ce-25.0.5 docker-ce-cli-25.0.5 containerd.io docker-buildx-plugin docker-compose-plugin
$ systemctl enable docker --now
$ cat > /etc/docker/daemon.json <<EOF
{
"data-root": "/var/lib/docker",
"registry-mirrors": [
"https://6130e0dd.cf-workers-docker-io-upw.pages.dev",
"https://docker-mirror-proxy.zhenmourener.workers.dev"
],
"insecure-registries": [
"example.com:5000"
],
"live-restore": true,
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "10"
}
}
EOF
$ systemctl daemon-reload && systemctl restart docker6. 安装 cri-docker
$ wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1-3.el8.x86_64.rpm
$ yum install -y cri-dockerd-0.3.1-3.el8.x86_64.rpm
$ sed -ri 's@^(.*fd://).*$@\1 --pod-infra-container-image registry.aliyuncs.com/google_containers/pause:3.9@' /lib/systemd/system/cri-docker.service
$ systemctl daemon-reload && systemctl restart cri-docker7. 安装 k8s
$ yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0
$ cat > /var/lib/kubelet/kubeadm-flags.env <<EOF
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock"
EOF8. 初始化 master
$ kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--control-plane-endpoint=192.168.1.100:6443 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config9. 配置命令补全
$ source /usr/share/bash-completion/bash_completion
$ source <(kubectl completion bash)
$ echo "source <(kubectl completion bash)" >> ~/.bashrc10. 从节点加入集群
$ kubeadm join 192.168.1.100:6443 \
--token 9037x2.tcaqnpaqkra9vsbw \
--discovery-token-ca-cert-hash sha256:23e4b3729d998e3a97d3dd72989080572a0e5ca9e9a2cd708b5a8cc7bfd09f36 \
--cri-socket unix:///var/run/cri-dockerd.sock11. 卸载集群
$ kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock
License:
CC BY 4.0