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)
🧭 整体搭建流程图
1️⃣ 所有节点安装 Docker(v20.10.7)
Kubernetes 1.20 要求 Docker 版本在 20.10 左右,我们统一安装20.10.7。
# 卸载旧版dockersudoyum remove-ydocker*2>/dev/null# 安装依赖工具sudoyuminstall-yyum-utils# 添加阿里云Docker仓库sudoyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安装指定版本sudoyuminstall-ydocker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6# 启动docker并设置开机自启sudosystemctlenabledocker--now# 配置镜像加速器 + cgroup驱动(重要)sudomkdir-p/etc/dockersudotee/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" } EOFsudosystemctl daemon-reloadsudosystemctl restartdocker# 验证 docker 版本dockerversion💡为什么设置
native.cgroupdriver=systemd?
Kubernetes 推荐使用systemd作为 cgroup 驱动,否则 kubelet 启动可能报错。
2️⃣ 所有节点基础环境配置
以下步骤需要在三台机器上分别执行。
2.1 关闭防火墙与 SELinux
systemctl stop firewalld systemctl disable firewalld setenforce0sed-i's/^SELINUX=enforcing$/SELINUX=permissive/'/etc/selinux/config2.2 关闭 Swap(K8s 必须)
swapoff-ased-ri's/.*swap.*/#&/'/etc/fstab# 重启后执行 free -m 确认 swap 为 0reboot2.3 设置主机名 & hosts 解析
# 分别在三台机器上执行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 EOF2.4 允许桥接流量(K8s 网络要求)
cat<<EOF|sudotee/etc/modules-load.d/k8s.confbr_netfilter EOFcat<<EOF|sudotee/etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOFsudosysctl--system2.5 时间同步(避免证书错误)
yuminstall-yntpdate ntpdate time.windows.com# 可加入 crontab 定时同步3️⃣ 所有节点安装 kubelet/kubeadm/kubectl
使用阿里云镜像仓库安装v1.20.9版本。
# 添加K8s阿里云yum源cat<<EOF|sudotee/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# 安装指定版本sudoyuminstall-ykubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9# 启动kubelet(此时会失败,因为还没初始化,但需要启用)sudosystemctlenable--nowkubelet⚠️ 此时
kubelet可能反复重启,是正常的,等 Master 初始化后会恢复正常。
4️⃣ Master 节点预拉取镜像
为了避免初始化时因国外镜像卡住,我们先从阿里云镜像仓库拉取所需镜像。
创建并执行以下脚本:
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 EOFchmod+x ./images.sh&&./images.sh5️⃣ 初始化 Master 节点
仅在k8s-master上执行,注意修改--apiserver-advertise-address为你的 Master 实际内网 IP。
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❌ 如果初始化失败
执行以下清理命令后再尝试:
kubeadm resetrm-rf/etc/cni/net.d$HOME/.kube/config iptables-F&&iptables-X&&iptables-tnat-F&&iptables-tnat-X6️⃣ 配置 kubectl(Master 节点)
mkdir-p$HOME/.kubesudocp-i/etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g)$HOME/.kube/config# 测试命令kubectl get nodes# 此时应该只看到一个 master 节点,状态为 NotReady(缺少网络插件)7️⃣ 安装 Calico 网络插件
# 下载 Calico v3.20 资源文件curlhttps://docs.projectcalico.org/archive/v3.20/manifests/calico.yaml-O# 如果你的机器有多个网卡(比如 NAT + 桥接),需要指定网卡接口名(如 ens33)# 编辑 calico.yaml,找到以下环境变量,取消注释并修改:# - name: IP_AUTODETECTION_METHOD# value: "interface=ens33"# 应用 Calicokubectl apply-fcalico.yaml等待约 2~3 分钟,再次查看节点状态:
kubectl get nodes# 应该变为 Ready 状态📌如何查看节点使用的网卡名?执行
ip a或ifconfig,一般虚拟机网卡名为ens33、eth0等。
8️⃣ Node 节点加入集群
在每个 Node 节点上执行 Master 初始化完成后输出的kubeadm join命令,例如:
kubeadmjoink8s-master:6443--token50rexj.yb0ys92ynnxxbo2s\--discovery-token-ca-cert-hash sha256:10fd9d2a9f4e2d7dff502aa3fb31a80f0372666efc92defde3707b499ba000e9- 如果忘记 token,可在 Master 上重新生成:
kubeadm token create --print-join-command
⚠️ Node 节点上使用 kubectl
默认 Node 节点没有kubectl配置,若想在 Node 上执行kubectl get nodes,需要配置环境变量:
echo"export KUBECONFIG=/etc/kubernetes/kubelet.conf">>/etc/profilesource/etc/profile(非必需,日常管理均在 Master 进行即可)
9️⃣ 验证集群
✅ 查看节点状态
kubectl get nodes-owide预期输出:
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 状态
kubectl get pods-nkube-system所有 Pod 都应处于Running状态(coredns 可能稍慢)。
✅ 部署一个测试 Nginx
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实现持久化存储
参考文档
- Kubernetes 官方文档
- Calico 文档
- 阿里云 Kubernetes 镜像仓库
