1、系统配置
1.1、修改主机名
hostnamectl set-hostname k8s-node
1.2、关闭防火墙
#关闭并禁止开机自启
systemctl disable --now firewalld
1.3、关闭selinux
#临时关闭
setenforce 0
#永久关闭
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
1.4、禁止SWAP
#临时关闭
swapoff -a
#永久关闭
sed -i '/swap/ s/^/#/' /etc/fstab
1.5、安装工具包
yum update -y
yum install -y python3 wget net-tools bind-utils telnet curl tree nmap jq lrzsz dos2unix lsof rsync cifs-utils
1.6、内核配置
#临时加载内核模块
modprobe br_netfilter
#永久加载内核模块
echo "br_netfilter" | tee -a /etc/modules-load.d/k8s.conf
#验证是否加载
lsmod |grep br_netfilter
#修改网络配置
echo "net.bridge.bridge-nf-call-ip6tables = 1" > /etc/sysctl.d/98-k8s.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.d/98-k8s.conf
#配置生效
sysctl --system
2、安装Docker
2.1、下载yum源文件
可以在开源的公有云下载,这里仅列出两个,以阿里云举例
阿里云镜像站: https://developer.aliyun.com/mirror/
移动云镜像站: https://mirrors.cmecloud.cn/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
2.2、安装指定版本的Docker
#查看版本
yum list docker-ce --showduplicates | sort -r
#安装指定版本
yum install -y docker-ce-28.0.4
systemctl enable --now docker
2.3、配置国内镜像源
#添加加速仓库,k8s默认cgroup驱动为systemd,这里保持一致
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://docker.m.daocloud.io","https://docker.1ms.run"]
}
EOF
#重启服务
systemctl restart docker
#下载一个nginx镜像,不配置加速,下载镜像比较困难
docker pull nginx
3、安装cri-docker
3.1、下载程序
打开github(https://github.com/Mirantis/cri-dockerd)下载程序,这里更具操作系统选择下载的程序是 cri-dockerd-0.3.17.amd64.tgz
3.2、解压程序
tar zxf cri-dockerd-0.3.17.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/bin/
3.3、配置服务并启动
在对应的版本下下载启动文件(https://github.com/Mirantis/cri-dockerd/tree/v0.3.17/packaging/systemd)
创建/usr/lib/systemd/system/cri-docker.service文件
[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
Requires=cri-docker.socket
[Service]
Type=notify
#修改指定仓库的镜像
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
创建/usr/lib/systemd/system/cri-docker.socket文件
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
启动服务
systemctl enable --now cri-docker
4、安装K8S程序
4.1、配置镜像源
使用阿里云的镜像源(https://developer.aliyun.com/mirror/kubernetes),如果需要使用1.28及以上版本使用新的地址。这里我们使用的是1.28的版本。
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=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
4.2、安装程序
#查看支持的版本
yum list kubelet --showduplicates | sort -r
安装指定的版本并设置开机启动
yum install -y kubeadm-1.28.15 kubelet-1.28.15 kubectl-1.28.15
systemctl enable kubelet
5、规划节点并克隆
5.1、规划3台机器
vi /etc/hosts
192.168.212.201 k8s-node201
192.168.212.202 k8s-node202
192.168.212.203 k8s-node203
5.2、创建链接克隆
完整克隆是一个独立的虚拟机,链接克隆是父虚拟机的快照,这里为了节约磁盘、加快创建效率使用链接克隆。建议重新生成下 mac 地址。
5.3、修改IP地址和主机名
#修改主机名
hostnamectl set-hostname k8s-node01
# 查看当前网络连接名称,显示为ens160
nmcli connection show
# 修改v4 地址
nmcli connection modify ens160 ipv4.address 192.168.212.201
# 修改生效
nmcli connection down ens160 && nmcli connection up ens160
5.4、验证机器
#重启机器
reboot
#验证配置是否生效
hostname
getenforce
free
sysctl net.bridge.bridge-nf-call-ip6tables
sysctl net.bridge.bridge-nf-call-iptables
systemctl status firewalld
systemctl status docker
systemctl status cri-docker
6、安装测试集群
选择1台机器作为master节点,2台node节点,这种架构只能测试使用,因为1台master节点故障后,整体集群不可用,存在单点风险。
可以进行安装前的检查,kubeadm init phase preflight --cri-socket=unix:///var/run/cri-dockerd.sock
6.1、安装master节点
注意内存最小要求1700M,如果你配置的虚拟机为2G,可能需要扩容500M。Pod网络(--pod-network-cidr)和Service网络(--service-cidr)可自定定义,不要和底层网络冲突。执行成功后日志信息如下:
kubeadm init \
--apiserver-advertise-address=192.168.212.201 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=1.28.0 \
--pod-network-cidr=10.198.0.0/16 \
--service-cidr=10.98.0.0/12 \
--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/config
初始化的配置会存在在集群的CM中,通过以下命令查询。
kubectl describe cm kubeadm-config -n kube-system
6.2、安装node节点
master节点安装完成后提示安装node节点的命令,其中的Token会在24小时后过期。
kubeadm join 192.168.212.201:6443 --token zz6b66.nin31i2zhygbvk64 \
--discovery-token-ca-cert-hash sha256:94bfe438416369a26f7180060fbdb1125958370e306aea4971acab311e561f4c \
--cri-socket=unix:///var/run/cri-dockerd.sock
#24小时后扩容机器,需要重置Token,生成新的扩容命令
kubeadm token create --print-join-command
加入集群执行日志如下:
6.3、验证集群
可以通过命令查询集群中的节点,当前节点状态为NotReady,因为没有配置容器的网络,为正常现象。
kubectl get node
# 查看kubelet状态,存在容器网络报错信息
systemctl status kubelet
找到以下信息:
Container runtime network not ready
7、配置网络插件
7.1、下载网络插件文件
常见的网络插件有Flannel、Calico、Cilium,这里我们选择Calico,在github中打开项目(https://github.com/projectcalico/calico/),在代码的manifests目录找到两个文件(custom-resources.yaml、tigera-operator.yaml),这里我们选在的是最新的v3.29.3版本(https://github.com/projectcalico/calico/tree/v3.29.3/manifests)。
修改custom-resources.yaml中pod网络为安装时配置地址。
#查看是否和pod网段匹配
cat custom-resources.yaml |grep "cidr:"
7.2、安装网络插件
kubectl create -f tigera-operator.yaml
kubectl create -f custom-resources.yaml
7.3、验证网络服务状态
等待一段时间后,查看服务状态。
kubectl get node
kubectl get pod --all-namespaces
8、卸载节点
在master上将节点移出集群,这时候数据依然存在,节点重启后会再次自动加入集群。
#在master节点删除节点
kubectl delete node k8s-node203
在对应节点清理数据,不可恢复,请谨慎操作!
#在对应的node节点清理数据
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
清理残留脏数据
#清理目录
rm -rf ~/.kube
rm -rf /etc/kubernetes
rm -rf /var/lib/etcd
rm -rf /var/lib/kubelet
rm -rf /var/lib/kubernetes
rm -rf /var/run/kubernetes
rm -rf /etc/cni/net.d
rm -rf /opt/cni/