如何使用kubeadm创建一个生产环境的Kubernetes(k8s)集群?

问题浏览数Icon
25
问题创建时间Icon
2025-05-25 20:34:00
回答 | 共 6 个
作者头像
sunwei77
  1. 环境准备

    • 确保所有节点(控制平面和Worker)满足最低配置(推荐2核4GB+,SSD磁盘),使用Ubuntu/CentOS等稳定OS版本。
    • 禁用Swap,配置防火墙规则(6443、2379-2380等端口),同步时间(NTP)。
  2. 容器运行时

    • 安装containerd(推荐)或CRI-O,配置cgroup驱动为systemd,确保与kubelet兼容。
  3. 安装kubeadm/kubelet/kubectl

    • 使用官方仓库添加包源,安装指定版本(生产环境需锁定版本,如1.28.x)。
  4. 初始化控制平面(HA)

    • 使用kubeadm init --control-plane-endpoint=<负载均衡器IP/DNS> --pod-network-cidr=<CIDR> --upload-certs
    • 配置外部etcd集群或堆叠式HA拓扑,通过--config指定YAML配置文件精细化参数。
  5. 网络插件

    • 部署Calico/Flannel等CNI插件,启用NetworkPolicy(生产环境必备)。
  6. 加入Worker节点

    • 使用kubeadm join命令并附带discovery-token,确保TLS通信安全。
  7. 生产加固

    • 启用PodSecurity admission(替代PSP),配置RBAC最小权限,加密Secret(--encrypt-provider-config)。
    • 部署metrics-server、集群自动扩缩容(CA)、启用Audit Log。
  8. 持久化与存储

    • 集成CSI驱动(如AWS EBS/Google PD),创建StorageClass启用动态供应。
  9. 备份与灾备

    • 定期备份etcd(使用etcdctl snapshot save),配置Velero实现应用级容灾。
  10. 监控告警

    • 部署Prometheus-Operator+AlertManager,配置关键指标(API Server延迟、节点状态)告警。

验证命令

kubectl get nodes -o wide
kubectl get componentstatuses
kubectl -n kube-system get pods
作者头像
yunshang11

先准备好几台服务器,装好Docker和kubeadm。主节点跑kubeadm init时记得加上--control-plane-endpoint配负载均衡IP,这样后面加控制节点方便。etcd最好用独立集群别和master放一起。网络插件选Calico或Cilium自己挑,装完一定要检查pod通信。工作节点用kubeadm join加入后,记得打上节点标签。生产环境记得开RBAC,配好证书轮换,还有metrics-server监控不能少。存储用云盘的话提前装好CSI驱动,最后用kube-vip或者云厂商的LB暴露API Server。

作者头像
sunming77

作为IT经理,部署生产级Kubernetes集群需遵循以下关键步骤与最佳实践:

  1. 基础设施准备

    • 节点配置:Master节点至少2核4GB(推荐4核8GB+),Worker节点按负载扩展;使用稳定Linux发行版(如Ubuntu LTS/CentOS)并禁用Swap。
    • 网络要求:确保6443(API)、2379-2380(etcd)、10250(kubelet)等端口开放,Pod/Service网段不冲突(如10.244.0.0/16 + 10.96.0.0/12)。
  2. 运行时与工具安装

    • 容器运行时:安装containerd v1.6+或Docker CE 20.10+,配置systemd驱动与国内镜像加速。
    • 安装kubeadm/kubelet/kubectl v1.27+,通过阿里云或官方源加速下载。
  3. 集群初始化

    • Master节点:
      kubeadm init --image-repository registry.aliyuncs.com/google_containers \
      --pod-network-cidr=10.244.0.0/16 \
      --control-plane-endpoint="LOAD_BALANCER_IP:6443"
    • 部署CNI插件(Calico/Flannel),保存kubeadm join命令。
  4. 高可用架构

    • 使用3+Master节点实现HA,通过keepalived+HAProxy或云厂商LB暴露API Server。
    • 堆叠式etcd模式:通过kubeadm join --control-plane扩展Master节点。
  5. 安全加固

    • 启用RBAC,限制ServiceAccount权限。
    • 使用cert-manager自动更新证书,配置PodSecurity Admission。
    • 审计日志:启用API Server审计策略并对接SIEM系统。
  6. 存储与网络优化

    • 部署CSI插件(如Rook/Ceph、AWS EBS),配置StorageClass。
    • 通过Cilium NetworkPolicy实施微隔离,启用IPVS模式提升Service性能。
  7. 监控与运维

    • 部署Prometheus Operator + Grafana监控集群指标。
    • 使用Loki + Promtail收集日志,Velero定期备份。
    • 制定滚动升级策略:kubeadm upgrade plan验证版本兼容性,逐个节点升级。

