Kubernetes集群快速搭建与自动化运维指南
图吧工具箱与自动化运维的结合背景介绍图吧工具箱Tuba Toolbox在硬件检测、系统维护中的常见用途以及自动化运维在现代IT环境中的重要性。提出通过脚本批量调用图吧工具实现高效检测的需求。批量检测脚本的核心功能设计列举典型场景多设备硬件状态巡检、批量系统性能测试、自动化报告生成。明确脚本需调用的图吧工具模块如CPU-Z、GPU-Z、磁盘检测工具等。技术实现路径分析图吧工具箱的CLI命令行接口或API支持情况若官方无接口则探讨通过AutoHotkey/Python自动化操作GUI的可行性。示例代码片段展示调用工具的基本逻辑import subprocess tool_path C:\\TubaToolbox\\CPU-Z.exe subprocess.run([tool_path, /exportreport.csv])日志收集与报告生成设计统一输出格式JSON/CSV通过脚本聚合多工具结果。示例使用Python pandas整理数据并生成可视化报告。异常处理与调度优化讨论网络或权限导致的工具调用失败处理方案。结合Windows任务计划或Ansible实现定时批量执行。实际案例与性能对比提供某企业内网50台设备批量检测的案例对比手动操作与脚本执行的耗时差异如从8小时缩短至30分钟。安全性与权限管理强调脚本执行时需避免提权风险建议使用最小权限账户并加密敏感日志数据。扩展方向探讨与Prometheus/Grafana集成实现实时监控或适配其他开源工具箱的跨平台方案。作者声明Ubuntu搭建kubernetes1.32环境准备,采用双网卡NAT网络VirtualBox Host Only Ethernet Adapter仅主机网络。1、集群之间所有机器网络互通可以访问外网拉取镜像禁止swap分区。2、每个节点安装containerd和kuberadm。3、部署kubernetesMaster4、部署容器网络插件calico5、部署kubernetesNode将节点加入kubernetes集群6、部署DashboardWeb页面可视化查看kubernetes资源一、环境准备主机名称/主机角色主机IP仅主机网络主机配置k8s-node110.0.2.15192.168.56.1004Core4GBk8s-node210.0.2.10192.168.56.1014Core4GBk8s-node310.0.2.11192.168.56.1024Core4GB1、编写Vagrantfile文件vagrant up快速批量创建虚拟机配置虚拟机镜像主机名IP以及虚拟化平台。确保一致的环境。Vagrant.configure(2) do |config| (1..3).each do |i| #|node|单台虚拟机全局配置对象管道符 | | 用来接收函数传过来的对象 config.vm.define k8s-node#{i} do |node| # 设置虚拟机的Box镜像系统 node.vm.box ubuntu/jammy64 # 设置虚拟机的主机名 node.vm.hostname k8s-node#{i} # 设置虚拟机的IP node.vm.network private_network, ip: 192.168.56.#{99i}, netmask: 255.255.255.0 # VirtaulBox相关配置 # v 代表当前这台 VirtualBox 虚拟机的配置结构体通过 v.属性值 修改硬件参数 node.vm.provider virtualbox do |v| #v.nameVirtualBox 管理器里显示的虚拟机名称 v.name k8s-node#{i} # v.memory分配内存单位 MB v.memory 4096 #v.cpus分配 CPU 核心数 v.cpus 4 end end end end2、开启SSH密码访问vi /etc/ssh/sshd_configcat /etc/ssh/sshd_config.d/*.conf# 允许root使用密码登录 PermitRootLogin yes # 开启密码认证 PasswordAuthentication yes修改密码passwd rootsystemctl restart sshd # 查看ssh状态 systemctl status sshd本地 xshell 使用root用户登录验证如果登不上就是主机秘钥缓存冲突删除Xshell旧秘钥缓存。在 Xshell 会话列表右键k8s-node1→属性→ 【安全】→【主机密钥管理】在列表找到192.168.56.100删除这条旧密钥记录重新双击打开会话再弹窗时点【接受并保存 (S)】以后不再提示。3、设置网络环境#显示默认网卡 ip route show ip addr采用双网卡模式第一个网卡是NAT网络不采用网络地址转换因为kubenetes集群中每个node节点要不同的ip地址相当于主节点和子节点建了一个内部网络而不是相同IP地址端口转发的方式。如10.0.2.15第二个是仅主机网络用于宿主机能连上虚拟机Xshell连接工具使用仅主机网络。如192.168.56.100等network: version: 2 ethernets: enp0s3: match: macaddress: 02:dc:5f:02:c8:8d dhcp4: true dhcp6: true set-name: enp0s3#修改50-cloud-init.yaml,更改MAC地址 sudo vi /etc/netplan/50-cloud-init.yaml #修改权限 sudo chmod 600 /etc/netplan/50-vagrant.yaml sudo netplan try # 无报错回车永久生效 sudo netplan apply注意重新生成MAC地址后一定要去/etc/netplan目录下修改网络配置文件的固定MAC地址否则vagrant ssh连不上虚拟机因为MAC地址在netplan的50-cloud-init.yaml配置文件中是写成固定的。netplan 是按文件名数字顺序加载配置。netplan 中的50-vagrant.yaml就读不到XShell也会连不上。vi /etc/hosts 10.0.2.15 k8s-node1 10.0.2.24 k8s-node2 10.0.2.25 k8s-node3检查k8s集群node之间、与宿主机、与互联网络是否ping通ping baidu.com ping k8s-node2 ping 192.168.56.1同步时间timedatectl set-timezone Asia/Shanghai apt update apt install -y ntpdate ntpdate ntp.aliyun.com4、配置内核转发和网桥过滤将桥接的IPv4流量传递到iptables的链网桥流量经过 iptables 转发没开就会 Pod 访问 Service 无路由no route to host就是你现在 coredns 报错根源modprobe overlay modprobe br_netfilter cat /etc/sysctl.d/k8s.conf EOF net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF sysctl --system10.96.0.1 是 apiserver ServiceIP依赖 kube-proxy 生成 iptables/ipvs 转发规则宿主机没开 ip_forward → Pod 内访问 serviceIP 被拒 → install-cni 拿不到 sa token 直接 FATAL 退出。modprobe br_netfilter是一个用于向内核中加载br_netfilter模块的命令。modprobe是一个用于加载或移除内核模块的工具而br_netfilter模块的作用是使iptables规则可以在 Linux 桥接Bridge上工作。br_netfilter模块的作用br_netfilter模块可以使iptables规则在 Linux 桥接设备上生效用于将桥接的流量转发至iptables链。这在 Kubernetes 等容器化环境中尤为重要因为它可以确保同一节点上的 Pod 之间通过 Service 进行通信时流量能够正确地被iptables规则处理。modprobe overlay是用于加载 Linux 内核中的OverlayFS模块的命令。OverlayFS 是一种联合文件系统允许将多个目录合并为一个逻辑视图常用于容器技术如 Docker和临时文件系统。关闭swapswapoff -a 临时 sed -ri s/.*swap.*/#/ /etc/fstab 永久 free -g 验证swap 必须为 0所有节点临时清空防火墙master 所有 worker 全执行ufw disable iptables -F iptables -t nat -F安装ipvset和ipvsadm配置ipvsadm的模块这些都是算法模块目的是为了让开机自动加载apt install -y ipset ipvsadmcat EOF | tee /etc/modules-load.d/ipvs.conf ip_vs ip_vs_rr ip_VS_wrr ip_vs_sh nf_conntrack EOF编写脚本自动加载cat EOF | tee ipvs.sh #!/bin/sh modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack EOF执行脚本生效bash ipvs.sh验证脚本生效lsmod | grep ip_vs二、全节点安装contianerd容器运行时CRI1、continerd与docker对比对比项cri-dockerd (Docker 引擎)containerd (原生 CRI 运行时)项目归属Mirantis 社区维护非 CNCF 官方项目CNCF 毕业项目K8s 官方主推、各大云厂商 (EKS/AKS/GKE) 默认运行时资源开销高CPU / 内存多消耗 20%~30%dockerd 常驻大量冗余模块 (build/swarm)轻量化少一层 dockerd 适配器资源占用更低高密度容器优选进程故障影响dockerd 崩溃→全部容器直接退出dockerd 全生命周期管控容器containerd 进程宕机存量容器正常运行仅无法新建 Pod重启 containerd 即可恢复调度CRI 兼容性靠适配器翻译 CRI→Docker API版本迭代容易出现 CRI 字段不兼容、kubelet 报错原生 CRIK8s 版本升级无兼容坑跟随 K8s 官方同步迭代镜像存储Docker 私有存储格式和 containerd 存储隔离docker images≠crictl imagesOCI 标准镜像crictl/nerdctl 统一管理k8s.io 命名空间隔离节点运维命令docker ps/docker build/docker save/docker compose全量 Docker 命令可用无 docker cli替代crictl(CRI标准)/nerdctl(兼容docker语法)不支持 docker build/compose安全面dockerd 附带 build、swarm、remote API 等冗余功能攻击面更大只保留容器 / 镜像核心能力精简代码漏洞面更小生产安全更优Calico/eBPF 适配依赖 Docker 网络栈开启 eBPF 配置繁琐、兼容性差原生支持 cgroup、eBPFCalico 三种模式 (iptables/eBPF/HBN) 开箱即用升级维护Docker 大版本升级易变更 API导致 cri-dockerd 失效双组件需要分别升级单组件升级CRI 稳定K8s 跨小版本几乎不用改配置2、全节点安装containerd# 导入docker-ce阿里源密钥 curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable | tee /etc/apt/sources.list.d/docker.list apt update apt install containerd.io -y3、配置全节点的containerd必须一致containerd config default /etc/containerd/config.toml # 修改pause镜像、开启systemd cgroup sed -i s#sandbox_image registry.k8s.io/pause:3.9#sandbox_image registry.aliyuncs.com/google_containers/pause:3.10# /etc/containerd/config.toml sed -i s#registry.k8s.io/pause:3.10.1#registry.aliyuncs.com/google_containers/pause:3.10.1# /etc/containerd/config.toml sed -i s/SystemdCgroup \ false/SystemdCgroup \ true/ /etc/containerd/config.toml # 核对修改结果 grep sandbox /etc/containerd/config.toml # 添加docker镜像加速器 sed -i /\[plugins.io.containerd.grpc.v1.cri.registry.mirrors\]/a\ [plugins.io.containerd.grpc.v1.cri.registry.mirrors.docker.io]\n endpoint [https://docker.mirrors.ustc.edu.cn] /etc/containerd/config.toml systemctl daemon-reload systemctl enable --now containerd systemctl restart containerd systemctl status containerd三、全节点安装 kubeadm/kubelet/kubectl1.32.13阿里 K8s apt 源rm -rf /etc/apt/sources.list.d/kubernetes.list rm -rf /etc/apt/trusted.gpg.d/kubernetes.gpg mkdir -p /etc/apt/keyrings # 添加k8s源密钥 # 导入 v1.32 官方密钥国内用清华镜像地址 curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.32/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/k8s-132.gpg echo deb [signed-by/etc/apt/keyrings/k8s-132.gpg] https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.32/deb/ / /etc/apt/sources.list.d/kubernetes.list #查当前源可用版本 apt-cache madison kubeadm apt update # 锁定版本安装1.32.13 apt install -y --allow-change-held-packages kubelet1.32.13-1.1 kubeadm1.32.13-1.1 kubectl1.32.13-1.1 # 锁定版本防止自动升级 apt-mark hold kubelet kubeadm kubectl #开机自启动 systemctl enable --now kubelet四、部署k8s Master步骤 1 使用kubeadm config images pull命令在安装Kubernetes集群之前预先下载所有必需的Docker镜像从而加快安装速度。kubeadm config images pull \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.32.13步骤 2重置集群选做kubeadm reset -f rm -rf /etc/kubernetes/ /var/lib/kubelet/ $HOME/.kube4、重新初始化保留你的网段, service-cidr 用标准 / 12kubeadm init \ --apiserver-advertise-address10.0.2.15 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.32.13 \ --service-cidr10.96.0.0/12 \ --pod-network-cidr10.244.0.0/16初始化成功后执行管理员授权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保存输出的 join 命令所有 worker 节点执行kubeadm join x.x.x.x:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxxxtoken 过期重建kubeadm token create --print-join-commandrootk8s-node1:/home/vagrant# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-node1 Ready control-plane 3h25m v1.32.13 10.0.2.15 none Ubuntu 22.04.5 LTS 5.15.0-179-generic containerd://2.2.4 k8s-node2 Ready none 3h23m v1.32.13 10.0.2.10 none Ubuntu 22.04.5 LTS 5.15.0-179-generic containerd://2.2.4 k8s-node3 Ready none 3h23m v1.32.13 10.0.2.11 none Ubuntu 22.04.5 LTS 5.15.0-179-generic containerd://2.2.4六、Master 安装 Calico v3.32.0二选一推荐方案 1 快速部署方案 1直接 yaml 部署测试 / 生产通用最简1、下载yaml文件wget https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/calico.yaml # 带加速代理的wget命令 wget https://mirror.ghproxy.com/https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/calico.yaml -O calico.yaml #备用 curl -L https://mirror.ghproxy.com/https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/calico.yaml -o calico.yaml一、修改calico.yaml修改 Calico 网段关键 kubeadm pod-cidr10.244.0.0/16默认 yaml 是 192.168.0.0/16不改网络不通、node 一直 NotReady1、修改 IPIP 隧道找到CALICO_IPV4POOL_IPIP: Always→ 改成Never- name: CALICO_IPV4POOL_IPIP value: Never2、IPIP 环境变量下方新增双网卡 IP 自动探测固定 10.0.2.0/24 网段- name: IP_AUTODETECTION_METHOD value: cidr10.0.2.0/243、替换 Pod 网段192.168.0.0/16→10.244.0.0/16kubeadm 指定 pod-cidr- name: CALICO_IPV4POOL_CIDR value: 10.244.0.0/164. 所有节点创建 CNI 目录三台 node 都执行mkdir -p /opt/cni/bin /etc/cni/net.d5、部署calico# 如需修改pod网段搜索 CALICO_IPV4POOL_CIDR kubectl apply -f calico.yaml # 等待calico-node全部running kubectl get pods -n kube-system -w6. calico 全部 running 后删除异常 corednskubectl delete pod -n kube-system coredns-6766b7b6bb-bd8n4方案 2Tigera Operator 生产部署可动态管理 ippool、BPFkubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/v1_crd_projectcalico_org.yaml kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/tigera-operator.yaml curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/custom-resources.yaml # 默认cidr:192.168.0.0/16和kubeadm一致不用改 kubectl apply -f custom-resources.yaml watch kubectl get tigerastatus卸载calico 彻底清理残留 CRD 卸载旧 Calicokubectl delete pod -n kube-system calico-kube-controllers-655d9cb6c-qf4w4 --force --grace-period0原因旧 calico 控制器一直 Terminating 占用资源不删新部署容易资源冲突、pod 起不来。kubectl delete -f calico.yaml # 强制删除卡住terminating的calico CRD kubectl get crd |grep projectcalico |awk {print $1} |xargs kubectl delete crd --force --grace-period0 # 清理calico命名空间残留 kubectl delete ns calico-system --force --grace-period0 kubectl delete pod -n kube-system calico-kube-controllers-655d9cb6c-cqghs calico-node-cjnmb calico-node-gkz7v calico-node-kbjrf --force --grace-period0确保calico 的 install-cni 初始化容器正常并能够在宿主机部署 cni 配置 / 二进制成功安裝calicorootk8s-node1:/home/vagrant# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-655d9cb6c-gxqt7 1/1 Running 0 5m42s calico-node-4p2m2 1/1 Running 0 5m42s calico-node-4v4tn 1/1 Running 0 5m42s calico-node-ps9bb 1/1 Running 0 5m42s coredns-6766b7b6bb-bd8n4 1/1 Running 64 (7m52s ago) 5h35m coredns-6766b7b6bb-vl2nt 1/1 Running 0 5h35m etcd-k8s-node1 1/1 Running 1 5h35m kube-apiserver-k8s-node1 1/1 Running 1 5h35m kube-controller-manager-k8s-node1 1/1 Running 1 5h35m kube-proxy-6gzdx 1/1 Running 0 73m kube-proxy-mljdw 1/1 Running 0 73m kube-proxy-pwhdr 1/1 Running 0 73m kube-scheduler-k8s-node1 1/1 Running 1 5h35m rootk8s-node1:/home/vagrant#七、集群验证# 全部节点变为Ready kubectl get nodes # 测试pod网络 kubectl run test --image busybox --rm -it -- ping 192.168.0.1补充国内无法拉取 raw.githubusercontent替换下载地址使用https://mirror.ghproxy.com/代理示例wget https://mirror.ghproxy.com/https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/calico.yamlkubectl 常用查看日志命令Calico 排错、节点异常专用1、查看 Pod 实时日志calico-node 最常用# 查看单个calico-node日志 kubectl logs -n kube-system calico-node-xxx # 实时滚动 -f kubectl logs -f -n kube-system calico-node-xxx # 只看最近200行 kubectl --tail200 logs -n kube-system calico-node-xxx# 先查所有calico pod名称 kubectl get pods -n kube-system | grep calico2、容器多副本 / Pod 内多容器calico 常带双容器# -c 指定容器名 kubectl logs -n kube-system calico-node-xxx -c calico-node3、节点异常、kubelet 日志宿主机执行journalctl -f -u kubelet # 看历史 journalctl -u kubelet | grep -i error4、控制面组件日志apiserver/etcd 静态 pod# 用crictl查容器日志master节点 crictl ps -a | grep kube-apiserver crictl logs 容器ID5、排查节点 NotReady# 查看节点详细事件 kubectl describe node k8s-node1 # 查看集群事件全集群报错 kubectl get events -w