ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

K8s v1.18.2一键安装:kubeadm配置与flannel网络排坑指南

K8s v1.18.2一键安装:kubeadm配置与flannel网络排坑指南 简介面向Linux环境下希望快速搭建Kubernetes测试环境、又不想手动敲大量命令的学习者这份资源提供了一套基于kubeadm的k8s一键安装程序对应版本v1.18.2兼顾自动化部署与环境预检。程序会先检查系统环境不满足要求时给出修改提示避免盲目安装导致失败适合学习K8s基础运作、练习插件配置也可作为实验环境的基础工具但不建议用于生产。资源包共6个文件整体仅10KB为轻量脚本包主要包含安装主脚本、kubeadm初始化与flannel网络插件配置、环境配置文件以及说明文档各文件分工明确便于按需查看与调整。目前已有3112人学习/下载通过阅读说明文档和配置模板使用者既能了解kubeadm初始化集群的步骤也能掌握flannel网络插件等关键组件的配置思路省去大量手工敲命令与排错的时间快速进入后续学习。1. 一键安装K8s v1.18.2先过环境检查再谈“自动”做容器化交付这些年我搭过的测试集群不下二十套kubeadm init 手动跑一遍加上网络插件、token 分发、kubeconfig 拷贝快的话也要二十多分钟慢的话一个下午都耗在镜像拉取和证书重签上。而这个 k8s-auto 项目把 v1.18.2 的整套安装流程收敛成了一个 zip 包解压、改 comm.conf、执行 kubeinstall能过的机器十分钟内进集群。它适合三类人刚学 Kubernetes 想做验证环境的学生、需要在本地或内网快速起一套测试集群的研发、以及被各种 CNI 版本兼容问题折磨过的运维。它明确声明不用于生产因为它的设计目标是省配置时间而不是保证高可用。2. 拆开 k8s-auto 看配置kubeadm.yaml 与 comm.conf 的每个参数值2.1 版本对应关系为什么死死咬住 v1.18.2这个脚本之所以看起来“挑机器”本质原因是它把所有配置都锁死在 Kubernetes v1.18.2 这个版本上。kubeadm 在 1.18 和 1.19 之间的参数变化不算大但到了 1.20 之后Dockershim 的弃用、kubelet 配置结构的变化都会让旧脚本直接失效。所以使用前第一件事就是确认机器上的内核、容器运行时和系统版本不是它故意刁难而是 kubeadm 本身就强依赖环境一致。组件版本说明kubeadm / kubelet / kubectlv1.18.2三个组件必须同版本否则证书和 apiserver 握手会出问题Docker19.03.x 左右1.18 时代官方推荐版本高版本 Docker 需要额外配置 cgroup driverLinux 内核4.191.18 的 kube-proxy 对内核版本有隐式要求系统CentOS 7.x / Ubuntu 18.04脚本内 swap、防火墙、SELinux 检查均针对这两个发行版实际踩坑经历告诉我CentOS 7.6 配内核 4.19 是综合成本最低的组合。Ubuntu 20.04 也不是不能跑但 NetworkManager 对 cni0 网桥的干扰会多出很多排查时间。2.2 kubeadm.yaml 解析脚本里最该手动改的文件解压后你会看到 kubeadm.yaml 和 kube-flannel.yml 两份核心配置。kubeadm.yaml 是集群初始化的主参数文件kube-flannel.yml 是网络插件资源清单。先看 kubeadm.yaml 里几个直接影响安装成败的字段apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: v1.18.2 controlPlaneEndpoint: 192.168.1.10:6443 networking: podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12 --- apiVersion: kubeadm.k8s.io/v1beta2 kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.1.10 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock这段配置的关键在criSocket和网络段定义。1.18.2 的 kubeadm 默认走 dockershim如果你把 Docker 换成了 containerd这里的 socket 路径必须改为unix:///run/containerd/containerd.sock否则初始化会卡死在 CRI 连接阶段。podSubnet是 flannel 是否能正常运行的前置条件flannel 默认使用 10.244.0.0/16如果这里改成别的段kube-flannel.yml 里的Network字段也要同步改。2.3 comm.conf一键脚本的大脑这个文件是整个 k8s-auto 最核心的“遥控器”它的作用是告诉安装脚本主节点 IP 是多少、要用哪个镜像仓库、工作节点怎么加入。格式类似 key-value但里面几乎没有注释我建议你动手之前先补上自己的注释防止三个月后自己都看不懂。MASTER_IP192.168.1.10 POD_SUBNET10.244.0.0/16 IMAGE_REPOSITORYregistry.aliyuncs.com/google_containers KUBE_VERSIONv1.18.2 NETWORK_INTERFACEeth0 SKIP_SWAP_CHECKfalseIMAGE_REPOSITORY是镜像源默认指向阿里云的 google_containers 镜像仓库这能省掉大部分拉取超时的烦恼。NETWORK_INTERFACE是 flannel 绑定的网卡名如果你的机器是多网卡环境比如有 docker0、br-ex 之类这里填错会导致 Pod 间跨节点通信时好时坏而且没有明确的报错只能从 pod 网关不通的现象反推。我一般会先执行ip a确认路由走哪块网卡再写死这个字段。2.4 脚本执行前的强制检查逻辑脚本的第一道关卡并不是安装而是环境预检。它依次检查 swap 是否关闭、防火墙状态、SELinux 配置、内核模块 br_netfilter 是否加载、网络连通性。任何一项不满足都会返回错误码并中断然后 wd 提示你按 readme.txt 里的说明逐项修正。这个设计很务实因为它把安装时的玄学问题前移到了初始化阶段。#!/bin/bash # env_check.sh 的核心片段kubeinstall 内部逻辑 check_swap() { if [ $SKIP_SWAP_CHECK false ]; then SWAP_STATUS$(swapon --show | wc -l) if [ $SWAP_STATUS -ne 0 ]; then echo Error: swap must be disabled exit 1 fi else echo Warning: skip swap check fi }注意SKIP_SWAP_CHECKfalse这个参数反转。如果你想快速验证安装流程可以设置为 true 跳过 swap 检查但 kubelet 在 swap 开启的机器上会报running with swap on is not supported最终仍然失败。所以我建议不要跳检查老老实实执行swapoff -a并把 /etc/fstab 里的 swap 行注释掉。3. 跑通一键安装从环境检查到集群初始化的完整执行路径3.1 解压与目录结构先花两分钟看懂每个目录的用途拿到 k8s-auto.zip 后先别急着解压执行先确认压缩包内容完整。常见做法是放到 /opt 下解压避免某些脚本对路径空格敏感cd /opt unzip k8s-auto.zip ls -la k8s-auto/正常解压后你会看到logs、bak、conf、kubeinstall 等入口文件和目录。logs 和 bak 是脚本运行时自动生成或备份用的in.md 和 readme.txt 是说明文档。kube-flannel.yml与kubeadm.yaml放置在主目录下看起来是独立文件实际是供 kubeinstall 脚本调用的资源模板。目录结构不复杂但注意不要把日志目录提前清空因为脚本断点续跑时会参考 logs 下的状态记录。3.2 修改 comm.conf把三台机器的 IP 填对这套脚本并不强行要求三台机器单机也能跑但如果你要搭一个带 worker 的集群就要在 comm.conf 里补充完整的主机清单。它的格式相当原生态没有数组而是靠固定后缀区分节点角色。# 假设你有三台机器 MASTER_IP192.168.1.10 NODE1_IP192.168.1.11 NODE2_IP192.168.1.12 JOIN_TOKENabcdef.0123456789abcdefJOIN_TOKEN如果留空脚本会在主节点初始化成功后自动生成。但我建议你预先用kubeadm token create --print-join-command生成一个并写进配置里因为很多操作场景下你还需要宿主机重启后再重新 join 一台节点那时候 token 过期了非常麻烦。还有一个隐藏逻辑是脚本会根据 IP 是否在同一网段判断是否需要跨网段配置路由如果你的 worker 和 master 不在一个 VLAN预检会直接拒绝执行这一点务必注意。3.3 执行主节点安装观察每一行输出配置改完主节点上直接执行cd /opt/k8s-auto ./kubeinstall正常流程下脚本会依次完成三件事系统环境检查通过后自动拉取镜像并为 kubeadm 打上 img 前缀、生成证书、初始化控制面组件。如果中间某一步失败脚本会记录当前状态到 logs/install_$(date %Y%m%d).log并输出一条带[ERROR]前缀的信息。你需要看的是日志末尾而不是开头因为 kubeadm 的报错通常在最后一段包括Port 6443 is in use、ImagePullBackOff、kubelet.service is not active这些。这里有一个比较隐蔽的细节kubeinstall 在执行 kubeadm init 时默认会把日志输出同时写到终端和 bak 目录下的备份文件里。如果你看到屏幕上卡住不动先按 CtrlP 看看是不是分页不要直接杀掉进程。我遇到过一次是因为终端窗口太小kubeadm 输出的表格被截断了看起来像卡死实际上集群正在正常配置。3.4 主节点初始化验证kubectl 能不能用是硬指标初始化完成后kubeadm 会输出一段固定的提示告诉你 mkdir -p $HOME/.kube、sudo cp 配置文件然后就可以用 kubectl 了。很多新手会跳过这一步直接装 flannel导致 apiserver 起来但调度器无法正常工作。mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config kubectl get nodes看到STATUSNotReady是正常的因为还没装 CNI。但如果你看到STATUSReady却没有任何 CONTROL-PLANE 组件异常那才需要怀疑。因为如果没有 CNIkubelet 会把节点标记为 NotReady但控制面组件此时可能已经全部 Running。这是判断脚本执行到什么阶段的标志性信号。3.5 安装 flannel 网络插件podSubnet 一致性检查kube-flannel.yml 中默认的 Network 配置必须与 kubeadm.yaml 的 podSubnet 一致。脚本会直接应用主目录下的这份 yaml所以如果你在配置文件里改了网段这里一定要同步sed -i s#10.244.0.0/16#10.244.0.0/16#g kube-flannel.yml kubectl apply -f kube-flannel.yml kubectl get pods -n kube-system | grep flannelflannel pod 从 Created 到 Running 通常需要 30 秒左右如果长时间停在 ContainerCreating执行kubectl logs查看。最常见的报错是网卡选错导致The interface eth0 is not in expected subnet这时需要回到 comm.conf 修改NETWORK_INTERFACEeth0为你机器实际网卡名然后重建 flannel pod。4. 避坑手册6 个环境检查与网络插件的真实翻车现场4.1 环境检查类三台机器连跑三天问题一个比一个隐蔽现象一kubeinstall 在环境检查阶段报[ERROR] FileContent--proc-sys-net-bridge-bridge-nf-call-iptables is missing。原因内核模块 br_netfilter 未加载或者 /etc/sysctl.conf 中没写入net.bridge.bridge-nf-call-iptables1。这个问题在 VMware 克隆出来的 CentOS 上尤其常见因为克隆后的机器网卡 MAC 变了内核模块加载顺序受到影响。解决执行modprobe br_netfilter并写入 /etc/modules-load.d/br_netfilter.conf再用sysctl -p刷新。现象二预检提示[ERROR] SystemVerification: failed to check kernel version明明内核已经是 4.19。原因脚本里内核版本判断可能存在列出的内核主版本号与 UBUNTU 的版本号映射不一致的情况部分 CentOS 机器因为 grub 默认启动项还是旧内核uname -r显示的还是 3.10。这是典型的重启没到位问题。解决查看grub2-editenv list确认 saved_entry 是哪个内核然后grub2-set-default 0重启再跑一次 kubeinstall。不要手动改 /etc/default/grub 里的 GRUB_DEFAULT因为 CentOS 7 的 grub2 缓存有时会让你白改。现象三Docker 已安装但脚本仍报 CRI 无法连接。原因Docker 版本太高默认的 cgroup 驱动改成了 systemd而 kubelet 1.18 期望的是 cgroupfs。两者不一致导致 kubelet 无法启动报错信息通常藏在journalctl -u kubelet里。解决在 Docker daemon.json 中把exec-opts改为[native.cgroupdrivercgroupfs]重启 Docker然后在 kubeinstall 前手动跑一遍 CRI 检查。4.2 镜像与网络类拉取和连通性的坑最耗时间现象四镜像拉取卡在 docker pull 阶段反复重试仍然失败。原因国内网络访问 k8s.gcr.io 不稳定脚本默认镜像仓库虽然是阿里云但如果你用的是离线安装包里的 Docker没有配置 registry-mirrors 也会拖慢。解决检查 /etc/docker/daemon.json确保 registry-mirrors 已添加或者直接用 comm.conf 里的 IMAGE_REPOSITORY 指向registry.cn-hangzhou.aliyuncs.com/google_containers这是国内最稳的路径。现象五flannel 安装成功但跨节点 ping Pod IP 不通同节点正常。原因这个现象排查起来比较玄学实际是网卡路由策略问题。kube-flannel 会为每个节点创建一条到 10.244.0.0/16 的规则如果机器上有多个网卡kubelet 上报的 NodeIP 和 flannel 使用的网卡不一致导致它把 Pod 流量送进了错误的物理网卡。解决在 comm.conf 中明确 NETWORK_INTERFACE并在 kube-flannel.yml 的 args 中通过--iface参数强制指定网卡。我一般两种方式都做双保险。现象六执行 kubeinstall 时脚本提示[ERROR] Port 10250 is in use。原因之前跑过一次失败的集群kubelet 残留进程占用了端口而脚本没有检测判断。解决systemctl stop kubelet后rm -rf /var/lib/kubelet /etc/kubernetes并清理/var/lib/docker/containers中残留的 pause 容器再重新执行。这里有个细节1.18 的 kubelet 会写入 /var/lib/kubelet/cpu_manager_state如果不清理重启后端口照样被占。5. 收尾技巧多节点加入、Pod 网络验证与卸载清理这套资源里 logs 和 bak 目录不是摆设。第一次安装失败后logs 下的 install_2024xxxx.log 能清楚看到失败阶段bak 里则保留了上一次改动前的 comm.conf 和 kubeadm.yaml 备份这相当于脚本自带的后悔药。要养成习惯每改一次配置人工复制一份 comm.conf 到 bak 目录脚本恢复现场时不会覆盖你的备份。验证集群是不是真能用我的习惯是不只看 kubectl get nodes而是强制部署一个 nginx 跨节点访问kubectl create deployment nginx --imagenginx:1.19 kubectl expose deployment nginx --port80 --typeNodePort kubectl get svc nginx # 从另一台节点访问 NodePort curl http://192.168.1.11:$(kubectl get svc nginx -o jsonpath{.spec.ports[0].nodePort})如果 curl 能通说明 kube-proxy 的 iptables 规则、CNI 跨节点通信、Service 转发三层全部正常。很多教程只跑到 kubectl get nodes 就宣布成功实际上 NodePort 不通的比例很高。清理集群时也有讲究。kubeadm reset -f之后必须手动清理 CNI 残留否则下次安装 flannel 会报网卡重叠。我现在的流程是先 kubeadm reset再 rm -rf /etc/cni/net.d最后清 iptables。从那次在一台机器上连续安装三次集群失败之后我每次卸载都强制走一遍这三步顺手会把 /var/lib/cni 也删掉。这套脚本对我最有价值的地方其实是它把复杂步骤收敛成了「环境检查 执行 看日志」三段式让我能把注意力放在理解 k8s 运行原理上而不是反复和配置搏斗。希望这份拆解能帮到你也欢迎你把这套脚本用于自己的测试环境感受一下 1.18.2 时代的集群搭建节奏。本文还有配套的精品资源点击获取
返回列表