kubeadm部署Kubernetes集群实战指南

📅 2026/7/26 10:08:06
kubeadm部署Kubernetes集群实战指南
1. 为什么选择kubeadm部署Kubernetes集群在容器编排领域摸爬滚打多年我见证过各种Kubernetes部署方式的兴衰。kubeadm这个官方工具的出现彻底改变了我们部署生产级集群的方式。记得最早用二进制手动部署时光etcd集群配置就能写满三页A4纸现在用kubeadm init一句命令就能搞定控制平面这种进步简直让人热泪盈眶。kubeadm的核心价值在于它完美平衡了简易性和可定制性。对于刚接触K8s的新手它能快速搭建符合官方最佳实践的集群对于老手又可以通过配置文件精细控制每个组件的参数。我经手过的几十个集群部署案例中90%的生产环境最终都选择了kubeadm方案。2. 部署前的关键准备工作2.1 硬件资源规划实战心得很多教程只告诉你至少2核4G但真实生产环境要考虑的远不止这些。根据我的踩坑经验控制节点真正吃资源的是etcd当集群规模超过50个节点时etcd的SSD磁盘IOPS至少要保证3000以上。有次客户用了普通云盘集群在高峰期直接雪崩最后是靠临时升级到NVMe才救回来。工作节点除了CPU/内存更要关注网络带宽。一个Pod突发流量打满千兆网卡时整台机器的其他Pod都会遭殃。现在我的团队标配都是万兆网卡流量整形规则。系统盘/var/lib/docker一定要单独挂盘有次客户把docker和业务日志放一起磁盘写满导致kubelet失联整个节点被标记NotReady。2.2 操作系统调优清单这些参数都是血泪教训换来的建议直接写入/etc/sysctl.d/k8s.conf# 解决TIME_WAIT堆积导致连接耗尽 net.ipv4.tcp_tw_reuse 1 # 避免swap引发的性能抖动 vm.swappiness 0 # 容器环境下必须调大 fs.inotify.max_user_watches 1048576 # 防止kube-proxy的conntrack表爆满 net.netfilter.nf_conntrack_max 1048576重要提示修改完必须执行sysctl -p生效我曾经遇到过节点重启后参数丢失的坑现在都会在crontab里加个每分钟检查的脚本。3. 分步部署全流程详解3.1 安装容器运行时那些坑虽然Docker已经退役但containerd的配置复杂度高了不少。这是我验证过的安装脚本# 安装containerd cat EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter # 关键配置调整cgroup驱动为systemd cat EOF | sudo tee /etc/containerd/config.toml version 2 [plugins.io.containerd.grpc.v1.cri] sandbox_image registry.k8s.io/pause:3.6 [plugins.io.containerd.grpc.v1.cri.containerd] default_runtime_name runc [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc] runtime_type io.containerd.runc.v2 [plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] SystemdCgroup true EOF启动后务必检查cgroup驱动containerd config dump | grep SystemdCgroup如果看到false说明配置没生效kubelet会报错。3.2 kubeadm init的隐藏技巧官方文档不会告诉你的实战经验离线环境部署先拉取镜像到本地kubeadm config images pull --image-repositoryyour-private-registry定制证书有效期默认1年太短生产环境建议10年kubeadm init --apiserver-cert-extra-sansyour-domain.com \ --cert-duration87600h \ --control-plane-endpointLB_IP:6443关键配置文件生成完整配置再修改kubeadm config print init-defaults kubeadm.yaml # 修改networking.podSubnet和kubernetesVersion等字段 kubeadm init --configkubeadm.yaml4. 网络插件选型与排错4.1 Calico实战配置示例这是经过生产验证的calico.yaml修改点apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: calicoNetwork: ipPools: - cidr: 192.168.0.0/16 natOutgoing: true encapsulation: VXLANCrossSubnet # 混合云环境用这个 nodeAddressAutodetectionV4: interface: eth.*|en.* # 避免选到docker网卡部署后检查watch -n 1 calicoctl node status4.2 网络问题排查三板斧检查IP分配kubectl get pods -n kube-system -o wide | grep -v Running追踪路由路径kubectl run -it --rm debug --imagenicolaka/netshoot -- bash curl -I service-ip traceroute pod-ip抓包分析kubectl sniff pod-name -n namespace -o - | wireshark -k -i -5. 高可用方案深度解析5.1 负载均衡器配置要点用nginx实现API Server负载均衡的黄金配置stream { upstream kube-apiserver { server 10.0.0.1:6443 max_fails3 fail_timeout5s; server 10.0.0.2:6443 max_fails3 fail_timeout5s; server 10.0.0.3:6443 max_fails3 fail_timeout5s; } server { listen 6443; proxy_pass kube-apiserver; proxy_timeout 10m; proxy_connect_timeout 1s; } }血泪教训一定要配置健康检查有次LB没配健康检查某个apiserver挂掉后流量还在往那打导致集群间歇性失联。5.2 etcd集群调优参数在/etc/kubernetes/manifests/etcd.yaml中添加spec: containers: - command: - etcd - --heartbeat-interval500 - --election-timeout2500 - --snapshot-count10000 - --max-request-bytes157286400 - --quota-backend-bytes8589934592这些参数经过我们百节点集群验证心跳间隔从默认100ms调到500ms减少网络压力选举超时适当延长避免网络抖动引发频繁选举后端存储配额8GB防止OOM6. 必须掌握的运维技巧6.1 证书自动续期方案在/etc/kubernetes/kubelet.conf添加rotateCertificates: true serverTLSBootstrap: true然后创建自动批准CSR的ClusterRolekubectl create clusterrolebinding auto-approve-csr \ --clusterrolesystem:certificates.k8s.io:certificatesigningrequests:nodeclient \ --userkubelet-bootstrap6.2 关键监控指标清单这些Prometheus指标必须监控指标名称报警阈值说明apiserver_request_duration_seconds1s P99API响应延迟etcd_wal_fsync_duration_seconds0.5s磁盘写入性能kubelet_pleg_relist_duration5sPod生命周期事件延迟scheduler_pending_pods10持续5分钟调度队列积压配置示例- alert: HighAPILatency expr: histogram_quantile(0.99, sum(rate(apiserver_request_duration_seconds_bucket[5m])) by (le)) 1 for: 5m7. 升级集群的避坑指南7.1 原地升级操作流程先排空节点kubectl drain node --ignore-daemonsets --delete-emptydir-data升级kubeadmapt-get update apt-get install -y kubeadm1.28.3-00检查升级计划kubeadm upgrade plan执行升级kubeadm upgrade apply v1.28.3关键点一定要先升级kubeadm再升级集群有次客户顺序搞反了导致集群配置全部重置。7.2 版本回退应急预案提前准备好回退脚本# 回退kubelet systemctl stop kubelet apt-get install -y kubelet1.27.5-00 kubectl1.27.5-00 systemctl daemon-reload systemctl restart kubelet # 回退控制平面 kubeadm upgrade apply v1.27.5 --force8. 安全加固最佳实践8.1 RBAC最小权限配置这个Role定义能挡住90%的越权风险apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: production name: app-developer rules: - apiGroups: [] resources: [pods, pods/log] verbs: [get, list, watch] - apiGroups: [apps] resources: [deployments] verbs: [get, list, patch]8.2 网络策略实战模板限制default命名空间所有Pod只能访问特定服务apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-all spec: podSelector: {} policyTypes: - Ingress - Egress egress: - to: - namespaceSelector: matchLabels: role: database ports: - protocol: TCP port: 54329. 性能调优黄金参数9.1 kubelet内存管理配置在/var/lib/kubelet/config.yaml中添加memoryManagerPolicy: Static reservedSystemCPUs: 0-1 kubeReserved: cpu: 500m memory: 1Gi systemReserved: cpu: 1000m memory: 2Gi evictionHard: memory.available: 500Mi9.2 调度器性能优化修改/etc/kubernetes/manifests/kube-scheduler.yamlspec: containers: - command: - kube-scheduler - --percentage-of-nodes-to-score50 - --pod-max-inUnschedulable-pods-duration5m - --bind-timeout30s这些参数特别适合大集群节点评分采样率降到50%减少计算开销Pod最长排队时间5分钟避免无限等待绑定超时30秒快速失败重试10. 灾备方案设计要点10.1 etcd定期备份脚本ETCDCTL_API3 etcdctl \ --endpointshttps://127.0.0.1:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/server.crt \ --key/etc/kubernetes/pki/etcd/server.key \ snapshot save /backup/etcd-$(date %Y%m%d).db设置crontab每周执行0 3 * * 6 root /usr/local/bin/etcd-backup.sh10.2 集群状态快照方案全量备份关键资源kubectl get all,cm,secret,ingress,pv,pvc,sc -A -o yaml cluster-snapshot-$(date %Y%m%d).yaml恢复时先检查资源kubectl apply -f cluster-snapshot.yaml --dry-runserver