虽然高版本k8s已经不再支持docker作为容器引擎了,但是我们可以通过cri-docker来继续在新版本k8s集群中使用docker,以下为如何快速简单使用cri-docker部署K8s集群

环境准备

准备3台服务器,虚拟机也行,每台主机的CPU要在2核心以上,RAM 2GB以上,否则后续初始化K8s时会不通过。

配置主机名

hostnamectl set-hostname master && bash
hostnamectl set-hostname node1  && bash
hostnamectl set-hostname node2  && bash

配置Hosts文件解析

vi /etc/hosts
192.168.100.100 master 
192.168.100.101 node1 
192.168.100.102 node2 

关闭SELINUX以及swap

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

配置YUM仓库

备份原有YUM仓库配置文件并下载docker,K8s的仓库文件

cd /etc/yum.repos.d/
mkdir back && mv *.repo back
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
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 makecache

调整内核参数

将桥接的IPV4流量传递到iptables的链同一节点的不同pod,利用linux bridge进行二层通讯,由于没有原路返回造成pod请求services时的session无法收到返回值而连接超时,所以需要设置让第二层的bridge在转发时也通过第三层的iptables进行通信,并禁止使用swap,只有当系统 OOM 时才允许使用它

cat <<EOF> /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

#加载br_netfilter模块并应用/etc/sysctl.d/kubernetes.conf文件中的内核参数配置
modprobe br_netfilter && sysctl -p /etc/sysctl.d/kubernetes.conf

配置时区,时间同步

ntpdate ntp1.aliyun.com
vi /etc/crontab
1 * * * * root /usr/sbin/ntpdate ntp1.aliyun.com && /sbin/hwclock -w

配置防火墙(根据具体需求配置)

设置防火墙为 Iptables 并设置空规则

systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable
iptables -F &&  iptables-save

开启ipvs

不开启ipvs将会使用iptables,但是效率低,所以官网推荐需要开通ipvs内核

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF


#赋予权限并加载
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

配置持久化

mkdir /var/log/journal
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
#持久化保存到磁盘
Storage=persistent
#压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
#最大占用空间 10G
SystemMaxUse=10G
#单日志文件最大 200M
SystemMaxFileSize=200M
#日志保存时间 2 周
MaxRetentionSec=2week
#不将日志转发到 syslog
ForwardToSyslog=no
EOF


systemctl restart systemd-journald

安装Docker并配置镜像加速(所有节点同时操作)

如需指定版本可以使用 yum list docker-ce --showduplicates | sort -r 查看版本信息
通过 yum -y install docker-ce-26.1.4安装

yum install -y vim yum-utils device-mapper-persistent-data lvm2
yum install -y docker-ce

配置Docker镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://vwlrpbcp.mirror.aliyuncs.com",
                                 "https://docker.1ms.run",
                                 "https://docker.anyhub.us.kg",
                                 "https://dockerhub.jobcher.com",
                                 "https://dockerhub.icu"]
}
EOF
systemctl daemon-reload && systemctl restart docker && systemctl enable --now docker

安装cri-docker

https://github.com/Mirantis/cri-dockerd/releases/
yum localinstall -y cri-dockerd-0.3.14-3.el7.x86_64.rpm

修改service文件

这里的registry.aliyuncs.com/google_containers/pause:3.9镜像版本若不确定可以先安装K8s后执行kubeadm config images list --kubernetes-version=v1.28.2来确定

vi /usr/lib/systemd/system/cri-docker.service

ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 #此参数加了会导致无法启动,暂未解决可以先不加--container-runtime-endpoint


systemctl daemon-reload && systemctl enable --now cri-docker cri-docker.socket

安装K8S

yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2
systemctl enable kubelet

部署Master节点(只在master节点执行)

查看所需镜像

[root@master ~]# kubeadm config images list --kubernetes-version=v1.28.2
registry.k8s.io/kube-apiserver:v1.28.2
registry.k8s.io/kube-controller-manager:v1.28.2
registry.k8s.io/kube-scheduler:v1.28.2
registry.k8s.io/kube-proxy:v1.28.2
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1

初始化

#没安过k8s就不需要执行reset kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
kubeadm init --kubernetes-version=v1.28.2 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.100.100 --cri-socket unix:///var/run/cri-dockerd.sock --image-repository=registry.aliyuncs.com/google_containers

部署成功,按照说明进行配置

根据日志的提示创建文件夹
mkdir -p $HOME/.kube
根据日志的提示把配置文件复制进刚刚新创建的文件夹里
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
根据日志的提示输入以下命令
chown $(id -u):$(id -g) $HOME/.kube/config

安装 Pod 网络插件(CNI)

wget https://docs.projectcalico.org/manifests/calico.yaml
vi calico.yaml

**修改CIDR**
  - name: CALICO_IPV4POOL_CIDR
  value: "10.224.0.0/16"  #和前面初始化--pod-network-cidr的值保持一样
# Disable file logging so `kubectl logs` works.
  - name: CALICO_DISABLE_FILE_LOGGING
  value: "true"

**指定网卡**
# Cluster type to identify the deployment type
  - name: CLUSTER_TYPE
  value: "k8s,bgp"
# 下面添加
  - name: IP_AUTODETECTION_METHOD
    value: "interface=eth0"
    # eth0为本地网卡名字


kubectl apply -f calico.yaml

Node节点部署

根据提示把node节点加入到master节点中,复制master节点的加入提示命令,然后分别粘贴在2个node节点上,最后回车即可(注意要在后面加上--cri-socket unix:///var/run/cri-dockerd.sock这一参数,不然会失败)
kubectl get node -A
显示ready即成功