kubeadm搭建K8S集群完整实战指南

kubeadm搭建K8S集群完整实战指南 从零到一kubeadm 搭建 Kubernetes 集群完整实战指南1.23.17 版本导读Kubernetes 作为容器编排领域的事实标准已成为运维工程师的必备技能。本文以生产环境推荐的1.23.17 版本最后一个默认支持 Docker 运行时的版本为例从集群架构、环境准备、组件部署到业务上线的全流程手把手带你完成一套完整的 K8S 集群搭建。所有步骤均经过生产验证可直接复用。一、为什么选择 1.23.17 版本在动手之前先聊聊版本选择的问题。很多初学者一上来就装最新版但实际工作中更看重的是稳定性。版本Docker 支持说明1.23.17默认支持官方最后一个默认支持 Docker 的版本生产环境首选1.24弃用 Docker需手动部署 cri-dockerd不推荐1.24默认 ContainerdCNCF 官方推荐性能更优生产建议如果公司已有 K8S 环境直接用现有版本运维即可没必要折腾升级。如果是新部署1.23.17 和 Containerd 运行时都是稳定的选择。二、理解 K8S 集群架构动手之前先理解架构才能知其所以然。K8S 集群分为两层2.1 Control Plane控制平面 / Master组件端口作用etcd2379/2380Key-Value 数据库存储集群所有数据api-server6443HTTPS集群统一入口所有组件通信都经过它scheduler10259调度器决定 Pod 运行在哪个节点controller-manager10257控制器管理者维护集群期望状态2.2 Worker Node工作节点组件端口作用kubelet10250管理 Pod 生命周期上报节点状态kube-proxy10256代理 Pod 请求实现负载均衡和服务发现2.3 CNI容器网络接口负责跨节点 Pod 网络通信常见插件Flannel、Calico、Cilium。2.4 三种网络类型K8S 集群需要规划三个独立的网段避免地址冲突物理机网络10.0.0.0/24 ← 节点间通信 Pod 网络 10.100.0.0/16 ← 跨节点 Pod 通信最多 65536 个 IP Service 网络10.200.0.0/16 ← 服务发现与负载均衡排坑提醒Pod 网段规划时一定要考虑未来容量。如果容器数量可能超过 65536应该用/8网段如10.100.0.0/8。三、环境准备3.1 主机规划主机名IP 地址系统配置master23110.0.0.231Ubuntu 22.04 LTS2C4G50Gworker23210.0.0.232Ubuntu 22.04 LTS2C4G50Gworker23310.0.0.233Ubuntu 22.04 LTS2C4G50G3.2 系统基础优化所有节点执行1. 关闭 Swap 分区# 临时关闭swapoff-asysctl-wvm.swappiness0# 永久关闭sed-ri/^[^#]*swap/s^#/etc/fstabK8S 默认不允许使用 Swap否则 Pod 调度会出现异常。2. 加载内核模块iptables 桥接流量catEOF|tee/etc/modules-load.d/k8s.confbr_netfilter EOFcatEOF|tee/etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOFsysctl--system3. Linux 内核参数优化cat/etc/sysctl.d/k8s.confEOF net.ipv4.ip_forward 1 net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv6.conf.all.disable_ipv6 1 fs.may_detach_mounts 1 vm.overcommit_memory1 vm.panic_on_oom0 fs.inotify.max_user_watches89100 fs.file-max52706963 fs.nr_open52706963 net.netfilter.nf_conntrack_max2310720 net.ipv4.tcp_keepalive_time 600 net.ipv4.tcp_keepalive_probes 3 net.ipv4.tcp_keepalive_intvl 15 net.ipv4.tcp_max_tw_buckets 36000 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_max_orphans 327680 net.ipv4.tcp_orphan_retries 3 net.ipv4.tcp_syncookies 1 net.ipv4.tcp_max_syn_backlog 16384 net.ipv4.ip_conntrack_max 65536 net.ipv4.tcp_max_syn_backlog 16384 net.ipv4.tcp_timestamps 0 net.core.somaxconn 16384 EOFsysctl--system3.3 安装 ipvs 负载均衡模块所有节点执行生产环境强烈推荐 kube-proxy 使用ipvs 模式替代默认的 iptables性能更高。# 安装工具apt-yinstallipvsadm ipset sysstat conntrack# 配置开机自动加载 ipvs 模块cat/etc/modules-load.d/ipvs.confEOF ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp ip_vs_sh nf_conntrack ip_tables ip_set xt_set ipt_set ipt_rpfilter ipt_REJECT ipip EOF重启后验证lsmod | grep --colorauto -e ip_vs -e nf_conntrack3.4 安装 Docker 并确认 cgroup 驱动# 安装 Docker略参考官方文档# 关键确认 cgroup 驱动为 systemddockerinfo|grepCgroup Driver# 输出应为Cgroup Driver: systemd排坑提醒K8S 要求 Docker 的 cgroup 驱动必须和 kubelet 一致默认都应该是systemd。如果不一致Pod 创建会失败。四、安装 kubeadm / kubelet / kubectl所有节点执行组件作用kubeadm初始化集群的工具kubelet管理容器生命周期的守护进程kubectl命令行管理工具4.1 配置软件源apt-getupdateapt-getinstall-yapt-transport-httpscurlhttps://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg|apt-keyadd-catEOF/etc/apt/sources.list.d/kubernetes.listdeb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOFapt-getupdate4.2 安装指定版本apt-get-yinstallkubelet1.23.17-00kubeadm1.23.17-00kubectl1.23.17-004.3 验证版本kubeadm version# kubeadm version: version.Info{GitVersion:v1.23.17,...}kubectl version# Client Version: version.Info{GitVersion:v1.23.17,...}kubelet--version# Kubernetes v1.23.17排坑提醒三个组件版本必须保持一致。kubelet 版本不可以超过 api-server 版本。五、初始化 Master 节点5.1 导入镜像避免网络超时master-1.23.17.tar.gz包下载地址链接: https://pan.baidu.com/s/1_muktv-75__PO7B_fMhVMg?pwdvbc2 提取码: vbc2# 提前下载好镜像包并导入dockerload-imaster-1.23.17.tar.gz# 确认镜像dockerimagels# kube-apiserver v1.23.17# kube-controller-manager v1.23.17# kube-scheduler v1.23.17# kube-proxy v1.23.17# etcd 3.5.6-0# coredns v1.8.6# pause 3.65.2 kubeadm init 初始化集群kubeadm init\--kubernetes-versionv1.23.17\--image-repository registry.aliyuncs.com/google_containers\--pod-network-cidr10.100.0.0/16\--service-cidr10.200.0.0/16\--service-dns-domaincn.com参数说明参数作用--kubernetes-version指定 K8S 版本--image-repository镜像仓库地址使用阿里云加速--pod-network-cidrPod 网段--service-cidrService 网段--service-dns-domain集群 DNS 域名默认 cluster.local初始化成功后会输出关键信息Your Kubernetes control-plane has initialized successfully!# 保存 join 命令24 小时内有效kubeadmjoin10.0.0.231:6443--tokenhcfu6t.dw0qdsinnjs778mi\--discovery-token-ca-cert-hash sha256:c3f7dc36e438cd8e134797d472ddb0ab78766284a06a8b846f7eb37cf58bf951排坑提醒Token 默认 24 小时过期务必在有效期内完成 Worker 节点加入。如果过期用kubeadm token create --print-join-command重新生成。5.3 配置 kubectl 管理集群mkdir-p$HOME/.kubesudocp-i/etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g)$HOME/.kube/config5.4 验证 Master 组件状态kubectl get componentstatuses# NAME STATUS MESSAGE# controller-manager Healthy ok# scheduler Healthy ok# etcd-0 Healthy {health:true,reason:}kubectl get nodes# NAME STATUS ROLES AGE VERSION# master231 NotReady control-plane,master 3m v1.23.17此时节点状态为NotReady这是正常的因为还没安装 CNI 网络插件。六、Worker 节点加入集群6.1 导入镜像每个 Worker 节点slave-1.23.17.tar.gz包下载地址链接: https://pan.baidu.com/s/13nACsXAfB9E0qH_MYBhxwQ?pwd57pn 提取码: 57pndockerload-islave-1.23.17.tar.gz6.2 执行 join 命令kubeadmjoin10.0.0.231:6443--tokenhcfu6t.dw0qdsinnjs778mi\--discovery-token-ca-cert-hash sha256:c3f7dc36e438cd8e134797d472ddb0ab78766284a06a8b846f7eb37cf58bf9516.3 验证节点加入kubectl get nodes-owide# NAME STATUS ROLES AGE VERSION# master231 NotReady control-plane,master 8m v1.23.17# worker232 NotReady none 42s v1.23.17# worker233 NotReady none 38s v1.23.17七、部署 CNI 网络插件 Flannel7.1 修改 Flannel 配置wgethttps://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml# 修改 Pod 网段与初始化时一致sed-i/Network:/s#10.244.0.0/16#10.100.0.0/16#kube-flannel.yml7.2 应用 Flannel 资源kubectl apply-fkube-flannel.yml7.3 验证网络插件kubectl get pods-A#NAMESPACE NAME READY STATUS#kube-flannel kube-flannel-ds-5hbns 1/1 Running#kube-flannel kube-flannel-ds-dzffl 1/1 Running#kube-flannel kube-flannel-ds-h5kwh 1/1 Running#kube-system coredns-6d8c4cb4d-k52qr 1/1 Running#kube-system etcd-master231 1/1 Running#kube-system kube-apiserver-master231 1/1 Running#kube-system kube-controller-manager-master231 1/1 Running#kube-system kube-proxy-9bb67 1/1 Running#kube-system kube-scheduler-master231 1/1 Runningkubectl get nodes# NAME STATUS ROLES AGE VERSION# master231 Ready control-plane,master 27m v1.23.17# worker232 Ready none 23m v1.23.17# worker233 Ready none 23m v1.23.17所有节点状态变为Ready集群部署完成。八、验证跨节点 Pod 通信创建两个分别在不同节点的 Pod测试跨节点网络连通性apiVersion:v1kind:Podmetadata:name:test-v1spec:nodeName:worker232containers:-image:registry.cn-hangzhou.aliyuncs.com/eci_open/nginx:latestname:c1---apiVersion:v1kind:Podmetadata:name:test-v2spec:nodeName:worker233containers:-image:registry.cn-hangzhou.aliyuncs.com/acs/nginx:1.21name:c1kubectl apply-ftest-pod.yaml kubectl get pods-owide# NAME READY STATUS IP NODE# test-v1 1/1 Running 10.100.1.2 worker232# test-v2 1/1 Running 10.100.2.2 worker233# 跨节点访问测试curl10.100.1.2# worker232 上的 v1 服务curl10.100.2.2# worker233 上的 v2 服务两个 Pod 跨节点互通说明 CNI 网络工作正常。九、配置 kubectl 命令自动补全kubectl completionbash~/.kube/completion.bash.incechosource $HOME/.kube/completion.bash.inc~/.bashrcsource~/.bashrc# 测试输入 kubectl 后连续按两次 Tab 键kubectl# 应出现所有子命令的补全列表十、K8S 部署方式对比部署方式难度生产适用说明kubeadm中推荐官方工具快速部署证书自动管理二进制高大规模完全手动控制每个组件便于深度定制KubeSphere低中小企业图形化管理界面底层基于 kubeadmRancher低中小企业图形化管理界面支持 K3Skubeasz中推荐基于 Ansible 二进制方式云产品ACK/TKE/CCE低推荐托管 K8S免运维 Master建议学习阶段用kubeadm搞懂原理生产环境根据公司情况选择。十一、部署第一个业务集群搭建完成后来部署一个 Nginx Web 应用感受一下 K8S 的资源管理方式11.1 声明式管理 PodapiVersion:apps/v1kind:Deploymentmetadata:name:web-appspec:replicas:3selector:matchLabels:apps:webtemplate:metadata:labels:apps:webspec:containers:-name:nginximage:nginx:1.24ports:-containerPort:80kubectl apply-fweb-app.yaml kubectl get pods-owide# NAME READY STATUS IP# web-app-5d8f67c8d-abcde 1/1 Running 10.100.1.3# web-app-5d8f67c8d-fghij 1/1 Running 10.100.2.3# web-app-5d8f67c8d-klmno 1/1 Running 10.100.2.411.2 创建 Service 暴露服务apiVersion:v1kind:Servicemetadata:name:web-svcspec:type:NodePortselector:apps:webports:-port:80targetPort:80nodePort:30080kubectl apply-fweb-svc.yaml# 浏览器访问http://10.0.0.231:30080 http://10.0.0.232:30080 http://10.0.0.233:30080十二、常见问题与排坑Q1初始化失败怎么处理# 重置节点kubeadm reset-f# 检查常见原因free-h# 确认 swap 已关闭lscpu# 确认 CPU 2 核dockerinfo# 确认 cgroup 驱动为 systemd# 重新初始化kubeadm init --kubernetes-versionv1.23.17...Q2节点状态 NotReady# 检查 kubelet 状态systemctl status kubelet# 检查 CNI 插件kubectl get pods-nkube-flannel# 检查节点资源kubectl describenode节点名Q3Token 过期了怎么办# 重新生成 join 命令kubeadm token create --print-join-commandQ4Pod 一直处于 ContainerCreatingkubectl describe podPod名# 常见原因镜像拉取失败、存储卷挂载失败、CNI 配置问题十三、总结本文从零开始完成了一套完整的 K8S 集群搭建核心步骤如下1. 系统优化关闭 Swap、内核参数、ipvs 模块 2. 安装 Docker确认 cgroup 驱动 3. 安装 kubeadm / kubelet / kubectl 4. kubeadm init 初始化 Master 5. Worker 节点 join 加入集群 6. 部署 CNI 网络插件Flannel 7. 验证跨节点通信 8. 部署业务验证掌握了这套流程你就具备了 K8S 集群部署的核心能力。后续可以在此基础上学习 Service、Ingress、HPA 自动扩缩容、PV/PVC 持久化存储、Helm 包管理等进阶内容。推荐下一步学习路径K8S 核心资源Deployment、Service、Ingress、ConfigMap、Secret存储体系PV、PVC、StorageClass、对接 Ceph监控体系Prometheus Grafana Alertmanager日志体系ElasticStackEFKCI/CDJenkins K8S 实现代码自动发布参考资源Kubernetes 官方文档https://kubernetes.io/zh-cn/docs/kubeadm 安装指南https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/Flannel 网络插件https://github.com/flannel-io/flannel