多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

从Linux到K8s:云计算运维完整学习路线与实战避坑指南

从Linux到K8s:云计算运维完整学习路线与实战避坑指南 简介面向云计算运维的入门与进阶学习者这份学习路线文档以技能竞赛和PaaS实践为背景系统规划了从Linux基础到Kubernetes容器编排的九个学习阶段并针对每个阶段给出明确的学习目标、参考视频链接和独立考核任务。内容贯穿常用命令与目录结构、Shell脚本自动化部署LNMP、MySQL主从复制与权限管理、LVS负载均衡与RabbitMQ集群、OpenStack核心组件原理、Ansible批量配置、Python调用API、Docker容器化部署webmall以及Kubernetes持续集成流程覆盖了运维岗所需的核心技能树且按周划分学习周期便于读者稳步推进。资源包仅含1个docx文件大小18KB内容为纯文字学习路线与具体细节无冗余附件适合直接阅读与标注。已有1701人浏览学习尤其适合正在备战云计算运维相关竞赛或希望系统构建运维能力体系的读者参考借鉴。1. 云计算运维学习路线先捅破“背命令就能上岗”的错觉刚接触云计算运维的人十有七八是拿一份 Linux 命令大全和几套视频开始刷结果面试时被一句“你的网站图片加载变慢从运维视角你会先看哪”卡得说不出话。原因在于云计算运维不是单点知识的堆叠而是一整条能力链路——底层是 Linux 与网络中层是虚拟化、容器与 Kubernetes上层是自动化与监控外围还有日志备份和故障意识。这篇文章把这条路线拆成阶段每阶段给出具体操作细节、参数含义和自测条件不空谈“学好 Linux 就行”这类废话让新手不迷失在教程堆里也让在岗的人看见自己缺在哪一环。适合准备转岗的运维工程师、相关专业的学生以及已入职一两年、想补齐边界的云运维新人。2. 第一阶段打地基Linux、网络与脚本要学到能把意外兜住的深度2.1 Linux 到底该学到什么不是背命令而是形成排障肌肉记忆服务器运维里最常被问的一句话是“你会哪些 Linux 命令”但真实工作里没人考默写考核的是你给一台陌生机器能不能快速说出“这台机器上跑着什么、哪个端口在监听、磁盘为什么慢了”。学习阶段不要把精力全放在冷门命令上先把四组高频命令练成条件反射系统状态、进程服务、网络端口、磁盘存储。我一般会让新人把下面这套“四连”命令练到不用想就能敲出来# 四步定位先判断负载类型再找进程再看端口最后查磁盘 uptime ps -eo pid,user,pcpu,pmem,cmd --sort-pcpu | head -15 ss -lntp df -hT free -h先解释为什么是这个顺序uptime的 load average 能告诉你系统是 CPU 忙、IO 忙还是整体空闲但某个进程卡住接着用ps按 CPU 排序快速锁定“谁在吃资源”ss -lntp看的就是监听端口和服务对应关系排查“端口起没起、被谁占了”df -hT看磁盘空间和文件系统类型free -h看内存余量。这个顺序把“从现象到嫌疑对象”的链路走了一遍而不是东敲一个命令西看一个文件。ps里的--sort-pcpu是按 CPU 使用率降序排列head -15只看前 15 行避免输出刷屏。ss -lntp比老旧的netstat -tlnp更快而且能看到进程名和 PID这在排查端口冲突时非常关键。注意ss不带-t的话会把 UDP 也列出来日常排查 TCP 服务用-t就够了。服务故障排查还有一个易被忽略的组合systemctl status xxx、journalctl -u xxx --since -30m。很多人遇到服务挂了习惯先重启但更稳妥的做法是先用systemctl status xxx看服务当前状态和最近日志片段再用journalctl把指定时间窗口的完整日志拉出来判断是配置错误、端口被占还是依赖组件没起。这一步做没做到位决定了“重启治标”和“修复治本”的分野。2.2 网络基础运维眼里的网络就是链路能不能通以及卡在哪一段很多从桌面运维转云计算运维的人对网络的理解停留在“能 ping 通就行”。实际云环境里安全组规则、VPC 子网、NAT 网关、负载均衡、DNS 解析都可能成为故障点ping通了不代表业务没问题ping不通也不一定是服务器宕机。网络设备维护的核心动作是把一条访问链路拆成若干段逐段验证。我常用的链路四连检命令如下# 先看默认路由对不对再测网关连通性然后验证DNS解析最后看业务端口响应 ip route show default ping -c 3 你的网关IP dig short example.com curl -I -m 5 http://example.comip route show default看缺省网关是否指向正确的下一跳在云主机上如果网关丢了外网请求直接断掉。ping -c 3而不是无限 ping-c指定发包数量避免卡在等待上。dig short比nslookup输出更干净直接给出解析结果适合脚本里做判断。curl -I -m 5中的-I只取响应头、不拉取整个页面-m 5是超时 5 秒防止 DNS 或连接挂起时一直等下去。这四个命令分别对应“路由层、链路层、解析层、应用层”的排查方向。比如curl返回 502说明请求到了负载均衡或网关但后端应用没正常响应返回 504说明网关等后端超时了连接被重置则要先检查安全组和防火墙。网络故障最难的不是某个命令不会用而是不知道当前现象属于哪一层把排查范围定住剩下就好办。2.3 脚本能力Bash 与 Linux 常用命令怎么配合日常巡检不靠手工一台台敲不少初学者把 Linux 命令和 Shell 脚本当成两件事命令背了一堆却不知道组合起来能产生什么价值。实际云计算运维里几十台、上百台服务器的批量巡检、日志采集、环境检查全靠手敲命令是不现实的这也是“运维效率工具”能存在的根本原因。脚本能力在路线里的定位不是让你去当开发而是让你把二十分钟的重复操作压成一条命令。学会循环和条件判断后第一个值得写的脚本就是批量服务器检查#!/bin/bash # 批量检查多台服务器的内存使用率适合新交付或日常巡检 for host in 10.10.10.10 10.10.10.11 10.10.10.12; do echo $host ssh $host free -h | awk NR2{print \已用:\\$3\ 可用:\\$7} done这个脚本的实用点在于ssh到每台机器后执行一段远程命令free -h输出两行awk NR2只取第二行再用\转义打印出“已用”和“可用”两列。注意远程命令里的$3和$7必须写成\$3、\$7否则会被本地 Shell 先解析掉输出就变成空值。这个细节是新手最容易踩的坑建议亲手试一遍对比差异。除了循环还要掌握grep、sed、awk、sort、uniq这五个文本处理命令的组合用法。面试题里常出现的“统计 Nginx 访问日志里 Top 10 IP”就是标准组合拳# 从访问日志中提取IP列排序去重后取前10 awk {print $1} /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10awk {print $1}提取每行第一个字段也就是客户端 IPsort排序uniq -c统计重复次数sort -rn按数字倒序排列head -10取前十。这套组合在日志分析和安全排查里出现频率极高值得反复练习到不假思索。学习阶段不要求你写多复杂的脚本但至少能看懂别人写的巡检脚本并敢于改参数。2.4 第一阶段自测条件能独立完成这六件事再进入下一阶段学习路线最怕的是自我感觉良好所以每阶段末尾要设一个硬性自测。第一阶段的自测标准不是“学过”而是“能在不查资料的情况下独立完成”。第一给一台全新的 Linux 主机配置静态 IP 和 DNS能 ping 通网关和公网域名。第二安装 Nginx 并设置开机自启修改默认端口为 8080 后能访问到页面。第三模拟一次磁盘写满能通过df、du找到大文件并清理出空间。第四模拟一个服务进程崩溃能通过journalctl定位日志并判断崩溃原因。第五写一个批量检查 3 台机器磁盘空间的脚本输出结果要带主机名。第六从 Nginx 访问日志里统计出访问量最大的 5 个 IP。这六项全部通过说明 Linux、网络、脚本三个地基基本夯实。有一项没过就回头补别硬往下一阶段走。虚拟化和容器是盖在地基上的楼地基本来就歪后面学 K8s 时你会同时面对概念陌生和基础不稳两座大山排查问题时根本分不清是 K8s 的机制问题还是 Linux 本身的问题。3. 第二阶段跨越日常虚拟化、容器与 K8s 三连跳的落地细节3.1 虚拟化为什么建议先学 KVM 而不是先学 VMware把底层机制看清楚很多教程会让你直接上手 VMware Workstation图形化界面点几下虚拟机就起来了确实省事但学完你对虚拟化仍然只有“开机、挂起、快照”这三个动作的理解。云计算运维要面对的是 KVM、Xen、Hyper-V 这类底层虚拟化平台而 KVM 因为内置于 Linux 内核是性价比最高的学习切入点。学习 KVM 不需要昂贵的物理服务器只要电脑 CPU 支持虚拟化就可以在 Linux 主机上通过 libvirt 工具栈创建虚拟机。首次建机常用virt-install命令# 创建一台名为 test-vm 的虚拟机分配2核2G20G磁盘使用本地ISO安装 virt-install \ --name test-vm \ --vcpus 2 \ --memory 2048 \ --disk path/var/lib/libvirt/images/test-vm.qcow2,size20,formatqcow2 \ --network networkdefault \ --os-variant centos7.0 \ --cdrom /tmp/CentOS-7-x86_64-Minimal.iso--vcpus 2是分配 2 个 vCPU--memory 2048是 2048 MB 内存--disk path指定磁盘镜像路径size20是分配 20 GB 容量formatqcow2是磁盘格式qcow2 支持稀疏分配和快照比 raw 格式更适合学习。--os-variant告诉 libvirt 当前系统的优化参数填错会影响虚拟机的 ACPI 和时钟配置。这里选default网络它对应 libvirt 创建的 NAT 网络虚拟机可以访问外网但外部不能直接访问虚拟机适合隔离实验环境。提示如果你的宿主机本身就是云服务器需要先确认云厂商是否开放了嵌套虚拟化否则 KVM 模块加载不了virt-install会直接报错。学习 KVM 的重点不是把安装流程背熟而是理解三个概念CPU 超分、内存超分、存储稀疏配置。CPU 超分让你能用 4 个物理核跑出 8 个 vCPU但高负载下会互相争抢内存超分则可能导致宿主机 swap 严重甚至 OOMqcow2 格式的稀疏文件看似容量很大实际占用的物理空间可能很小但写入量上来后宿主机的磁盘空间会被快速消耗。理解了这几个边界你才知道一台宿主机上到底能塞多少虚拟机这也是数据中心运维里容量规划的基础认知。3.2 Docker从镜像、容器到数据卷把三个最常用的细节吃透容器技术里Docker 是绕不开的第一站。学习 Docker 别急着背命令先建立“镜像不可变、容器是运行时、数据要挂载”这三个意识。镜像构建完不会因为容器运行而改变容器删了镜像还在但容器内产生的数据会随着容器删除而消失。所以只要涉及数据库文件、上传目录、日志文件这类需要保存的内容就必须挂载到宿主机。最简单的数据卷挂载方式是这样的# 启动Nginx容器把宿主机目录只读挂载给容器数据与镜像分离 docker run -d --name nginx-web \ -p 8080:80 \ -v /opt/webroot:/usr/share/nginx/html:ro \ nginx:alpine-d表示后台运行--name指定容器名-p 8080:80映射端口宿主机 8080 转发到容器内 80。-v的格式是“宿主机目录:容器目录:权限”:ro表示只读加上它是防止容器内进程误改宿主机文件这对安全是很有意义的强化。nginx:alpine是官方镜像的 Alpine 版本镜像更小资源占用低于完整版。运行后访问http://宿主机IP:8080就能看到页面。除了数据卷Dockerfile 的编写也值得花时间练习。一个最小的定制镜像只需要几行# 在官方镜像基础上同步时区并放进业务页面 FROM nginx:alpine RUN apk add --no-cache tzdata cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime COPY ./index.html /usr/share/nginx/html/RUN是构建时执行的命令apk add --no-cache tzdata安装时区数据--no-cache表示不缓存软件包索引、减小镜像体积COPY是构建时把当前目录的index.html复制进镜像。构建命令是docker build -t my-nginx:v1 .-t打标签格式是“仓库名:版本号”末尾的.代表构建上下文指向当前目录。注意.dockerignore文件要提前写好把不需要进镜像的临时文件排除掉否则构建上下文太大传输和构建都会变慢。3.3 K8s先吃透 Pod、Deployment、Service再谈搭建集群Kubernetes 是这个阶段最大的坎也是劝退率最高的技术点。很多人一上来就搜“K8s 集群搭建教程”跟着文档在三台机器上装了一整天最后发现证书、网络插件、kubelet 状态全是坑集群起来了却不知道下一步该干嘛。原因在于把“用 K8s”和“搭 K8s”混为一谈。实际工作中云厂商提供的托管集群已经帮你解决了大部分搭建问题运维工作重点在“怎么把应用跑好”而不是反复重装集群。学习顺序应该是先理解工作负载再上手集群。最小闭环是把容器应用变成 Pod用 Deployment 管副本用 Service 暴露访问入口。用 kubectl 操作这个过程非常直观# 声明一个2副本的Deployment镜像用nginx容器端口80 kubectl create deployment nginx-web --imagenginx:alpine --replicas2 --port80 # 把Deployment暴露成NodePort服务方便从集群外部访问 kubectl expose deployment nginx-web --typeNodePort --port80--replicas2声明期望状态是 2 个 PodK8s 会保证任何时刻接近这个数量一个 Pod 挂了会自动重建expose创建 Service--typeNodePort会在每台节点上分配一个高端口。这种“声明期望状态”的理念是整个 K8s 的核心你需要学会的是用 YAML 描述业务期望而不是手动重启节点上的某个进程。集群搭建不是完全不学而是放到“理解概念之后”。彼时你已经知道 Pod 是调度最小单位知道 kubelet 负责维护节点上的 Pod 生命周期再看搭建过程会有完全不同体感。学习环境用 Minikube 或 kind 这类单机方案就够安装率和使用体验都更适合练习。3.4 第二阶段自测条件能跑通一个容器化应用的最小闭环第二阶段的验收标准是不依赖别人帮助独立完成从镜像构建到应用访问的完整链路。具体拆成五步按顺序执行任何一步失败都必须找到原因再继续第一步写一个 Dockerfile把自己写的静态页面打进 Nginx 镜像构建成功并能在本地用docker run访问。第二步给容器挂载一个宿主机目录把页面文件放到宿主机后再启动容器验证修改宿主机文件后容器内内容同步更新。第三步写一个 deployment-nginx.yaml 文件定义 2 副本的 Deployment用kubectl apply -f部署到本地集群Pod 显示 Running。第四步创建一个 NodePort 类型的 Service通过浏览器访问到容器里的页面。第五步模拟故障演练手动删除一个 Pod观察 Deployment 自动拉起新副本。第五步是最能检验理解深度的实验。如果你能清楚说出“为什么删了 Pod 还会自动恢复”“要不要手动去节点上操作容器”说明你对控制器模式已经有基本概念。很多人在这一步会翻车——删了 Pod 后发现没恢复原因通常是 Deployment 的 YAML 里没写对 selector 或 replicas或者控制器根本没创建成功。这时候回头看日志、用kubectl describe deployment排查比对着教程再敲一遍更有价值。4. 第三阶段自动化与监控把重复事情交给工具把看不见的事情交给指标4.1 Ansible 自动化运维从免密到第一个 Playbook走完闭环自动化工具学哪个答案几乎只有一个Ansible。理由很现实它不需要在每台服务器上安装客户端只要控制端能通过 SSH 连过去就能执行任务学习成本比 Puppet、SaltStack 低一截绝大多数企业的初期自动化改造都是用它起步。第一步先解决免密登录。Ansible 要操作目标机器控制端就要能免密 SSH 到被管机器# 生成密钥对并把公钥分发到目标机器的root用户下 ssh-keygen -t ed25519 -N -f ~/.ssh/id_ed25519 ssh-copy-id root10.10.10.11ssh-keygen生成密钥对-t ed25519指定算法比 RSA 更安全且密钥更短-N 表示空密码这样 Ansible 执行任务时不会被密钥口令卡住-f指定密钥文件路径。ssh-copy-id会把公钥追加到目标机器的authorized_keys里。注意公钥和私钥的权限必须是600和700否则 SSH 会拒绝使用。免密配置好后写一个最小 Playbook目标是把 Nginx 装到所有 web 服务器上并启动--- - name: 初始化Nginx服务 hosts: web_servers become: yes tasks: - name: 安装nginx yum: name: nginx state: present - name: 启动并设置开机自启 systemd: name: nginx state: started enabled: yeshosts: web_servers指定执行范围对应你定义的 inventory 分组文件里的组名become: yes表示需要提权成 root因为安装软件要写系统目录。两个 task 一个负责安装一个负责启动并设置开机自启。Ansible 的核心特性是幂等重复执行同一个 Playbook不会重复安装或重复设置因为模块会检测状态是否已满足。学习 Ansible 的建议是不要同时学太多模块先把command、shell、copy、systemd、yum/apt、service这六个用熟。命令能完成的事情先尝试手工执行一遍再用 Ansible 去抽象成任务这样既保留排障手感又不会出现“自动化成功但不知细节”的空心状态。4.2 Prometheus 监控告警指标不是装出来的而是设计出来的监控工具里 Prometheus 是事实标准学习重点不是安装而是理解“拉取模型”和“指标设计”。拉取模型是 Prometheus 主动去每个 exporter 上抓取指标而不是等机器上报所以被监控对象只需要暴露一个 HTTP 端口指标设计的核心是“你要监控什么什么样的阈值才值得告警”。node_exporter 是采集主机指标最常用的组件启动后会在 9100 端口暴露 CPU、内存、磁盘、网络等数据。配合 PromQL 查询 CPU 使用率是每个监控教程都会出现的例子# 计算近5分钟CPU使用率排除空闲时间的影响 100 - avg(rate(node_cpu_seconds_total{modeidle}[5m])) * 100rate计算的是 5 分钟内每秒变化率modeidle只取空闲时间序列用 100 减去空闲占比得到使用率。这个查询本身不复杂难的是理解为什么不用node_cpu_seconds_total直接相加——因为它是累计计数器必须通过rate或increase转换成速率才有意义。云主机 CPU 使用率告警阈值通常设在 85% 以上持续 10 分钟而不是一超过 50% 就报警避免频繁误报让人产生告警疲劳。磁盘监控容易遗漏的一个指标是 inode 使用率磁盘空间还剩 20%但 inode 满了文件就创建不了服务照样报错。所以磁盘告警要同时监控空间和 inode这属于运维里的“血泪经验”——监控面板上看到的不一定就是真相关键指标要成对设防。4.3 日志、备份与灾难恢复习惯翻车时最后的后悔药自动化解决的是重复劳动监控解决的是及时发现而日志和备份解决的是“已经出事后能不能恢复”。这三个环节的价值往往要到真正翻车那一次才被体会到。日志管理的起点不需要上 ELK 全家桶先把本机日志用好再谈集中采集。在 systemd 系统里查看服务的日志优先用 journalctl# 查看指定服务最近30分钟日志加p参数实时跟踪 journalctl -u nginx --since -30m journalctl -u nginx -f--since -30m支持相对时间排查问题时比翻完整日志高效很多-f是 follow 模式类似tail -f适合边复现问题边看日志输出。注意排查应用故障时除了系统日志还要看应用自己的日志文件比如 Nginx 的error.log、Java 应用的stdout或指定路径的logs目录两者配合才能还原完整现场。备份策略方面记住 3-2-1 原则数据要保留三份放在两种不同介质上其中一份在异地。落到云环境上可以这样理解生产机的磁盘快照是一份副本备份系统里再存一份云厂商的对象存储或另一地域的冷存作为异地归档。备份后一定要定期做恢复演练否则备份本身就是一个黑匣子——你不知道它恢复出来是不是能用的。我见过不止一次备份任务显示成功但恢复时发现文件损坏原因就是备份过程中源数据正在写入导致快照不一致。5. 云计算运维学习路上的五个避坑点现象、原因与解决5.1 现象Linux 命令背得滚瓜烂熟一到排查故障就脑子转不动刚工作的人最容易出现这种状态单个命令都知道但到了故障现场不知道先敲什么像进了黑匣子找不到入口。原因把命令当知识点记忆没有建立“现象到证据链”的映射。故障排查不是回忆命令而是先判断“问题出在哪一层”再选对应的命令去验证。解决刻意固定排查顺序。不管什么故障先看uptime判断系统整体负载再用ps找进程然后用journalctl或应用日志定位根因最后再决定是改配置还是重启服务。坚持一个月就能形成肌肉记忆。5.2 现象K8s 学不会反复搭集群反复失败最后失去兴趣原因把“搭集群”当成了学习 K8s 的全部。三节点集群要处理证书、etcd、网络插件、kubelet 状态一堆问题任何一个环节报错都会把人拖进安装谜团里工作负载的概念反而没时间学。解决先把重心放在单机学习环境上用 Minikube 或 kind 快速起一个可用集群把 Pod、Deployment、Service 这几个核心对象用熟。等理解了调度和控制器机制再回头看多节点集群的安装文档才看得懂每一步在做什么。别在搭建上死磕你会感谢这个决定的。5.3 现象学会 Ansible 之后反而忘了怎么手工排障原因自动化用顺手后遇到问题第一反应是写 Playbook但 Playbook 失败的输出通常比手动执行命令更抽象没有手工排障经验的人看不懂报错背后的真实原因。解决自动化前先手工完成一遍任务再把步骤翻译成 Playbook。Playbook 出错时用ansible-playbook -l 目标主机配合-v增加输出详细程度把任务在单机上解开看每一步的实际效果而不是整个 Playbook 原地重跑。5.4 现象监控大屏做得很漂亮但真正出故障时告警一条都没响原因监控指标配置不全或阈值不合理。只配置了 CPU 和内存却忽略磁盘 inode、服务端口、接口时延这些关键指标或者阈值设得太宽等真正故障发生时指标还没触达告警线。解决告警指标要从业务视角反推不只盯机器资源。比如 Web 服务至少要监控 5 分钟访问量异常下跌、HTTP 5xx 比例上升、请求响应时间 P95 变化。每个告警规则配置完后做一次真实告警验证确认通知能到达不然监控就是摆设。5.5 现象用“重启大法”处理一切问题换到云上直接失灵原因本地虚拟机重启后环境还在但云主机重启可能伴随公网 IP 变化、临时数据丢失、服务依赖组件启动顺序不对重启不仅没用还可能让问题更难查。解决把重启当成最后手段而不是第一动作。遇到故障先采集状态和日志确认问题与内存泄漏、配置错误等状态有关且无法通过热修复解决时再重启并记录重启前后的状态变化。云计算运维里证据比动作更重要。6. 验证学习效果的捷径用面试题和故障演习检验是否真的会了学习路线走完不代表掌握真正的验证方式是“在不看资料的情况下讲给别人听”。我常用两个经典题目做自测。第一个是“一台云主机 CPU 飙到 100%你怎么查”能清晰地按“先uptime看负载类型再ps找进程再判断是代码死循环、慢查询还是别人攻击”这个链路讲出来就算过关。第二个是“网站访问返回 502你怎么排查”要能说出“先看负载均衡后端是否健康再看应用进程是否活着然后看应用日志和时间戳”三层递进而不是张口就说“重启一下”。这些题目背后验证的不是某条命令而是你有没有形成“现象分层、证据先行、动作在后”的排查框架。从桌面运维走向云计算运维这个框架决定了你是被动救火还是主动接管故障。进阶方向可以在自动化运维和运维开发之间选择前者深耕 Ansible、监控告警、容量规划后者需要补 Python 和云厂商 API把手工操作固化成平台能力。两条路都不错但前提是第一阶段的 Linux 和网络没有夹生。我现在的工作习惯是每学一个新工具都强迫自己在实验环境里“弄坏它一次再修好”而不是只看它正常运行时的表现。弄坏一次你对它的黑匣子就透亮了一块。这比重复建一百遍集群都管用。希望这条路线和里面的具体细节能帮你少踩点坑也少走点弯路。本文还有配套的精品资源点击获取
返回列表