使用kubeadm从零搭建生产级Kubernetes集群指南
1. Kubernetes集群搭建概述Kubernetes作为容器编排的事实标准已经成为现代云原生应用的核心基础设施。对于刚接触Kubernetes的开发者来说搭建一个可用的集群往往是第一个挑战。本指南将使用kubeadm工具带你从零开始构建一个生产可用的Kubernetes集群。kubeadm是Kubernetes官方推荐的集群引导工具它遵循最佳实践能够创建符合Kubernetes一致性测试的集群。相比其他部署方式kubeadm具有以下优势标准化生成的集群结构与官方文档一致轻量化只包含必要的核心组件可扩展可作为更复杂部署方案的基础2. 环境准备2.1 硬件要求搭建Kubernetes集群前需要准备符合以下要求的机器操作系统兼容deb/rpm的Linux发行版如Ubuntu 20.04或CentOS 7控制平面节点至少2核CPU、2GB内存、30GB磁盘工作节点至少1核CPU、1GB内存、20GB磁盘网络所有节点间需互通建议千兆内网生产环境建议控制平面节点配置4核CPU/8GB内存以上并采用多节点高可用架构2.2 系统配置在所有节点上执行以下基础配置关闭swapsudo swapoff -a sudo sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab设置主机名sudo hostnamectl set-hostname node-name # 如master-node或worker-01配置时间同步sudo timedatectl set-timezone Asia/Shanghai sudo systemctl enable --now chronyd加载内核模块sudo modprobe br_netfilter sudo modprobe overlay echo br_netfilter | sudo tee /etc/modules-load.d/k8s.conf echo overlay | sudo tee -a /etc/modules-load.d/k8s.conf配置内核参数cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF sudo sysctl --system3. 容器运行时安装Kubernetes支持多种容器运行时我们以containerd为例3.1 安装containerd安装依赖sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加Docker仓库sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo安装containerdsudo yum install -y containerd.io配置containerdsudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml sudo sed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.toml启动服务sudo systemctl enable --now containerd3.2 验证安装检查containerd状态sudo systemctl status containerd ctr version4. 安装kubeadm、kubelet和kubectl在所有节点上执行添加Kubernetes仓库cat EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled1 gpgcheck1 repo_gpgcheck1 gpgkeyhttps://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF安装组件sudo yum install -y kubelet kubeadm kubectl --disableexcludeskubernetes启动kubeletsudo systemctl enable --now kubelet5. 初始化控制平面在主节点上执行5.1 初始化集群sudo kubeadm init \ --apiserver-advertise-address主节点IP \ --control-plane-endpoint负载均衡IP或域名 \ --pod-network-cidr10.244.0.0/16 \ --upload-certs \ --kubernetes-versionstable关键参数说明--apiserver-advertise-addressAPI服务器广播地址--control-plane-endpoint高可用集群端点--pod-network-cidrPod网络CIDR需与后续安装的CNI插件匹配5.2 配置kubectlmkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config5.3 安装网络插件以Flannel为例kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml其他可选CNI插件Calico适合需要网络策略的场景Cilium基于eBPF的高性能网络方案Weave Net简单易用的网络方案6. 加入工作节点在每个工作节点上执行kubeadm join命令初始化输出中会显示sudo kubeadm join 控制平面端点:6443 \ --token 令牌 \ --discovery-token-ca-cert-hash sha256:哈希值如果令牌过期可在主节点生成新令牌kubeadm token create --print-join-command7. 验证集群状态在主节点执行以下命令验证集群状态查看节点状态kubectl get nodes -o wide查看Pod状态kubectl get pods -A -o wide检查集群健康状况kubectl get componentstatuses8. 集群配置优化8.1 移除主节点污点默认情况下工作负载不会调度到主节点。如需允许调度kubectl taint nodes --all node-role.kubernetes.io/control-plane-8.2 配置自动补全为bash添加kubectl自动补全echo source (kubectl completion bash) ~/.bashrc8.3 安装Dashboard可选kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml创建访问令牌kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard kubectl create clusterrolebinding dashboard-admin --clusterrolecluster-admin --serviceaccountkubernetes-dashboard:dashboard-admin kubectl -n kubernetes-dashboard create token dashboard-admin9. 常见问题排查9.1 kubelet无法启动检查错误日志journalctl -xeu kubelet常见原因容器运行时未正确安装内核参数未正确配置防火墙阻止通信9.2 Pod网络异常检查CNI插件日志kubectl logs -n kube-system cni-pod-name常见解决方法确认--pod-network-cidr与CNI配置匹配检查节点间网络连通性重启kubelet和容器运行时服务9.3 证书过期问题查看证书有效期kubeadm certs check-expiration更新证书kubeadm certs renew all10. 生产环境建议对于生产环境建议考虑以下增强措施高可用架构部署多个控制平面节点使用外部etcd集群配置负载均衡器安全加固启用RBAC配置网络策略定期轮换证书监控告警部署Prometheus Grafana配置节点和Pod资源监控设置关键事件告警备份恢复定期备份etcd数据测试集群恢复流程文档化运维手册