简介:本资源是一份系统化、分层级的云原生技术学习路线图,面向开发者、运维工程师及希望转型云原生领域的IT从业者,解决技术栈庞杂、学习路径不清晰、各组件关系难把握等核心痛点。路线图PDF文件共1个,大小1.29MB,内容覆盖初阶(容器基础、Kubernetes入门、微服务与配置中心)、中阶(Service Mesh、Serverless框架、可观测性体系、CI/CD工具链)到高阶(边缘计算、联邦集群、安全合规、编程语言深度适配)三大能力层级,包含etcd/Nacos/Harbor/Istio/Prometheus/Grafana/Argo/Terraform等超80项主流技术组件的定位、演进关系与学习建议。已有1072人学习下载,图文并茂、模块清晰,支持快速定位技术坐标、规划成长路径,并附有CSDN官方出品背书与阿里云专家联合编写说明,是构建完整云原生知识图谱的权威导览工具。
1. 云原生不是“云里养的原生植物”,而是让软件在云上真正活起来的一套方法论
你有没有试过:写好一个程序,本地跑得飞快,一扔到服务器就报错?改个配置要重启整个服务,加个新功能得协调三四个团队排期?线上出问题,日志散在五六个地方,查半小时还找不到哪行代码惹的祸?——这些不是你技术不行,而是你还在用“搬砖式”思维做云上的事。云原生(Cloud Native)说白了,就是一套专为云环境设计的“软件生存指南”:它不教你怎么写算法,而是告诉你——怎么把应用拆得干净、部署得自动、扩容得无声、出错时自愈、升级时无感。它面向的不是资深架构师,恰恰是刚写完第一个 Spring Boot 的你、刚配通 Docker 的你、甚至还没听过 YAML 是什么但想搞懂“为什么别人上线像按开关,你上线像拆炸弹”的你。这份《云原生技术学习路线图.pdf》不是堆满术语的天书,而是一张手绘风格的“新手导航图”:从你今天能打开的终端开始,标出第一块路标在哪、哪里容易迷路、哪个岔口该左转别右拐。它不假设你会 Kubernetes,只假设你愿意花 20 分钟装个 Minikube,然后亲眼看到自己写的“Hello World”被自动扩成 3 个副本——那一刻,你就已经站在云原生的门口了。
2. 先搞懂一个核心逻辑:云原生 ≠ 把旧系统搬到云上,而是重写“软件该怎么呼吸”
云原生这个词常被误读成“上云就行”,结果很多人买了云服务器,把 Tomcat 手动解压、改配置、敲命令启动,再配上个 Nginx 反向代理——这叫“云托管”,不是云原生。真正的云原生,是让软件具备四种基础生命能力:可声明、可编排、可观测、可自治。我们不用背定义,用你熟悉的场景来对照:
2.1 可声明:用“说明书”代替“操作手册”
传统做法:上线一个服务,你要写文档说明“先执行systemctl start nginx,再改/etc/nginx/conf.d/app.conf,最后curl -I http://localhost:8080/health看返回码”。
云原生做法:你写一份 YAML 文件(就像菜谱),里面只写清楚“我要 2 个 Java 应用实例,每个 1G 内存,暴露 8080 端口,健康检查每 10 秒走一次/actuator/health”。Kubernetes 这个“大厨”拿到菜谱,自动完成所有操作,且持续盯着——如果某个实例挂了,它立刻按菜谱再炒一份新的。
提示:YAML 不是编程语言,是“结构化说明书”。它的核心就三条:
apiVersion(用哪个版本的说明书模板)、kind(你要声明什么,比如 Pod/Service/Deployment)、spec(具体要求,比如副本数、镜像名、端口)。初学时死记这三行,比背一百个字段有用。
2.2 可编排:让机器替你“协调多线程”
微服务不是简单地把单体拆成多个 jar 包。真正的难点在于:订单服务调用库存服务,库存服务又依赖用户中心,三个服务版本不同、部署位置不同、网络策略不同——谁先启?谁等谁?失败了怎么重试?云原生用“编排层”解决这个。比如 Istio 这类 Service Mesh 工具,会在每个服务旁悄悄注入一个“小管家”(Sidecar 代理),所有流量都先经过它:自动加熔断、自动埋链路追踪 ID、自动按权重切流量。你不用改一行业务代码,就能实现灰度发布。
注意:初学者最容易在这里翻车——急着装 Istio,结果发现连 Kubernetes 集群都没跑稳。记住:编排是“锦上添花”,不是“雪中送炭”。先确保你能用
kubectl apply -f deploy.yaml成功起一个 Pod,再谈 Service Mesh。
2.3 可观测:把黑匣子变成透明玻璃房
以前查问题靠“猜+日志 grep”:服务器卡顿?top看 CPU;接口慢?tail -f app.log搜关键词;数据库慢?show processlist。云原生把这三件事统一成标准动作:
- 指标(Metrics):用 Prometheus 定期抓取每个 Pod 的 CPU、内存、HTTP QPS、错误率,像汽车仪表盘一样实时显示;
- 日志(Logs):用 Fluentd 收集所有容器 stdout,统一送到 Loki(轻量级日志库),支持按服务名、Pod 名、时间范围快速检索;
- 链路(Tracing):用 Jaeger 记录一次请求经过了哪些服务、每段耗时多少,点击就能展开“调用瀑布图”。
这三者不是并列关系,而是递进:指标告诉你“哪里坏了”,日志告诉你“坏成什么样”,链路告诉你“坏在哪个环节”。
2.4 可自治:给软件装上“后悔药”和“自动修复包”
云原生系统默认接受“故障是常态”。所以它内置大量自愈机制:
- Deployment 控制器发现 Pod 崩溃,自动拉起新实例;
- HorizontalPodAutoscaler(HPA)根据 CPU 使用率,自动增减副本数;
- Liveness Probe(存活探针)定期访问
/health,连续失败 3 次就杀掉 Pod 重建; - Readiness Probe(就绪探针)确保只有处理请求能力正常的 Pod 才接收流量。
这些不是高级功能,而是云原生的“出厂设置”。你不需要写代码实现,只需要在 YAML 里加几行配置,就像给汽车设定“胎压低于 2.2bar 自动报警”一样自然。
3. 第一步别碰集群,先用 Minikube 在本机跑通一个“会自愈的 Hello World”
很多新手一上来就想搭高可用 Kubernetes 集群,装 etcd、配证书、调网络插件……结果卡在kubeadm init报错三天,直接劝退。其实云原生的第一课,根本不需要公网、不需要服务器、甚至不需要 Linux——你用 Windows 或 macOS,装个 Minikube,5 分钟就能跑通最核心的闭环:声明 → 部署 → 故障 → 自愈。下面带你一步步做,每一步都解释“为什么这么写”“删掉哪行会怎样”。
3.1 准备工作:装 Minikube 和 kubectl(10 分钟搞定)
先确认你有 Docker Desktop(Windows/macOS)或已安装 Docker(Linux)。然后执行:
# macOS 用户(用 Homebrew) brew install kubectl minikube # Windows 用户(用 Chocolatey) choco install kubernetes-cli minikube # Linux 用户(通用命令) curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && chmod +x kubectl && sudo mv kubectl /usr/local/bin/ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/提示:
kubectl是操作 Kubernetes 的“遥控器”,minikube是在你电脑里造一个“迷你云”的工具。它们的关系就像git和git clone——没有git,clone就没意义;没有minikube,kubectl就连不上任何集群。
3.2 启动你的第一个“云”:一条命令,一个虚拟机
minikube start --cpus=2 --memory=4096 --driver=docker这条命令做了三件事:
--cpus=2:分配 2 个 CPU 核心(避免卡顿);--memory=4096:分配 4GB 内存(Kubernetes 本身要吃 1.5G,留足余量);--driver=docker:明确用 Docker 当底层引擎(Windows/macOS 默认用 Hyper-V/VirtualBox,容易权限报错,强制指定 Docker 最稳)。
运行后你会看到类似Done! kubectl is now configured to use "minikube"的提示——这意味着你的遥控器(kubectl)已经对准了迷你云(minikube)。
3.3 写第一个云原生应用:一个带自愈能力的 Web 服务
新建文件hello-deploy.yaml,内容如下:
apiVersion: apps/v1 kind: Deployment metadata: name: hello-world spec: replicas: 2 # 我要 2 个一模一样的实例 selector: matchLabels: app: hello-world template: metadata: labels: app: hello-world spec: containers: - name: web image: nginx:alpine # 用超轻量的 Alpine 版 Nginx ports: - containerPort: 80 livenessProbe: # 存活探针:每 10 秒检查一次 httpGet: path: / port: 80 initialDelaySeconds: 5 # 启动后 5 秒再开始检查 periodSeconds: 10 readinessProbe: # 就绪探针:确保能接流量才加入负载均衡 httpGet: path: / port: 80 initialDelaySeconds: 3 periodSeconds: 5 --- apiVersion: v1 kind: Service metadata: name: hello-service spec: selector: app: hello-world ports: - protocol: TCP port: 80 targetPort: 80 type: NodePort # 把服务暴露到本机端口(方便浏览器访问)关键参数解释:
replicas: 2:不是“最多 2 个”,而是“必须保持 2 个”。如果手动kubectl delete pod xxx干掉一个,控制器 2 秒内就会新建一个补上;livenessProbe:模拟“心跳检测”。如果 Nginx 进程卡死(比如死循环),探针失败 3 次后自动重启容器;readinessProbe:防止“假活”。比如应用启动了但数据库连不上,就绪探针失败,Kubernetes 会暂时把它从 Service 的流量池里踢出去,等恢复再加回来;type: NodePort:Minikube 会随机分配一个 30000~32767 的端口(如 31234),你访问http://localhost:31234就能看到 Nginx 欢迎页。
3.4 部署、验证、制造故障、见证自愈
# 1. 部署应用 kubectl apply -f hello-deploy.yaml # 2. 查看部署状态(等 STATUS 变成 Running) kubectl get pods -w # 3. 获取服务地址(找到 NODE_PORT 列的数字) minikube service hello-service --url # 4. 在浏览器打开上面输出的地址(如 http://127.0.0.1:31234),看到 Nginx 页面即成功 # 5. 制造故障:手动删掉一个 Pod(模拟进程崩溃) kubectl get pods | grep hello-world | head -n1 | awk '{print $1}' | xargs kubectl delete pod # 6. 立刻执行 kubectl get pods,你会看到: # NAME READY STATUS RESTARTS AGE # hello-world-5c7b9d8f4d-abcde 1/1 Running 0 2m # hello-world-5c7b9d8f4d-fghij 0/1 Terminating 0 2m ← 这个正在删 # hello-world-5c7b9d8f4d-klmno 0/1 Pending 0 0s ← 这个正在建!白话解释:你删的不是“一个进程”,而是“一个声明”。Kubernetes 的控制器一直在监听“当前实际状态”和“你声明的目标状态”是否一致。一旦发现少了一个 Pod,它立刻触发重建流程——下载镜像、分配资源、启动容器、执行探针。整个过程无需人工干预,这就是“自治”的起点。
4. 新手必踩的 5 个坑:不是你手残,是没人告诉你这些“静默陷阱”
刚入门时,90% 的报错不是技术问题,而是环境或认知偏差导致的“静默陷阱”——错误信息很短,但原因藏得很深。我第一次照着教程跑通时,在这几个点上反复折腾了两天。现在把血泪经验浓缩成 5 条,每条都按“现象→原因→解决”给你写透:
4.1 现象:“kubectl get nodes” 显示NotReady,节点状态卡住
原因:Minikube 启动时 Docker 驱动未正确加载,或内存/CPU 分配不足(尤其 Windows/macOS 虚拟机默认只给 2G 内存,Kubernetes 组件启动失败)。
解决:
- 先停掉现有集群:
minikube stop; - 清理残留:
minikube delete; - 重新启动时显式指定资源:
minikube start --cpus=2 --memory=4096 --driver=docker; - 启动后执行
minikube status,确认host、kubelet、apiserver全部为Running。
4.2 现象:kubectl apply -f xxx.yaml报错error: unable to recognize "xxx.yaml": no matches for kind "Deployment"
原因:YAML 文件里apiVersion写错了。Kubernetes 1.20+ 已废弃extensions/v1beta1,必须用apps/v1;而Service必须用v1(不是core/v1)。
解决:
- 检查
kind: Deployment对应的apiVersion是否为apps/v1; - 检查
kind: Service对应的apiVersion是否为v1; - 用
kubectl api-resources命令查看当前集群支持的所有资源类型及对应版本(初学者建议截图保存,随时对照)。
4.3 现象:Pod 一直卡在ContainerCreating状态,kubectl describe pod xxx显示Failed to pull image "nginx:alpine"
原因:Docker 镜像仓库访问受限(国内网络环境下,Docker Hub 拉取速度极慢甚至超时),但错误信息只显示“拉取失败”,不提示网络问题。
解决:
- 用国内镜像源加速:
minikube ssh进入虚拟机,执行echo '{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }' | sudo tee /etc/docker/daemon.json sudo systemctl restart docker - 或直接换更稳定的镜像:把 YAML 中
image: nginx:alpine改成image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx:alpine(阿里云公开镜像站,免登录)。
4.4 现象:浏览器打不开minikube service xxx --url输出的地址,提示连接被拒绝
原因:type: NodePort模式下,Minikube 生成的 URL 是虚拟机 IP(如192.168.49.2:31234),但你在宿主机浏览器访问的是localhost。Minikube 默认不自动做端口映射。
解决:
- 方法一(推荐):用
minikube service hello-service命令(不加--url),它会自动在默认浏览器打开,并通过socat做端口转发; - 方法二:手动获取宿主机可访问地址:
minikube ip得到虚拟机 IP,再结合kubectl get service hello-service查看NODE_PORT列,拼成http://<minikube-ip>:<node-port>(如http://192.168.49.2:31234)。
4.5 现象:livenessProbe配置后,Pod 反复重启(RESTARTS数字不断上涨)
原因:探针路径或端口写错。比如 Nginx 默认根路径是/,但你写了/health;或者容器里服务监听8080端口,但containerPort写成80。
解决:
- 先确认容器内服务真实监听地址:
kubectl exec -it <pod-name> -- netstat -tuln | grep LISTEN; - 再确认探针配置与之匹配:
httpGet.path必须是服务能返回 200 的路径,port必须是containerPort值; - 临时关闭探针调试:注释掉
livenessProbe和readinessProbe块,确认服务能正常访问后再逐步加回。
5. 下一步学什么?按“能动手”优先级排序的 3 条实战路径
你现在已具备一个关键能力:用声明式 YAML 描述需求,让 Kubernetes 自动交付结果。接下来不是狂背概念,而是沿着三条“能立刻写出代码、立刻看到效果”的路径深化。我按新手友好度从高到低排序,每条都给出具体动作、避坑点和预期成果:
5.1 路径一:给你的 Spring Boot 项目加上“云原生身份证”(1 天可完成)
目标:把你本地跑的 Spring Boot 项目(哪怕只是@RestController返回 "Hello World"),打包成 Docker 镜像,部署到 Minikube,并配置健康检查。
具体动作:
- 步骤 1:在 Spring Boot 项目根目录新建
Dockerfile:FROM openjdk:17-jdk-slim VOLUME /tmp ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] - 步骤 2:用 Maven 打包:
mvn clean package -DskipTests; - 步骤 3:构建镜像并推入 Minikube 内置 Registry:
# 启用 Minikube 的 registry 插件(避免 push 到远程仓库) minikube addons enable registry # 构建镜像(注意:必须用 eval $(minikube docker-env) 切换到 Minikube 的 Docker 上下文) eval $(minikube docker-env) docker build -t my-spring-app . - 步骤 4:写
spring-deploy.yaml,把image: nginx:alpine替换成image: my-spring-app,并把livenessProbe的path改成/actuator/health(Spring Boot Actuator 默认提供)。
避坑点: eval $(minikube docker-env)必须在构建镜像前执行,否则docker build会推到你本地 Docker,Minikube 看不见;- Spring Boot 默认不开启 Actuator,需在
pom.xml加<artifactId>spring-boot-starter-actuator</artifactId>,并在application.yml加management.endpoints.web.exposure.include: health,info。
预期成果:浏览器访问minikube service spring-service,看到你的 Spring Boot 返回值;手动kill -9进程后,Pod 自动重建,服务不中断。
5.2 路径二:用 Helm 把重复配置“封装成安装包”(半天可完成)
目标:你发现每次部署都要写一堆 YAML(Deployment + Service + ConfigMap + Secret),稍有改动就得全改。Helm 就是 Kubernetes 的“安装包管理器”,能把这些文件打包成可复用的 Chart。
具体动作:
- 步骤 1:安装 Helm:
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash; - 步骤 2:创建 Chart:
helm create mychart(生成标准目录结构); - 步骤 3:把你之前写的
hello-deploy.yaml拆解:templates/deployment.yaml放 Deployment 模板;templates/service.yaml放 Service 模板;values.yaml里定义变量:replicaCount: 2,image: nginx:alpine;
- 步骤 4:部署:
helm install my-release ./mychart。
避坑点: - 初学者别碰
Chart.yaml里的dependencies(子 Chart),先专注单 Chart; values.yaml是唯一需要手动改的文件,其他.yaml模板里用{{ .Values.replicaCount }}引用,改一处全局生效。
预期成果:执行helm list看到my-release,helm upgrade my-release ./mychart --set replicaCount=3一键扩容到 3 副本。
5.3 路径三:用 Prometheus + Grafana 看懂“你的服务到底在忙什么”(2 天可完成)
目标:不再靠curl和log grep查问题,而是打开 Grafana 看板,一眼看出“哪个接口响应最慢”“哪个 Pod 内存飙升”。
具体动作:
- 步骤 1:启用 Minikube 的 metrics-server 插件:
minikube addons enable metrics-server; - 步骤 2:部署 Prometheus Operator(官方推荐方式):
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup/ kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/ - 步骤 3:端口转发访问 Grafana:
kubectl port-forward svc/grafana 3000:3000 -n monitoring,浏览器打开http://localhost:3000(默认账号 admin/admin); - 步骤 4:导入预设看板(ID
6417是 Kubernetes Cluster Monitoring),选择prometheus-k8s数据源。
避坑点: - 不要自己手写 Prometheus 配置文件,Operator 会自动生成;
- Grafana 看板数据延迟约 30 秒,刚部署别急着刷新;
- 如果看板空白,检查
kubectl get pods -n monitoring,确保prometheus-k8s-0和grafana-xxx状态为Running。
预期成果:在 Grafana 看板上,你能看到: - 集群整体 CPU/Memory 使用率曲线;
- 每个 Pod 的实时请求 QPS、P95 延迟、错误率;
- 点击某个 Pod,下钻看到其 JVM GC 次数、线程数、HTTP 接口 TOP10 耗时。
从那以后我每次给新人讲云原生,都强制他们先完成这三件事:用 Minikube 跑通自愈 Hello World、把 Spring Boot 打包部署、用 Grafana 看到自己服务的实时指标。不是因为它们多难,而是因为只有亲手看到“声明 → 自动交付 → 自动修复 → 自动监控”的完整闭环,人才会真正相信:云原生不是画饼,它就长在你敲下的每一行 YAML 里,跑在你本机的每一个 Pod 中。希望帮到你。
本文还有配套的精品资源,点击获取