Kubernetes v1.20.9 集群搭建

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 aifconfig,一般虚拟机网卡名为 ens33eth0 等。


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 实现持久化存储

参考文档

相关推荐
LSL666_2 小时前
微服务架构
微服务·云原生·架构
蛐蛐蛐3 小时前
在Windows 11上安装Docker的踩坑记录
运维·docker·容器
AI精钢3 小时前
Hermes Agent 整合 OpenCode CLI 的实战经验
人工智能·云原生·aigc
cyber_两只龙宝3 小时前
【Oracle】Oracle之使用DML语言管理表
linux·运维·服务器·数据库·云原生·oracle
古典和浪漫3 小时前
docker file 中设置软链接和在k8s 中配置同步时区 有什么区别,各自优缺点
docker·容器·kubernetes
成为你的宁宁4 小时前
【K8s ServiceAccount 机制原理与 RBAC 权限实战应用】
云原生·容器·kubernetes
尘世壹俗人4 小时前
知识点12---k8s进阶操作方式yaml资源文件
docker·容器·kubernetes
尘世壹俗人4 小时前
知识点13---k8s存储持久化
容器·kubernetes·flask
SilentSamsara4 小时前
Kubernetes 网络模型:CNI 插件与 Pod 间通信的底层实现
网络·云原生·容器·架构·kubernetes·k8s