3、Kubernetes集群搭建:使用kubeadm搭建高可用集群、集群网络配置(Calico/Flannel)

好,咱们进入实战环节。搭建K8s集群,是每个云原生工程师的必修课。我个人习惯用kubeadm,它把很多复杂步骤封装好了,但坑也不少。今天咱们就把它彻底讲透。

3.1 环境准备:别在起跑线上摔倒

先说说硬件。我建议至少准备三台机器,2C4G起步。操作系统我用Ubuntu 20.04或CentOS 7.9,这两个版本我踩过的坑最少。

⚠️ 重要提醒: 所有节点的主机名不能重复,且必须能互相解析。我见过有人因为hosts文件没配好,折腾了一整天。

开始前,先做几件事:

  • 关闭swap:swapoff -a,然后注释掉/etc/fstab里的swap行
  • 开启内核模块:overlaybr_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
💡 我的经验: cgroup驱动一定要改成systemd。默认的cgroupfs和K8s的kubelet配合不好,容易出诡异问题。

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字段。

⚠️ 避坑指南: 我曾经在生产环境同时装了Calico和Flannel,结果网络全乱了。记住:一个集群只能装一个CNI插件!

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。记住:基础打牢了,后面才能跑得快。

专注资料整理