简介:本资源是一份系统化、分层级的云原生技术学习路线图PDF文档,面向开发者、运维工程师及希望系统掌握云原生体系的技术从业者,解决技术栈庞杂、学习路径模糊、知识碎片化等典型痛点。文件共1个PDF,大小1.29MB,内容结构清晰分为初阶、中阶、高阶三大部分,覆盖容器(Docker/Kubernetes)、微服务(Dubbo/Spring Cloud/Service Mesh)、Serverless(Knative/Fission/OpenFaaS)、DevOps(Jenkins/Argo/Tekton)、可观测性(Prometheus/Grafana/ELK/Loki)、云原生中间件(etcd/Nacos/MinIO/Harbor)及前沿方向(OAM/KubeVela/Cloud Events)等核心模块,并标注各技术组件的定位与演进关系。已有1071人学习下载,文档由阿里云技术专家王银利、孙林林参与编写,出品方为CSDN,附完整路线图链接与版权声明,便于读者按图索骥、规划长期成长路径。
1. 云原生技术学习路线图:不是一张PDF,而是一套可执行的「能力编排流水线」
你下载过《云原生技术学习路线图.pdf》,打开后发现是张密密麻麻的思维导图——Docker 在左上角,Kubernetes 在中央,Service Mesh、Serverless、GitOps 像卫星一样绕着转,最底下还写着「掌握 DevOps 工程文化」。但真正动手时,卡在 Docker Desktop 启动失败、kubectl get nodes返回No resources found、docker build报错failed to solve with frontend dockerfile.v0……这不是资料不全,而是这张图缺了最关键的维度:时间粒度 + 环境约束 + 能力验证锚点。它没告诉你,学完 Docker 基础命令后,必须用docker run --rm -v $(pwd):/workspace alpine sh -c "ls -l /workspace"验证挂载是否生效;没标出 Kubernetes v1.26+ 已弃用 PodSecurityPolicy,却仍把 PSP 当必学项;更没提醒你——在 Windows 上装 Docker Desktop 前,必须先确认 WSL2 内核版本 ≥ 5.10.60.2,否则会卡在[init] using kubernetes version: v1.26.0 [preflight] running pre-flight checks这一行死循环。这张 PDF 的真实价值,不是照着读,而是把它当「能力缺口诊断表」:每完成一个节点,你得能跑通对应环境下的最小可验证单元(MVU),比如用kind create cluster拉起单节点集群并部署一个带 readinessProbe 的 Nginx,才算真正「通关」。适合两类人:刚从 Spring Boot 单体架构转过来、被 CI/CD 流水线卡住的后端工程师;以及运维出身、想摆脱手动部署、但对声明式配置总摸不透边界的 SRE。
2. 从零构建本地云原生沙盒:用 Kind + Docker Desktop 打通最小闭环
云原生学习最大的陷阱,是过早跳进公有云控制台或企业级平台(如 Rancher、OpenShift)。真实生产环境的复杂度会淹没基础概念——你连kubectl apply -f和kubectl patch的语义差异都没厘清,就被迫处理多租户网络策略和 etcd 备份。所以第一阶段必须锁定「本地可复现、失败可重置、资源可计量」的沙盒。我坚持用 Kind(Kubernetes in Docker)而非 Minikube,原因很实际:Kind 容器化 master/node,启动快(<30s)、无虚拟机层开销、天然兼容 Docker Desktop 的 WSL2 backend,且 v0.20+ 版本已内置对 Kubernetes v1.26+ 的完整支持,避免virtualization support not detected类报错。
2.1 环境预检:Windows/macOS/Linux 三端统一校验清单
在任何操作系统上执行以下命令前,请先确认:
# Windows (PowerShell as Admin) wsl -l -v # 必须看到 WSL2 发行版,且内核版本 ≥ 5.10.60.2 # 若为 WSL1,执行:wsl --set-version <distro-name> 2 # macOS sysctl kern.hv_support # 输出 1 表示 Hypervisor.framework 已启用(M1/M2 芯片默认开启) # Linux (Ubuntu/CentOS) systemctl is-active docker # 必须返回 "active";若为 "inactive",需 sudo systemctl start docker提示:Docker Desktop 安装后默认启用 Kubernetes,但这是个「假集群」——它实际调用的是
docker-desktop这个隐藏的 Kind 集群,无法直接kubectl config use-context切换,且kubectl get nodes显示的 node name 是docker-desktop,与标准 Kind 集群的kind-control-plane不同。这会导致后续 Helm Chart 测试失败。因此,务必禁用 Docker Desktop 内置 Kubernetes,改用独立 Kind 集群。
2.2 用 Kind 创建符合 v1.26+ 规范的单节点集群
Kind 配置文件kind-config.yaml必须显式声明 CRI 和 Kubernetes 版本,因为 v1.26+ 默认禁用 dockershim,而 Kind v0.20+ 已切换至 containerd:
# kind-config.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 kubeadmConfigPatches: - | kind: InitConfiguration nodeRegistration: criSocket: unix:///run/containerd/containerd.sock - | kind: JoinConfiguration nodeRegistration: criSocket: unix:///run/containerd/containerd.sock nodes: - role: control-plane kubeadmConfigPatches: - | kind: InitConfiguration localAPIEndpoint: advertiseAddress: "192.168.49.1" extraPortMappings: - containerPort: 80 hostPort: 80 protocol: TCP - containerPort: 443 hostPort: 443 protocol: TCP image: kindest/node:v1.26.0@sha256:717a29e4b044271822114566141425a444498975e0b4524811520b4095455595执行创建:
# 1. 删除可能存在的旧集群 kind delete cluster --name kind # 2. 创建新集群(指定配置文件) kind create cluster --config kind-config.yaml --name kind # 3. 验证集群状态(关键检查点) kubectl get nodes -o wide # 输出应包含 STATUS=Ready, ROLES=control-plane, VERSION=v1.26.0 kubectl get pods -A # core-dns, kube-proxy, etcd 等系统 Pod 必须为 Running 状态 # 若出现 ContainerCreating 或 Pending,执行: kubectl describe pod -n kube-system <pod-name> # 重点看 Events 中的 Warning,常见原因是 containerd 镜像拉取超时逻辑说明:kindest/node:v1.26.0镜像是 Kind 官方预编译的节点镜像,其sha256校验值确保你拉取的是纯净版(非社区魔改版)。criSocket显式指向 containerd,规避了 v1.26+ 因 dockershim 移除导致的节点注册失败。extraPortMappings将宿主机 80/443 映射到集群内网,使你能直接用curl http://localhost访问服务,省去kubectl port-forward的临时操作。
2.3 部署首个云原生工作负载:Nginx + Readiness Probe 验证健康检查机制
不要一上来就部署微服务。用最简 Nginx 镜像验证 Kubernetes 的核心能力链:Pod 生命周期管理、探针机制、Service 网络暴露。
# nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.23-alpine ports: - containerPort: 80 readinessProbe: httpGet: path: /healthz port: 80 initialDelaySeconds: 5 periodSeconds: 10 timeoutSeconds: 3 failureThreshold: 3 livenessProbe: httpGet: path: /healthz port: 80 initialDelaySeconds: 15 periodSeconds: 20 restartPolicy: Always --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: NodePort应用并验证:
# 部署 kubectl apply -f nginx-deployment.yaml # 等待 Pod Ready(注意:readinessProbe 会延迟 Pod 进入 Ready 状态) kubectl get pods -l app=nginx -w # 直到 STATUS 变为 "2/2"(表示 2 个容器都 Ready) # 查看 Service 分配的 NodePort kubectl get service nginx-service # 输出类似:nginx-service NodePort 10.96.123.45 <none> 80:31234/TCP 1m # 从宿主机 curl(利用前面配置的 port mapping) curl http://localhost # 应返回 Nginx 默认欢迎页 HTML # 强制触发 readinessProbe 失败(模拟真实故障) kubectl exec -it $(kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.name}') -- sh -c "echo 'down' > /usr/share/nginx/html/healthz" # 观察 Pod 状态变化 kubectl get pods -l app=nginx # 10 秒后(periodSeconds=10),该 Pod 的 READY 状态会从 "2/2" 变为 "1/2" # 此时 Service endpoint 会自动剔除该 Pod,流量只打向剩余健康的 Pod参数说明:initialDelaySeconds是探针启动前的等待时间,避免容器未启动就探测;failureThreshold是连续失败次数阈值,设为 3 意味着连续 3 次探测失败才触发动作(如重启容器);NodePort类型让 Service 通过宿主机端口暴露,比ClusterIP更易验证网络连通性。这个 MVU 验证了 Kubernetes 的三个核心能力:声明式部署(Deployment)、自愈机制(Probe)、服务发现(Service)。
3. Docker 镜像构建实战:从 Dockerfile 编写到多阶段构建避坑指南
很多初学者认为「会写FROM ubuntu:22.04就算会 Docker」,结果在docker build时遭遇failed to solve with frontend dockerfile.v0或permission denied while trying to connect to the Docker daemon socket。根本原因在于:Dockerfile 不是脚本,而是构建上下文(build context)与层缓存(layer cache)的协同协议。你写的每一行RUN都生成一个新镜像层,而COPY指令的路径必须相对于docker build命令的当前目录(即 build context root),而非 Dockerfile 所在目录——这是 80% 构建失败的根源。
3.1 最小可行 Dockerfile:以 Python Flask 应用为例
假设项目结构如下:
my-flask-app/ ├── app.py ├── requirements.txt └── Dockerfileapp.py内容:
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "Hello from Cloud Native!" if __name__ == '__main__': app.run(host='0.0.0.0:5000')requirements.txt:
Flask==2.2.5Dockerfile(严格遵循最佳实践):
# 第一阶段:构建阶段(使用 builder 镜像) FROM python:3.11-slim AS builder # 设置工作目录(必须在 COPY 前) WORKDIR /app # 复制依赖文件(单独一层,利用 layer cache) COPY requirements.txt . # 安装依赖(pip install --no-cache-dir 避免缓存污染) RUN pip install --no-cache-dir -r requirements.txt # 第二阶段:运行阶段(使用更小的 alpine 镜像) FROM python:3.11-alpine # 复制第一阶段安装的依赖和源码 COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages COPY --from=builder /usr/local/bin/pip /usr/local/bin/pip COPY . . # 暴露端口(仅声明,不实际监听) EXPOSE 5000 # 设置非 root 用户(安全基线) RUN addgroup -g 1001 -f app && adduser -S app -u 1001 USER app # 启动命令(使用 exec 形式,避免 shell wrapper) CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--workers", "2", "app:app"]构建与运行:
# 确保在 my-flask-app/ 目录下执行 cd my-flask-app # 构建(指定 Dockerfile 路径,-t 为镜像 tag) docker build -t my-flask-app . # 运行(-p 将宿主机 5000 映射到容器 5000,--rm 表示退出后自动删除容器) docker run -p 5000:5000 --rm my-flask-app # 验证 curl http://localhost:5000 # 返回 "Hello from Cloud Native!"逻辑说明:多阶段构建(Multi-stage Build)将构建环境(python:3.11-slim)与运行环境(python:3.11-alpine)分离,最终镜像大小从 900MB 降至 120MB。COPY --from=builder只复制必要文件,避免将构建工具(如 gcc)打入生产镜像。USER app强制以非 root 用户运行,满足 CIS Docker Benchmark 安全要求。CMD使用 exec 形式(数组语法),确保进程 PID=1,能正确接收 SIGTERM 信号实现优雅关闭。
3.2 Docker Desktop 权限与网络问题排查:WSL2 下的典型故障树
在 Windows 上,Docker Desktop 与 WSL2 集成后,常出现failed to connect to the docker api at npipe:////./pipe/dockerdesktoplinuxen或docker network不通。这不是 Docker 本身故障,而是 WSL2 子系统与 Windows 主机的 IPC 通道异常。以下是按优先级排序的排查路径:
| 现象 | 原因 | 解决方案 |
|---|---|---|
docker ps报错Cannot connect to the Docker daemon | Docker Desktop 服务未启动,或 WSL2 发行版未注册到 Docker Desktop | 1. 在 Windows 任务栏右键 Docker 图标 →Restart;2. 打开 PowerShell,执行wsl -l -v确认发行版状态,若为Stopped,执行wsl -t <distro-name>启动;3. 在 Docker Desktop Settings → Resources → WSL Integration,勾选对应发行版 |
docker run -p 8080:80 nginx后curl http://localhost:8080超时 | WSL2 网络与 Windows 主机网络隔离,端口映射未生效 | 1. 确保 Docker Desktop 设置中Enable integration with Windows Subsystem for Linux已开启;2. 在 WSL2 终端中执行cat /etc/resolv.conf,确认 nameserver 是172.???.???.1(Docker Desktop 分配的网关);3. 若仍不通,重启 WSL2:wsl --shutdown,再重新启动 Docker Desktop |
docker build时COPY failed: forbidden path outside the build context | Dockerfile 中COPY路径超出docker build命令的当前目录 | 1. 执行docker build时,必须在项目根目录(即包含 Dockerfile 的目录);2.COPY指令的源路径必须是相对路径,如COPY requirements.txt .,不能写COPY ../requirements.txt .;3. 若需跨目录,用.dockerignore排除无关文件,或重构项目结构 |
注意:
docker desktop 汉化包 asxez/dockerdesktop-cn属于第三方修改,会破坏 Docker Desktop 的签名验证,导致更新失败或功能异常。官方明确不支持汉化包,所有界面文字应以英文为准——这反而是降低认知负荷的捷径,因为 Kubernetes/YAML/CLI 的术语全球统一。
4. Kubernetes 核心对象实操:Deployment、Service、ConfigMap 三件套落地验证
学 Kubernetes 最大的误区,是把kubectl get pods当成「学会了」。真正的门槛在于理解对象间的依赖关系与生命周期绑定。比如Deployment控制ReplicaSet,ReplicaSet创建Pod,而Pod的 IP 是临时的;Service通过 label selector 关联Pod,但Service的 ClusterIP 是稳定的。这三层抽象必须亲手拆解,才能应对生产环境中的滚动更新、蓝绿发布等场景。
4.1 用 kubectl 命令链还原对象关系图
不要依赖可视化工具。用原生命令逐层展开,建立心智模型:
# 1. 查看 Deployment(顶层控制器) kubectl get deployment nginx-deployment -o wide # 输出包含 DESIRED/READY/UP-TO-DATE/AVAILABLE 字段,反映期望副本数与实际就绪数 # 2. 查看 Deployment 管理的 ReplicaSet(中间层) kubectl get replicaset -l app=nginx # 输出类似:nginx-deployment-7c8c5d9b45 2 2 2 2m # 3. 查看 ReplicaSet 创建的 Pod(底层实例) kubectl get pods -l app=nginx -o wide # 输出包含 NODE/IP/STATUS 字段,注意 IP 是集群内网 IP(如 10.244.0.3) # 4. 查看 Service 如何关联 Pod kubectl get service nginx-service -o wide # 输出中 ENDPOINTS 字段显示 "10.244.0.3:80,10.244.0.4:80" —— 这正是上一步 Pod 的 IP:Port # 5. 深入查看 Service 的 Endpoints 对象(Service 的数据平面) kubectl get endpoints nginx-service # 输出与上一步 ENDPOINTS 字段一致,证明 Service 通过 Endpoints 对象动态维护后端列表 # 6. 强制删除一个 Pod,观察自愈过程 kubectl delete pod -l app=nginx --force --grace-period=0 # 等待 10 秒,执行 kubectl get pods -l app=nginx,会发现新 Pod 已创建,且 IP 变化 # 再执行 kubectl get endpoints nginx-service,ENDPOINTS 列已自动更新为新 IP逻辑说明:-l app=nginx是 label selector,贯穿所有命令,体现 Kubernetes 的声明式设计哲学——你声明「想要什么」(label),系统自动保证「达到什么」(actual state)。--force --grace-period=0强制立即删除 Pod,触发 Deployment 的自愈逻辑(创建新 Pod)。Endpoints 对象是 Service 与 Pod 之间的桥梁,由 kube-controller-manager 自动维护,无需人工干预。
4.2 ConfigMap 注入配置:从环境变量到卷挂载的演进路径
硬编码配置(如ENV DATABASE_URL=...)是云原生大忌。ConfigMap 是解耦配置与镜像的标准方式。但新手常混淆envFrom与volumeMount的适用场景。
# configmap-demo.yaml apiVersion: v1 kind: ConfigMap metadata: name: app-config data: APP_ENV: "production" LOG_LEVEL: "info" # 注意:此处 value 是字符串,非 JSON --- apiVersion: v1 kind: Pod metadata: name: configmap-pod spec: containers: - name: nginx image: nginx:1.23-alpine envFrom: - configMapRef: name: app-config # 方式1:通过 envFrom 注入所有 key 为环境变量 env: - name: CUSTOM_VAR value: "override" # 方式2:单独定义环境变量,可覆盖 ConfigMap 中同名 key volumeMounts: - name: config-volume mountPath: /etc/config readOnly: true volumes: - name: config-volume configMap: name: app-config # 方式3:挂载为文件,每个 data key 生成一个文件验证注入效果:
# 创建 ConfigMap 和 Pod kubectl apply -f configmap-demo.yaml # 进入 Pod 查看环境变量 kubectl exec -it configmap-pod -- sh -c 'printenv | grep -E "APP_ENV|LOG_LEVEL|CUSTOM_VAR"' # 输出:APP_ENV=production, LOG_LEVEL=info, CUSTOM_VAR=override # 查看挂载的文件 kubectl exec -it configmap-pod -- ls -l /etc/config # 输出:APP_ENV LOG_LEVEL(两个文件) kubectl exec -it configmap-pod -- cat /etc/config/APP_ENV # 输出:production参数说明:envFrom适合注入少量、简单的键值对(如开关、级别);volumeMount适合注入结构化配置(如 YAML/JSON 文件),且支持热更新(修改 ConfigMap 后,挂载的文件内容会自动更新,无需重启 Pod);env单独定义可覆盖 ConfigMap 中的同名 key,实现环境差异化(如 dev/staging/prod 共享大部分配置,仅覆盖少数字段)。
5. 云原生学习避坑指南:5 个血泪经验换来的硬核教训
云原生的学习曲线陡峭,不是因为概念难,而是因为「环境不可控」和「错误信息误导」。以下是我踩过的坑,按发生频率排序,每一条都附带可立即执行的验证命令。
5.1 现象:kubectl get nodes返回空,但docker ps显示 kind-control-plane 容器在运行
原因:Kind 集群的 kubeconfig 未正确加载到~/.kube/config,或KUBECONFIG环境变量被污染。
解决:
# 1. 查看当前 kubeconfig 指向 kubectl config view --minify --output 'jsonpath={..name}' # 2. 若输出为空或不是 "kind-kind",则重置 context kind export kubeconfig --name kind # 该命令会将 Kind 集群配置写入 ~/.kube/config,并设置当前 context 为 kind-kind # 3. 验证 kubectl config current-context # 应输出 "kind-kind" kubectl get nodes # 应显示节点信息5.2 现象:docker build报错failed to solve with frontend dockerfile.v0
原因:Docker Desktop 的 BuildKit 后端异常,或构建上下文过大触发内存限制。
解决:
# 1. 临时禁用 BuildKit(回归经典 builder) DOCKER_BUILDKIT=0 docker build -t test . # 2. 若成功,则问题在 BuildKit;启用 BuildKit 但限制内存 export DOCKER_BUILDKIT=1 # 在 Docker Desktop Settings → Docker Engine,添加: # { "features": { "buildkit": true }, "builder": { "gc": { "enabled": true, "defaultKeepStorage": "20GB" } } } # 3. 清理构建缓存 docker builder prune -a5.3 现象:kubectl apply -f后 Pod 一直处于ContainerCreating状态
原因:镜像拉取失败(私有仓库未配置 secret)或存储卷(PersistentVolume)未就绪。
解决:
# 1. 查看 Pod 事件(最直接线索) kubectl describe pod <pod-name> # 2. 若 Events 中出现 "Failed to pull image",检查镜像名拼写及仓库权限 # 3. 若出现 "Unable to attach or mount volumes",检查 PVC 状态 kubectl get pvc # 若 STATUS 为 Pending,检查对应的 StorageClass 是否存在且 provisioner 正常 kubectl get storageclass5.4 现象:curl http://localhost返回 connection refused,但kubectl get service显示 NodePort 正常
原因:Docker Desktop 的 Kubernetes 服务未启用,或 Kind 集群未配置extraPortMappings。
解决:
# 1. 确认使用的是 Kind 集群(非 Docker Desktop 内置集群) kubectl config current-context # 必须是 "kind-kind" # 2. 检查 Kind 集群配置是否包含 port mapping kind get clusters # 若为 "kind",则执行:kind export kubeconfig --name kind # 3. 重新应用 Service,确保 type=NodePort 且 port 映射正确 kubectl patch service nginx-service -p '{"spec":{"type":"NodePort"}}' kubectl get service nginx-service # 确认 PORT(S) 列含 "80:3XXXX/TCP"5.5 现象:docker run --rm -it ubuntu:22.04 bash进入容器后apt update报错Could not resolve 'archive.ubuntu.com'
原因:WSL2 的 DNS 配置被 Docker Desktop 覆盖,或/etc/resolv.conf指向错误 nameserver。
解决:
# 1. 在 WSL2 终端中检查 DNS cat /etc/resolv.conf # 正常应为:nameserver 172.???.???.1(Docker Desktop 网关) # 2. 若为 8.8.8.8 或其他地址,手动修复 echo "nameserver 172.???.???.1" | sudo tee /etc/resolv.conf # 3. 重启 WSL2 网络 sudo service docker restart6. 用「能力验证锚点」替代学习路线图:我的每日 30 分钟实操法
那张《云原生技术学习路线图.pdf》我至今还放在桌面,但它早已不是导航图,而是我的「能力缺口诊断表」。我每天只做一件事:选一个节点(比如「Helm 包管理」),然后问自己三个问题:1)我能用 Helm 3 在 Kind 集群上部署一个带 ConfigMap 的 Nginx Chart 吗?2)我能修改 values.yaml 中的 replicaCount 并helm upgrade实现滚动更新吗?3)我能用helm template渲染出 YAML 并用kubectl apply -f -手动部署吗?只有全部答「是」,才算这个节点「通关」。这种做法让我避开两个陷阱:一是「看过=学会」的幻觉,二是「追新」的焦虑——当别人在讨论 Kubernetes v1.27 的新特性时,我还在反复验证 v1.26 的PodDisruptionBudget是否真能保护我的有状态应用。
6.1 构建个人能力验证库:用 Git 管理你的 MVU(最小可验证单元)
我维护一个私有 Git 仓库cloud-native-mvu,目录结构如下:
cloud-native-mvu/ ├── docker/ │ ├── build-context/ │ │ └── flask-app/ # 完整的 Flask 项目,含 Dockerfile & CI 脚本 │ └── verify.sh # 一键验证:build → run → curl → cleanup ├── k8s/ │ ├── kind-cluster/ │ │ ├── setup.sh # 创建集群 + 验证节点状态 │ │ └── teardown.sh # 清理集群 │ └── nginx-deployment/ │ ├── deploy.sh # apply + wait for ready + curl test │ └── rollback.sh # 模拟故障并回滚 └── devops/ └── github-actions/ ├── ci.yml # 构建镜像并推送到 ghcr.io └── cd.yml # 部署到 Kind 集群每个*.sh脚本都遵循同一模式:
- 开头
set -euxo pipefail确保任意命令失败立即退出; - 中间用
kubectl wait --for=condition=Ready pod -l app=xxx --timeout=60s等待资源就绪; - 结尾用
curl -f http://localhost:xxx验证服务可达性; - 全流程耗时控制在 90 秒内,失败时输出清晰错误码。
6.2 参数调优表格:让每次实验都有可复现的基线
云原生工具链的参数繁多,但真正影响落地效果的只有几个关键开关。我把它们整理成速查表,贴在显示器边框上:
| 工具 | 参数 | 推荐值 | 作用 | 验证命令 |
|---|---|---|---|---|
kind create cluster | --image | kindest/node:v1.26.0@sha256:... | 锁定 Kubernetes 版本,避免自动升级导致行为变更 | kubectl version --short |
docker build | --no-cache | true(调试时) | 跳过层缓存,确保每次构建都从头开始 | docker images | grep <tag> |
kubectl apply | --dry-run=client | -o yaml | 生成 YAML 但不提交,用于代码审查 | kubectl apply -f xxx.yaml --dry-run=client -o yaml > rendered.yaml |
helm install | --create-namespace | true | 自动创建命名空间,避免Namespace not found错误 | kubectl get ns | grep <ns-name> |
kubectl rollout | --timeout | 60s | 设置滚动更新超时,防止卡死 | kubectl rollout status deploy/<name> --timeout=60s |
最后一点私人习惯:我从不用「云原生开发-gpu配额已不够预冻结」这类告警当学习障碍。GPU 配额不足?那就用 CPU 仿真——docker run --cpus=2 ubuntu:22.04 stress-ng --cpu 2 --timeout 30s同样能验证资源限制效果。真正的云原生能力,不在于你用了多少 GPU,而在于你能否用最简资源,跑通最核心的声明式交付闭环。希望帮到你。
本文还有配套的精品资源,点击获取