k8s 1.24默认已经不支持docker,可以通过cri-docker让k8s继续使用docker。

环境

  • k8s 版本:1.24.0
  • 系统: rock linux 8

主机

192.168.20.50 node0

编译cri-docker

编译cri-docker需要一个可以安装golang依赖的网络环境。

  • 下载cri-docker
git clone https://github.com/Mirantis/cri-dockerd
  • 构建cri-docker的rpm
    由于centos 8 已经结束,需要将构建centos 8 的环境修改成rockylinux
cat cri-dockerd/packaging/rpm/centos-8/Dockerfile 
ARG GO_IMAGE
# ARG DISTRO=centos
ARG DISTRO=rockylinux # 这里修改成rockylinux
ARG SUITE=8
ARG BUILD_IMAGE={DISTRO}:{SUITE}
...

构建rpm

cd cri-dockerd
make rpm

构建完成后在cri-dockerd/packaging/rpm/rpmbuild/RPMS中可以找到构建好的rpm包。

环境准备

  • 关闭swap
    所有节点上都要做
swapoff -a
# 注释掉/etc/fstab文件swap的行
  • 关闭防火墙
    所有节点上都要做
systemctl stop firewalld
systemctl disable firewalld
  • 关闭selinux
    临时关闭
setenforce 0

永久关闭

cat /etc/sysconfig/selinux
...
SELINUX=disabled
...
  • 修改内核模块
    配置k8s.conf文件(#k8s.conf文件原来不存在,需要自己创建的)
    所有节点上都要做
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.swappiness=0

# docker 1.21版本需要设置
# 默认情况下,此值为0,
# 它使内核不路由目的地为127.0.0.0/8的外部流量。
# 这只是为了安全,因为这样的流量是不正常的。
# 参看https://unix.stackexchange.com/questions/111433/iptables-redirect-outside-requests-to-127-0-0-1/112232#112232
net.ipv4.conf.all.route_localnet = 1
EOF
sysctl --system
  • 配置lvs 内核模块
    所有节点上都要做
cat <<EOF>> /etc/modules-load.d/lvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
br_netfilter
EOF

systemctl enable --now systemd-modules-load.service
  • 同步服务器时间
yum install chrony
systemctl enable chronyd  --now
chronyc sources
  • 安装iproute-tc
    k8s 需要iproute-tc
yum install iproute-tc

准备仓库

  • dockr.repo
wget -O /etc/yum.repos.d/docker-ce.repo  https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • k8s.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

部署k8s

  • 安装kubeadm和docker
yum install kubeadm docker-ce yum-plugin-versionlock

yum versionlock  kubeadm kubelet kubectl docker-ce

systemctl enable docker --now

systemctl enable kubelet
  • docker 配置
    将docker-ce的cgroup驱动改为systemd
cat <<EOF>> /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "iptables": false,
  "ip-masq": false,
   "bridge": "none",
  "log-driver":"json-file",
  "log-opts":{ "max-size" :"100m","max-file":"1"},
   "live-restore": false
}
EOF

  • 配置kubelet
    在多网卡的情况需要设置kubelet的ip
    所节点都要配置,其它两个节点上将192.168.254.10替换为相应的ip
cat <<EOF>> /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS=--node-ip=192.168.20.50
EOF
  • 安装cri-dockerd
    将之前构建的cri-dockerd的rpm安装在所有k8s节点上
    在rocky linux 8 上用yum localinstall 安装不能通过,使用下面的命令安装。
rpm -ivh --nodeps cri-docker-xxx.el8.x86_64.rpm 

修改cri-dockerd的启动参数,网络插件参数必需配置,否则安装calico网络插件会失败

cat /usr/lib/systemd/system/cri-docker.service
...
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
...

启动cri-dockerd

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

启动成功后会创建/var/run/cri-dockerd.sock,可以使用crictl验证。

crictl \
    --runtime-endpoint=unix:///var/run/cri-dockerd.sock \
    --image-endpoint=unix:///var/run/cri-dockerd.sock \
    info
  • 生成配置文件
kubeadm  config  print init-defaults >kubeadmin-config.yml
  • 编辑配置文件
cat kubeadmin-config.yml
...
localAPIEndpoint:
  advertiseAddress: 192.168.20.50
  bindPort: 6443
...
imageRepository: registry.aliyuncs.com/google_containers
...
nodeRegistration:
  criSocket: unix:///var/run/cri-dockerd.sock # 这里修改成cri-dockerd
  name: youre_hostname #修改为你自己的主机名
  taints: null
...
kubernetesVersion: v1.24.0
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
  • 拉取镜像
kubeadm config images pull --config kubeadmin-config.yml 
  • 安装master
 kubeadm init --config kubeadmin-config.yml --upload-certs   | tee kubeadmin-init.log
  • 取消污点,使master节点上可以承载pod
kubectl taint nodes --all node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master-

安装calico

  • 配置NetworManager
    在有NetworkManager的系统上需要配置NetworkManager不接管calico的网卡
cat <<EOF>> /etc/NetworkManager/conf.d/calico.conf
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico
EOF
  • calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

附重置k8s命令

直接执行kubeadm reset 会如下报错

...
Found multiple CRI endpoints on the host ...
...

可使用如下命令

kubeadm reset  --cri-socket unix:///var/run/cri-dockerd.sock