Kubernetes 集群v1.21.0部署

48 阅读2分钟

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(其实是找不到文件)。

image-20260112230603843.png

解决方案

第一步:手动拉取正确的 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>

这块可能出的错

image-20260112232714501.png

这个是没有启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

image-20260112234536426.png