Kubernetes v1.20.9 集群搭建(基于 kubeadm + Calico + CentOS 7)
本文将以 三台 CentOS 7 虚拟机 (2C4G)为例,使用 kubeadm 工具搭建一个 Kubernetes v1.20.9 集群,网络插件选用 Calico。全文涵盖 Docker 安装、系统环境配置、Master 初始化、Node 加入以及集群验证等关键步骤,并配有流程图辅助理解。
📌 准备工作
| 主机 IP | 角色 | 配置要求 |
|---|---|---|
192.168.190.11 |
Master | 2核4G(≥2G内存) |
192.168.190.12 |
Node1 | 2核4G(≥2G内存) |
192.168.190.13 |
Node2 | 2核4G(≥2G内存) |
- 操作系统:CentOS 7.x(最小化安装即可)
- 所有节点之间网络互通(内网 IP)
- 使用
root用户执行以下命令(或使用sudo)
🧭 整体搭建流程图
否
是
准备3台CentOS 7宿主机
所有节点安装Docker
所有节点基础环境配置
所有节点安装kubeadm/kubelet/kubectl
Master节点预拉取镜像
Master节点执行kubeadm init
初始化成功?
kubeadm reset + 清理iptables
配置kubectl
安装Calico网络插件
Node节点执行kubeadm join
验证集群状态
✅ 集群就绪
1️⃣ 所有节点安装 Docker(v20.10.7)
Kubernetes 1.20 要求 Docker 版本在 20.10 左右,我们统一安装 20.10.7。
bash
# 卸载旧版docker
sudo yum remove -y docker* 2>/dev/null
# 安装依赖工具
sudo yum install -y yum-utils
# 添加阿里云Docker仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装指定版本
sudo yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
# 启动docker并设置开机自启
sudo systemctl enable docker --now
# 配置镜像加速器 + cgroup驱动(重要)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://jbw52uwf.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {"max-size": "100m"},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证 docker 版本
docker version
💡 为什么设置
native.cgroupdriver=systemd?Kubernetes 推荐使用
systemd作为 cgroup 驱动,否则 kubelet 启动可能报错。
2️⃣ 所有节点基础环境配置
以下步骤需要在 三台机器 上分别执行。
2.1 关闭防火墙与 SELinux
bash
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
2.2 关闭 Swap(K8s 必须)
bash
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 重启后执行 free -m 确认 swap 为 0
reboot
2.3 设置主机名 & hosts 解析
bash
# 分别在三台机器上执行
hostnamectl set-hostname k8s-master # Master机器
hostnamectl set-hostname k8s-node1 # Node1机器
hostnamectl set-hostname k8s-node2 # Node2机器
# 所有机器统一配置hosts(使用实际内网IP)
cat >> /etc/hosts << EOF
192.168.190.11 k8s-master
192.168.190.12 k8s-node1
192.168.190.13 k8s-node2
EOF
2.4 允许桥接流量(K8s 网络要求)
bash
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
2.5 时间同步(避免证书错误)
bash
yum install -y ntpdate
ntpdate time.windows.com
# 可加入 crontab 定时同步
3️⃣ 所有节点安装 kubelet/kubeadm/kubectl
使用阿里云镜像仓库安装 v1.20.9 版本。
bash
# 添加K8s阿里云yum源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF
# 查看可用版本(可选)
yum list kubelet --showduplicates | sort -r
# 安装指定版本
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9
# 启动kubelet(此时会失败,因为还没初始化,但需要启用)
sudo systemctl enable --now kubelet
⚠️ 此时
kubelet可能反复重启,是正常的,等 Master 初始化后会恢复正常。
4️⃣ Master 节点预拉取镜像
为了避免初始化时因国外镜像卡住,我们先从阿里云镜像仓库拉取所需镜像。
创建并执行以下脚本:
bash
cat > ./images.sh << 'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for img in "${images[@]}"; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$img
done
EOF
chmod +x ./images.sh && ./images.sh
5️⃣ 初始化 Master 节点
仅在 k8s-master 上执行 ,注意修改 --apiserver-advertise-address 为你的 Master 实际内网 IP。
bash
kubeadm init \
--apiserver-advertise-address=192.168.190.11 \
--control-plane-endpoint=k8s-master \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
--pod-network-cidr=10.244.0.0/16与 Calico 默认地址一致,请勿随意修改。- 初始化过程大约需要 1~2 分钟。
✅ 初始化成功标志
看到如下输出则表示成功:
Your Kubernetes control-plane has been initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Then you can join any number of worker nodes by running:
kubeadm join k8s-master:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx
❌ 如果初始化失败
执行以下清理命令后再尝试:
bash
kubeadm reset
rm -rf /etc/cni/net.d $HOME/.kube/config
iptables -F && iptables -X && iptables -t nat -F && iptables -t nat -X
6️⃣ 配置 kubectl(Master 节点)
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 测试命令
kubectl get nodes
# 此时应该只看到一个 master 节点,状态为 NotReady(缺少网络插件)
7️⃣ 安装 Calico 网络插件
bash
# 下载 Calico v3.20 资源文件
curl https://docs.projectcalico.org/archive/v3.20/manifests/calico.yaml -O
# 如果你的机器有多个网卡(比如 NAT + 桥接),需要指定网卡接口名(如 ens33)
# 编辑 calico.yaml,找到以下环境变量,取消注释并修改:
# - name: IP_AUTODETECTION_METHOD
# value: "interface=ens33"
# 应用 Calico
kubectl apply -f calico.yaml
等待约 2~3 分钟,再次查看节点状态:
bash
kubectl get nodes
# 应该变为 Ready 状态
📌 如何查看节点使用的网卡名? 执行
ip a或ifconfig,一般虚拟机网卡名为ens33、eth0等。
8️⃣ Node 节点加入集群
在每个 Node 节点上执行 Master 初始化完成后输出的 kubeadm join 命令,例如:
bash
kubeadm join k8s-master:6443 --token 50rexj.yb0ys92ynnxxbo2s \
--discovery-token-ca-cert-hash sha256:10fd9d2a9f4e2d7dff502aa3fb31a80f0372666efc92defde3707b499ba000e9
- 如果忘记 token,可在 Master 上重新生成:
kubeadm token create --print-join-command
⚠️ Node 节点上使用 kubectl
默认 Node 节点没有 kubectl 配置,若想在 Node 上执行 kubectl get nodes,需要配置环境变量:
bash
echo "export KUBECONFIG=/etc/kubernetes/kubelet.conf" >> /etc/profile
source /etc/profile
(非必需,日常管理均在 Master 进行即可)
9️⃣ 验证集群
✅ 查看节点状态
bash
kubectl get nodes -o wide
预期输出:
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 10m v1.20.9
k8s-node1 Ready <none> 5m v1.20.9
k8s-node2 Ready <none> 5m v1.20.9
✅ 查看系统 Pod 状态
bash
kubectl get pods -n kube-system
所有 Pod 都应处于 Running 状态(coredns 可能稍慢)。
✅ 部署一个测试 Nginx
bash
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx
通过任意节点 IP + NodePort 访问,看到 Nginx 欢迎页即成功。
🧹 常见问题与解决
| 现象 | 可能原因及解决 |
|---|---|
kubectl 报错 localhost:8080 refused |
未配置 ~/.kube/config,按 第6步 配置即可 |
coredns 一直 Pending |
网络插件未部署或 podCIDR 冲突,重新安装 Calico |
Node 一直 NotReady |
检查 kubelet 日志:journalctl -xeu kubelet,多为网络问题 |
kubeadm init 拉取镜像失败 |
手动拉取(参见第4步),或检查 Docker 镜像加速器是否生效 |
Calico Pod 报 BGP not established |
多网卡环境需在 calico.yaml 中设置 IP_AUTODETECTION_METHOD |
📚 总结
本文详细记录了使用 kubeadm 在 CentOS 7 上部署 Kubernetes v1.20.9 集群的全过程,关键点包括:
- 关闭 swap、SELinux、firewalld
- 配置 Docker 使用 systemd cgroup 驱动
- 使用阿里云镜像仓库加速组件拉取
- 安装 Calico 网络插件解决多网卡问题
- 使用
kubeadm init/join快速建立集群
按照以上步骤操作后,你将得到一个生产可用的 K8s 集群,可用于后续的学习或工作负载部署。
🚀 下一步建议:
- 部署 Ingress Controller(如 Nginx Ingress)
- 安装 Dashboard 图形化管理界面
- 配置 StorageClass 实现持久化存储
参考文档