1- Docker
2- cri-dockerd
3- 如何将Docker切换到Containerd
4- 全新安装Containerd接入集群
5- 如何将Kubernetes扩展为多Master的高可用集群
(1)主机名解析
[root@master01 ~]# cat >> /etc/hosts <EOF
10.0.0.201 master01 master01.koiz1.com vip.koiz1.com
10.0.0.202 master02 master02.koiz1.com
10.0.0.203 master03 master03.koiz1.com
10.0.0.204 node01 node01.koiz1.com
10.0.0.205 node02 node02.koiz1.com
10.0.0.206 node03 node03.koiz1.com
EOF
(2)关闭防火墙
[root@master01 ~]# systemctl stop firewalld && systemctl disable firewalld
[root@master01 ~]# setenforce 0
[root@master01 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
(3)关闭swap分区
[root@master01 ~]# sed -ri 's@(.*swap.*)@#\1@g' /etc/fstab
#关闭正在使用的swap
[root@master01 ~]# swapoff -a
#检查swap是否关闭
[root@master01 ~]# free -m
(4)修改内核参数
[root@master01 ~]# cat >> /etc/modules-load.d/k8s.conf <EOF
overlay
br_netfilter
EOF
[root@master01 ~]# sudo modprobe overlay
[root@master01 ~]# sudo modprobe br_netfilter
(5)添加内核参数
[root@master01 ~]# cat >> /etc/sysctl.d/k8s.conf <EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
vm.overcommit_memory = 0
EOF
[root@master01 ~]# sysctl -p /etc/sysctl.d/k8s.conf
(6)配置IPVS
[root@master01 ~]# yum install ipset ipvsadm -y
[root@master01 ~]# mkdir /etc/sysconfig/modules -p
[root@master01 ~]# cat >> /etc/sysconfig/modules/ipvs.modules <EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
[root@master01 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules
[root@master01 ~]# bash /etc/sysconfig/modules/ipvs.modules
[root@master01 ~]# lsmod |grep -e ip_vs -e nf_conntrack
(7)配置时间同步
[root@master01 ~]# yum install -y chrony
[root@master01 ~]# systemctl enable chronyd --now
[root@master01 ~]# chronyc sources
(8)部署docker
[root@master01 ~]# yum remove docker* -y && yum install -y yum-utils
[root@master01 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@master01 ~]# yum install -y docker-ce
[root@master01 ~]# cat >> /etc/docker/daemon.json <EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://hub-mirror.c.163.com",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn/"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl enable --now docker
(9)安装cri-dockerd
[root@master01 ~]# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4.amd64.tgz
[root@master01 ~]# tar xf cri-dockerd-0.3.4.amd64.tgz
[root@master01 ~]# cd cri-dockerd
[root@master01 ~]# cp cri-dockerd /usr/local/bin/
[root@master01 ~]# ll /usr/local/bin/
#cri-dockerd启停脚本
[root@master01 ~]# cat >> /usr/lib/systemd/system/cri-dockerd.service <EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3
# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl start cri-dockerd
[root@master01 ~]# ll /usr/local/bin/cri-dockerd
(10) Kubernetes组件部署
#配置k8s源
[root@master01 ~]# cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
[root@master01 ~]# yum makecache
[root@master01 ~]# yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0
[root@master01 ~]# systemctl enable kubelet
[root@master01 ~]# systemctl restart kubelet
[root@master01 ~]# systemctl status kubelet
###镜像拉取###
#默认国外k8s源
[root@master01 ~]# kubeadm config images list --kubernetes-version v1.28.0
#更改国内阿里源
[root@master01 ~]# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.28.0
#拉取镜像
[root@master01 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.28.0
#修改runtime
[root@master01 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.28.0 --cri-socket=unix:///var/run/cri-dockerd.sock
(11)master初始化 ---> 仅Master执行
[root@master01 ~]# kubeadm init --apiserver-advertise-address="10.0.0.201" --control-plane-endpoint="vip.koiz1.com" --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.28.0 --service-cidr=10.96.0.0/16 --pod-network-cidr=192.168.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock
(12) node节点初始化
kubeadm join vip.koiz1.com:6443 --token azy18m.5i3n2cb7l4p9dk73 \
--discovery-token-ca-cert-hash sha256:860feeafec0b3d81b645d2a0d173ccb5662a81fe61cf34326c8ce63b4991d72d \
--cri-socket="unix:///run/cri-dockerd.sock"
(13)网络插件部署
[root@master01 ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
[root@master01 ~]# kubectl apply -f kube-flannel.yml
(14) 命令补全
[root@master01 ~]# yum install bash-completion -y
[root@master01 ~]# echo 'source <(kubectl completion bash)' >>~/.bashrc
将docker切换到containerd
#Master节点操作
(1)驱逐Master的pod --->所有节点
kubectl drain master01.koiz1.com --ignore-daemonsets
(2)停止docker和kubelet --->所有节点
systemctl stop docker.socket
systemctl stop cri-dockerd
systemctl stop kubelet
systemctl disable docker cri-dockerd
(3)安装Containerd --->所有节点
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y containerd
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
修改一下内容 vim /etc/containerd/config.toml
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
SystemdCgroup = true
systemctl enable containerd
systemctl start containerd
(4)安装nerdctl客户端 --->所有节点
wget https://github.com/containerd/nerdctl/releases/download/v1.5.0/nerdctl-full-1.5.0-linux-amd64.tar.gz
tar xf nerdctl-full-1.5.0-linux-amd64.tar.gz -C /tmp/
cp /tmp/bin/nerdctl /usr/local/bin/
(5)安装buildkitd --->构建镜像用的,也在上面这个包里
cp /tmp/bin/{buildctl,buildkitd} /usr/local/bin/
echo 'source <(nerdctl completion bash)' >> /etc/profile
source /etc/profile
cp /tmp/lib/systemd/system/buildkit.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl enable buildkit.service --now
(6)修改kubelet使用containerd作为其容器运行时
[root@* ~]# cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime-endpoint=unix:///run/containerd/containerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9"
systemctl restart kubelet.service
systemctl status kubelet.service
(7)使用containerd重新拉取镜像 --->Master需要,Node不需要
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.28.0 --cri-socket=unix:///var/run/containerd/containerd.sock
(8)在Master上修改注解
kubectl edit nodes master01.koiz1.com
修改:kubeadm.alpha.kubernetes.io/cri-socket: unix:///run/containerd/containerd.sock
(9)使用uncordon恢复节点
kubectl uncordon master01.koiz1.com
(10)查看节点信息 ---> 容器运行时
[root@master01 ~]# kubectl get nodes -o wide
#Node节点切换Containerd
(1)驱逐Node的pod
kubectl drain node01.koiz1.com --ignore-daemonsets
(2)停止docker和kubelet --->所有节点
systemctl stop docker.socket
systemctl stop cri-dockerd
systemctl stop kubelet
systemctl disable docker cri-dockerd
(3)安装Containerd --->所有节点
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y containerd
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
修改一下内容 vim /etc/containerd/config.toml
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
SystemdCgroup = true
systemctl enable containerd
systemctl start containerd
(4)安装nerdctl客户端 --->所有节点
wget https://github.com/containerd/nerdctl/releases/download/v1.5.0/nerdctl-full-1.5.0-linux-amd64.tar.gz
tar xf nerdctl-full-1.5.0-linux-amd64.tar.gz -C /tmp/
cp /tmp/bin/nerdctl /usr/local/bin/
(5)安装buildkitd --->构建镜像用的,也在上面这个包里
cp /tmp/bin/{buildctl,buildkitd} /usr/local/bin/
echo 'source <(nerdctl completion bash)' >> /etc/profile
source /etc/profile
cp /tmp/lib/systemd/system/buildkit.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl enable buildkit.service --now
(6)修改kubelet使用containerd作为其容器运行时
[root@* ~]# cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime-endpoint=unix:///run/containerd/containerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9"
systemctl restart kubelet.service
systemctl status kubelet.service
eg: 如果kubelet起不来,重启containerd服务
(7)在Master上修改注解
kubectl edit nodes master01.koiz1.com
修改:kubeadm.alpha.kubernetes.io/cri-socket: unix:///run/containerd/containerd.sock
(8)在Master上使用uncordon恢复节点
kubectl uncordon node01.koiz1.com
(9)在Master上查看节点信息 ---> 容器运行时
[root@master01 ~]# kubectl get nodes -o wide
#全新安装Containerd接入集群
(1) Kubernetes组件部署
#配置k8s源
[root@master01 ~]# cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
[root@master01 ~]# yum makecache
[root@master01 ~]# yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0
[root@master01 ~]# systemctl enable kubelet
[root@master01 ~]# systemctl restart kubelet
[root@master01 ~]# systemctl status kubelet
(2)安装Containerd --->所有节点
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y containerd
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
修改一下内容 vim /etc/containerd/config.toml
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
SystemdCgroup = true
systemctl enable containerd
systemctl start containerd
(3)安装nerdctl客户端 --->所有节点
wget https://github.com/containerd/nerdctl/releases/download/v1.5.0/nerdctl-full-1.5.0-linux-amd64.tar.gz
tar xf nerdctl-full-1.5.0-linux-amd64.tar.gz -C /tmp/
cp /tmp/bin/nerdctl /usr/local/bin/
(4)安装buildkitd --->构建镜像用的,也在上面这个包里
cp /tmp/bin/{buildctl,buildkitd} /usr/local/bin/
echo 'source <(nerdctl completion bash)' >> /etc/profile
source /etc/profile
cp /tmp/lib/systemd/system/buildkit.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl enable buildkit.service --now
(5)Master上执行加入进群命令
kubeadm token create --print-join-command
(6)Node加入集群
kubeadm join vip.koiz1.com:6443 --token a3gmgq.wlw595pjmhbl0a73 --discovery-token-ca-cert-hash sha256:860feeafec0b3d81b645d2a0d173ccb5662a81fe61cf34326c8ce63b4991d72d
!镜像会自动下载,如网络插件等,下载完成会自动Ready
eg:报错日志 tail -f /var/log/message