作为虚拟化架构师,我在生产环境中使用kubeadm部署Kubernetes集群的核心经验如下:
-
系统准备
- 选择稳定OS(如CentOS 7+或Ubuntu 20.04+),禁用swap,同步时间,配置防火墙放行6443/2379等关键端口。
- 容器运行时优先选择containerd而非Docker,需验证与Kubernetes版本兼容性(如v1.24+需containerd 1.6.4+)。
-
kubeadm初始化
- 生成配置文件:
kubeadm config print init-defaults > init.yaml
,需修改controlPlaneEndpoint指向负载均衡IP,配置podSubnet/serviceSubnet。 - 关键初始化命令:
kubeadm init --config=init.yaml --upload-certs
,常见报错包括证书SAN缺失、Cgroup驱动不匹配(需对齐containerd配置中的systemd驱动)。
- 生成配置文件:
-
高可用实现
- 多控制平面:通过
kubeadm join
添加新控制节点时指定--control-plane --certificate-key
,需配合HAProxy/keepalived实现VIP。 - etcd集群:生产环境建议独立部署etcd集群(非堆叠式),避免与控制平面资源竞争。
- 多控制平面:通过
-
网络与存储
- CNI插件选择Calico时需注意IPIP模式性能损耗,生产环境建议切换为BGP模式或Cilium。
- 存储类配置需提前测试CSI驱动(如Rook/Ceph),注意mountPropagation等参数对StatefulSet的影响。
-
安全加固
- 强制启用RBAC,禁用匿名访问(--anonymous-auth=false)
- 使用kube-bench进行CIS基准检测,重点修复如--protect-kernel-defaults等参数缺失问题
实践挑战:
- 证书管理:kubeadm默认证书有效期1年,需通过
kubeadm alpha certs renew
或第三方工具(如cert-manager)自动化续期 - 节点污点处理:生产环境需保留master节点的NoSchedule污点,仅对需要调度的组件(如ingress-controller)使用toleration
- 升级风险:跨版本升级(如1.23→1.25)需严格遵循官方顺序,曾遇到kube-proxy配置突变导致服务中断
- 网络隔离失效:因默认NetworkPolicy未启用,曾发生容器被恶意扫描,后通过Calico的GlobalNetworkPolicy加固
建议补充部署Harbor私有镜像仓库、Prometheus监控套件,并通过Cluster Autoscaler实现节点弹性扩展。