Kubernetes v1.21.0 高可用集群部署 (CentOS 7.9 / Docker版)
三台服务器centos7.9
一、 基础环境初始化 (所有节点)
1.关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
2.关闭 SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
3.关闭 Swap (K8s 强制要求)
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
4.配置主机名与解析
# 修改主机名 (请根据当前节点分别执行)
# Master: hostnamectl set-hostname k8s-master
# Node1: hostnamectl set-hostname k8s-node1
# Node2: hostnamectl set-hostname k8s-node2
# 配置 Hosts 解析 (所有节点都执行)
cat >> /etc/hosts << EOF
ip地址 k8s-master
ip地址 k8s-node1
ip地址 k8s-node2
EOF
#用scp命令传送到其他节点
scp /etc/hosts root@其他两个节点ip地址:/etc/hosts
5.时间同步
yum install ntpdate -y
ntpdate time.windows.com
6.加载内核模块与参数
# 加载 ipvs 和 br_netfilter 模块
cat > /etc/modules-load.d/ipvs.conf << EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
# 开启路由转发
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
EOF
sysctl --system
二、 容器运行时配置 (所有节点)
安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
配置Docker镜像源(清华源)
sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's|https://download.docker.com|https://mirrors.tuna.tsinghua.edu.cn/docker-ce|g' /etc/yum.repos.d/docker-ce.repo
生成高速缓存(提升安装速度)
sudo yum makecache fast
安装docker
sudo yum install -y docker-ce
配置docker加速源
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
#这块我用的是轩辕镜像,自己去购买不贵
# 重启 Docker
systemctl daemon-reload
systemctl restart docker
三、 安装 K8s 组件 (所有节点)
添加阿里云 YUM 源
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=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 install -y kubelet-1.21.0-0 kubeadm-1.21.0-0 kubectl-1.21.0-0
systemctl enable kubelet
四、 集群初始化 (Master 节点)
执行初始化
kubeadm init \
--apiserver-advertise-address=192.168.1.10 \ #改成自己k8s-master的ip
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
这块有可能报错
Kubeadm v1.21 在初始化时,默认会去拉取 coredns/coredns:v1.8.0 这种格式的镜像。 但是,阿里云的镜像仓库中,CoreDNS 的路径是 coredns:v1.8.0(少了一层目录)。
导致 Kubeadm 拼凑出的地址 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0 在阿里云上不存在,所以报错 pull access denied(其实是找不到文件)。
解决方案
第一步:手动拉取正确的 CoreDNS 镜像
docker pull registry.aliyuncs.com/google_containers/coredns:v1.8.0
第二步:修改镜像标签 (Tag)
将刚才拉下来的镜像,重命名为 Kubeadm 想要的那个“错误”名字:
docker tag registry.aliyuncs.com/google_containers/coredns:v1.8.0 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
第三步:重新执行初始化
注意:你的 Docker 版本较高(26.1.4),K8s v1.21 可能会报警告,建议加上 --ignore-preflight-errors=SystemVerification 来忽略 Docker 版本检查。
kubeadm init \
--apiserver-advertise-address=192.168.183.198 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=SystemVerification
配置 Kubectl 权限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
记录 Join 命令
复制输出的 kubeadm join ... 命令。
五、 部署网络插件 Calico (适配版)
下载配置文件
curl https://docs.projectcalico.org/v3.19/manifests/calico.yaml -O
只要加速源没问题直接
kubectl apply -f calico.yaml
然后检查k8s
kubectl get pods -n kube-system -w
90%只要加速源没问题,所有pod都会runing
六、 节点加入 (Node 节点)
将复制的Jion命令粘贴
kubeadm join 192.168.1.10:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
这块可能出的错
这个是没有启docker
解决方案
启动docker
systemctl daemon-reload
systemctl restart docker
删掉留下了旧的配置文件。Kubeadm 为了防止覆盖数据,直接报错退出了。
清理旧环境
# 1. 重置 kubeadm 安装状态
kubeadm reset -f
# 2. 手动清理可能残留的目录 (防止 reset 删不干净)
rm -rf /etc/kubernetes/
rm -rf /var/lib/kubelet/
rm -rf /var/lib/etcd/
rm -rf $HOME/.kube
重新加入集群
kubeadm join 192.168.183.198:6443 --token q6hryc.wzells6lvyh0efhc \
--discovery-token-ca-cert-hash sha256:9c3eb897f2182e7ceeaa01a7b076585e102a0c837dc0d6ee71850ede61bc11f4 \
--ignore-preflight-errors=SystemVerification
七.验证集群
kubectl get nodes