4. Kubernetes集群搭建:使用kubeadm搭建生产级集群、高可用架构设计
说实话,很多人在学Kubernetes时,第一步就被集群搭建劝退了。我当年也一样,看着官方文档里密密麻麻的步骤,心里直打鼓。但后来我发现,只要理解了kubeadm的设计思路,搭建过程其实挺顺的。今天我就把生产级集群的搭建经验掰开揉碎讲给你听。
4.1 为什么选择kubeadm?
kubeadm是Kubernetes官方推荐的集群搭建工具。它不像二进制部署那样繁琐,也不像minikube那样玩具化。说白了,它就是为生产环境设计的——既能保证组件的正确配置,又保留了足够的定制空间。
我在项目中遇到过不少团队,一开始图省事用一键部署脚本,结果到了生产环境各种踩坑。后来都老老实实换回了kubeadm。为什么?因为kubeadm生成的配置是标准化的,出了问题社区里一搜就有答案。
核心优势:
- 官方维护,版本迭代同步
- 支持高可用架构
- 证书自动管理
- 配置可审计、可回溯
4.2 环境准备:别在这些细节上翻车
嗯,这里要注意,环境准备是翻车重灾区。我见过有人因为hostname没配好,折腾了一整天。
4.2.1 节点规划
生产环境我建议至少准备3台master节点和3台worker节点。你想想看,如果只有2台master,etcd集群脑裂的风险就很高。我个人习惯用奇数节点,这样选主时不容易出问题。
| 角色 | 推荐配置 | 数量 |
|---|---|---|
| Master节点 | 4C8G, 100G SSD | 3 |
| Worker节点 | 8C16G, 200G SSD | 3+ |
| 负载均衡器 | 2C4G | 2 |
4.2.2 系统初始化
所有节点都要做这几步,少一步后面都可能出幺蛾子:
# 关闭swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
我曾经踩过的坑:忘记关闭swap,结果kubelet启动失败,报错信息还特别隐晦。排查了半天才发现是swap没关。所以建议你把这步写在checklist里,每次部署前逐项核对。
4.3 容器运行时安装:containerd实战
Docker虽然好用,但Kubernetes从1.24开始就弃用dockershim了。现在主流的选择是containerd。我推荐用containerd,它比CRI-O生态更成熟,比Docker更轻量。
# 安装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
# 关键配置:使用systemd cgroup驱动
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# 重启服务
sudo systemctl restart containerd
sudo systemctl enable containerd
小技巧:配置完containerd后,记得用crictl info检查一下。如果输出里显示systemdCgroup: true,说明配置生效了。这一步很多人会漏掉,等到kubelet报错才回头查。
4.4 安装kubeadm、kubelet、kubectl
这三个组件要一起装,版本必须一致。我习惯用阿里云的镜像源,国内下载速度快很多。
# 添加Kubernetes仓库
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo 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
# 安装指定版本(以1.28为例)
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
为什么要hold住版本?因为生产环境最怕版本不一致。我曾经见过一个团队,某天apt upgrade后kubelet自动升级了,结果和集群其他节点版本不匹配,整个集群都受影响。从那以后,我所有生产节点都锁版本。
4.5 高可用架构设计:不只是堆机器
高可用不是简单地把master节点堆到3台就完事了。这里有几个关键点要搞清楚。
4.5.1 控制平面高可用
Kubernetes控制平面的核心是etcd和API Server。etcd用Raft协议保证一致性,API Server通过负载均衡对外提供服务。
我个人习惯用HAProxy + Keepalived做API Server的负载均衡。Nginx也可以,但HAProxy在四层负载均衡上性能更好。
# HAProxy配置示例(/etc/haproxy/haproxy.cfg)
frontend kubernetes-frontend
bind *:6443
mode tcp
option tcplog
default_backend kubernetes-backend
backend kubernetes-backend
mode tcp
option tcp-check
balance roundrobin
server master1 192.168.1.11:6443 check fall 3 rise 2
server master2 192.168.1.12:6443 check fall 3 rise 2
server master3 192.168.1.13:6443 check fall 3 rise 2
关键点:负载均衡器本身也要高可用。Keepalived的VIP漂移时间建议设为2秒以内,这样API Server的切换对客户端几乎是透明的。
4.5.2 etcd集群部署
etcd是Kubernetes的"数据库",它的稳定性直接决定集群的可用性。我建议把etcd单独部署在master节点上,不要和业务容器混跑。
# 在第一个master节点初始化
sudo kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:6443" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=MASTER1_IP
# 其他master节点加入
sudo kubeadm join LOAD_BALANCER_DNS:6443 --token xxx \
--discovery-token-ca-cert-hash sha256:xxx \
--control-plane --certificate-key xxx
注意:etcd的磁盘性能很关键。我建议用SSD,并且单独挂载。如果用的是云盘,选IOPS高的类型。etcd对延迟特别敏感,磁盘慢了整个集群都会受影响。
4.6 网络插件选择:CNI的学问
网络插件是集群搭建的最后一步,也是最容易出问题的一步。主流选择有Calico、Flannel、Cilium。我推荐Calico,它支持网络策略,性能也不错。
# 安装Calico
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26/manifests/calico.yaml
# 检查Pod状态
kubectl get pods -n kube-system -l k8s-app=calico-node
安装完成后,用kubectl get nodes检查节点状态。如果所有节点都变成Ready,恭喜你,集群搭建成功了。
4.7 验证集群:别急着上线
集群搭建完,我建议先跑一轮验证,确保所有功能正常。
- 节点状态检查:所有节点Ready,版本一致
- 核心组件检查:coredns、kube-proxy等Pod正常运行
- etcd健康检查:
etcdctl endpoint health返回正常 - 调度测试:部署一个nginx,确认能正常调度到worker节点
- 高可用测试:手动停掉一个master节点,看集群是否正常工作
我的经验:高可用测试一定要做,而且要在业务低峰期做。我第一次做测试时,停掉一个master节点后,发现API Server的响应时间从10ms飙到了200ms。排查后发现是负载均衡器的健康检查间隔设置太长。调整后就好了。
4.8 生产环境建议
最后,分享几个生产环境的实用建议:
- 证书管理:kubeadm默认证书有效期1年,记得提前规划续期
- 日志收集:建议用EFK或Loki,别等到出问题才想起来看日志
- 监控告警:Prometheus + Grafana是标配,etcd的监控指标尤其重要
- 备份策略:etcd定期备份,建议每小时一次,保留7天
搭建生产级Kubernetes集群,说白了就是要把每个细节都做到位。别想着一步到位,先搭一个最小可用集群,然后逐步完善。我见过太多人一开始就想搞个"完美"集群,结果卡在某个细节上出不来。记住,先跑起来,再优化。