生产检查清单

  • [ ] 所有节点时间同步(chrony/NTP)
  • [ ] etcd数据每日备份
  • [ ] 配置HPA/VPA自动扩缩容
  • [ ] 测试节点故障自愈能力
  • [ ] 启用ingress-controller并配置WAF

注:建议通过Terraform+Ansible实现基础设施即代码(IaC),结合GitOps工具(如Argo CD)实现配置版本化管理。

作者头像
dodo9999

使用kubeadm初始化控制平面,配置高可用架构并安装CNI插件,确保节点安全组策略与证书轮换机制,参考官方文档配置生产级参数。

作者头像
smalltree01

作为虚拟化架构师,我在生产环境中使用kubeadm部署Kubernetes集群的核心经验如下:

  1. 系统准备

    • 选择稳定OS(如CentOS 7+或Ubuntu 20.04+),禁用swap,同步时间,配置防火墙放行6443/2379等关键端口。
    • 容器运行时优先选择containerd而非Docker,需验证与Kubernetes版本兼容性(如v1.24+需containerd 1.6.4+)。
  2. kubeadm初始化

    • 生成配置文件:kubeadm config print init-defaults > init.yaml,需修改controlPlaneEndpoint指向负载均衡IP,配置podSubnet/serviceSubnet。
    • 关键初始化命令:kubeadm init --config=init.yaml --upload-certs,常见报错包括证书SAN缺失、Cgroup驱动不匹配(需对齐containerd配置中的systemd驱动)。
  3. 高可用实现

    • 多控制平面:通过kubeadm join添加新控制节点时指定--control-plane --certificate-key,需配合HAProxy/keepalived实现VIP。
    • etcd集群:生产环境建议独立部署etcd集群(非堆叠式),避免与控制平面资源竞争。
  4. 网络与存储

    • CNI插件选择Calico时需注意IPIP模式性能损耗,生产环境建议切换为BGP模式或Cilium。
    • 存储类配置需提前测试CSI驱动(如Rook/Ceph),注意mountPropagation等参数对StatefulSet的影响。
  5. 安全加固

    • 强制启用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实现节点弹性扩展。

作者头像
novadive66

使用kubeadm部署生产级Kubernetes集群需重点关注稳定性、安全性和高可用性,建议按以下步骤实施:

  1. 架构设计:至少3个控制平面节点(堆叠etcd模式或独立etcd集群),工作节点按业务负载横向扩展,所有节点使用专用SSD磁盘
  2. 系统加固:禁用swap、配置sysctl内核参数、启用时间同步、安装HIDS监控
  3. 证书管理:通过kubeadm init phase certs生成10年有效期证书,或集成企业CA体系
  4. 高可用控制平面:使用Keepalived+HAProxy实现API Server负载均衡,--control-plane-endpoint指向VIP
  5. 安全配置:启用PodSecurityPolicy/Admission控制器,配置networkpolicy,限制kubelet匿名访问
  6. 生产级CNI:采用Calico with eBPF或Cilium,支持网络策略和IPAM固定
  7. 持久化存储:部署CSI驱动(如Rook/Ceph或云厂商CSI),配置StorageClass和VolumeSnapshot
  8. 灾备方案:使用etcdctl定期snapshot备份,配置velero实现集群级应用备份
  9. 监控体系:部署kube-prometheus-stack并配置Alertmanager规则,关键指标包括apiserver延迟、etcd写入延迟、节点内存压力 建议通过GitOps(如ArgoCD)管理集群配置,并建立滚动升级机制,每次升级前使用kubeadm upgrade plan验证兼容性。