3、Kubernetes集群搭建:使用kubeadm搭建高可用集群、集群网络配置(Calico/Flannel)
好,咱们进入实战环节。搭建K8s集群,是每个云原生工程师的必修课。我个人习惯用kubeadm,它把很多复杂步骤封装好了,但坑也不少。今天咱们就把它彻底讲透。
3.1 环境准备:别在起跑线上摔倒
先说说硬件。我建议至少准备三台机器,2C4G起步。操作系统我用Ubuntu 20.04或CentOS 7.9,这两个版本我踩过的坑最少。
开始前,先做几件事:
- 关闭swap:
swapoff -a,然后注释掉/etc/fstab里的swap行 - 开启内核模块:
overlay和br_netfilter - 设置iptables:让桥接流量走iptables
# 一键搞定
cat <
嗯,这里要注意:br_netfilter加载后,用lsmod | grep br_netfilter确认一下。我曾经在云服务器上遇到过这个模块没加载成功,结果Pod网络死活不通。
3.2 安装容器运行时:选containerd还是Docker?
K8s从1.24开始就弃用Docker了。我个人推荐用containerd,它更轻量,也是CNCF毕业项目。
# 安装containerd
sudo apt-get update
sudo apt-get install -y containerd
# 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 关键一步:修改cgroup驱动为systemd
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
3.3 安装kubeadm、kubelet、kubectl
这三个组件版本必须一致。我习惯用阿里云镜像源,国内下载快很多。
# 添加K8s源
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet=1.28.0-00 kubeadm=1.28.0-00 kubectl=1.28.0-00
sudo apt-mark hold kubelet kubeadm kubectl
为什么要apt-mark hold?说白了就是锁住版本。你想想看,生产环境最怕什么?最怕意外升级。我有个同事没锁版本,结果第二天集群自动升级了,所有Pod都挂了。
3.4 使用kubeadm初始化控制平面
这是搭建高可用集群的关键。我们先在第一个控制节点上执行初始化。
# 初始化控制平面
sudo kubeadm init \
--apiserver-advertise-address=192.168.1.10 \
--control-plane-endpoint=192.168.1.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--upload-certs
这里有几个参数要解释一下:
--apiserver-advertise-address:本机IP,用于API Server通信--control-plane-endpoint:高可用VIP或负载均衡地址--upload-certs:自动分发证书,省去手动拷贝的麻烦
高可用架构要点:
生产环境建议用Keepalived + HAProxy做负载均衡。控制平面至少3个节点,奇数个才能保证etcd选举不出问题。
初始化成功后,会输出一段kubeadm join命令,记得保存好。我习惯把它存到/root/cluster-join.sh里。
3.5 添加工作节点
工作节点加入集群很简单,就是执行刚才保存的join命令。
# 在工作节点上执行
sudo kubeadm join 192.168.1.100:6443 --token xxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx
如果token过期了,可以用kubeadm token create --print-join-command重新生成。嗯,这个我经常用,因为有时候节点加不进去,重新生成token往往能解决问题。
3.6 集群网络配置:Calico vs Flannel
网络插件是K8s集群的血管。没有它,Pod之间无法通信。我主要用两种:Calico和Flannel。
| 特性 | Calico | Flannel |
|---|---|---|
| 性能 | 高(使用eBPF) | 中等 |
| 网络策略 | 原生支持 | 需额外插件 |
| 复杂度 | 较高 | 简单 |
| 适用场景 | 生产环境、大规模 | 开发测试、小规模 |
3.7 安装Calico
我个人偏爱Calico,因为它自带网络策略功能,而且性能好。
# 下载Calico清单
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O
# 如果Pod网段不是10.244.0.0/16,需要修改
# 找到CALICO_IPV4POOL_CIDR,改成你的Pod网段
kubectl apply -f calico.yaml
安装后,用kubectl get pods -n kube-system查看calico-node是否Running。我曾经遇到过Pod一直CrashLoopBackOff,后来发现是BGP模式没配置对。如果你用云服务器,建议把Calico改成IPIP模式。
3.8 安装Flannel
Flannel就简单多了,一条命令搞定。
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
但要注意,Flannel默认使用10.244.0.0/16网段。如果你的--pod-network-cidr不是这个,需要下载清单后修改net-conf.json里的Network字段。
3.9 验证集群状态
装完网络插件后,验证一下集群是否正常。
# 查看节点状态
kubectl get nodes
# 查看系统Pod
kubectl get pods -n kube-system
# 创建一个测试Pod
kubectl run test-pod --image=nginx
# 查看Pod是否能正常调度
kubectl get pods -o wide
如果所有节点都是Ready状态,系统Pod都Running,那恭喜你,集群搭建成功了。
3.10 常见问题与排错
最后分享几个我踩过的坑:
- 节点NotReady:先看
kubectl describe node,多半是网络插件没装好 - CoreDNS一直Pending:检查Pod网段是否和宿主机网段冲突
- kubelet报错:看
journalctl -u kubelet -f,cgroup驱动不一致是常见原因
好了,这一章的内容就到这里。集群搭好了,下一章咱们聊聊怎么管理Pod和Deployment。记住:基础打牢了,后面才能跑得快。