K8S、AI、云原生架构师,这三个词放在一起,大概是这几年技术圈里最值钱的组合了。但很多人学K8S的过程只有一种感受:资料铺天盖地,却始终像在雾里航行。今天YAML语法,明天调度器源码,后天又刷到一篇大模型推理部署的硬核实践,学得越深越不知道自己到底该掌握什么,最后折腾两个月还是只会用Docker运行一个容器。更别说“AI”这个变量加进来之后,GPU调度、推理弹性、模型版本管理这些概念,又把学习门槛抬高了一大截。
这篇文章就是用来拆这道题的。我先说清楚这个内容是什么:一条面向K8S AI云原生架构师的高效学习路线,重点不是“多看”,而是“怎么在短时间内完成闭环”——环境开箱即用,路线按周排好,实战项目能写进简历。适合谁看?运维工程师想转架构方向、后端工程师想把AI负载跑上K8S、算法工程化同学想搞清楚模型部署背后的基础设施逻辑,这几类人都能用得上。如果你已经能熟练写Dockerfile但还不清楚“云原生”到底和普通容器化差在哪,这篇文章正好可以帮你把那个断层补上。
1. 开箱前先想清楚:云原生架构师一天到底在解决什么问题
1.1 传统部署模式的三个死穴,和K8S给出的解法
学习K8S之前,必须先理解K8S到底在解决什么,否则你学到的只是“怎么配置一个工具”,而不是“怎么设计一套系统”。我个人把它总结成传统部署模式的三个死穴:
第一是雪花服务器问题。每台机器都是手工配置的,配置遗漏了、版本漂移了,别人根本没法接手。第二是扩容效率问题。业务峰值来了,你统计完容量、申请完机器、部署完代码,峰值已经过去了。第三是故障恢复问题。进程挂了需要人工发现、人工重启,半夜被叫起来处理告警是常态。
K8S对这三个问题的解法是统一的:把所有期望状态变成声明式配置,然后交给控制循环不断调节现实状态。你描述“我要3个副本、每个副本需要1个GPU”给API Server,调度器负责选择合适节点,kubelet负责拉起容器,Deployment控制器负责保证当前副本数永远等于期望状态。整个过程不需要任何人登录服务器敲命令,这正是“声明式API”和“命令式操作”的本质区别。
注意:学习K8S时,很多人上来就啃源码,但架构师视角恰恰相反——先用得熟,再看得透。你能熟练讲述“用户请求如何经过Ingress、Service转发到Pod,调度器如何根据资源预留和污点容忍选择节点”,这比背几行源码有用得多。
1.2 “AI”在K8S里到底指什么
很多人的理解是把AI当成K8S上运行的普通业务。但AI负载和常规的Web服务在资源特征上差异很大——模型推理对GPU算力有硬依赖,训练任务往往需要多卡协同且周期长,大模型推理还面临显著的冷启动和显存压力问题。如果只是把模型服务包成镜像扔进Deployment,你会很快发现:Pod启动要读好几个GB的模型文件,就绪探测迟迟不通过;GPU显存被占满,调度器却不知道这张卡已经被用了;流量突增时要扩容,但新副本因为拉取大镜像而导致几十秒才就绪。
所以在K8S AI架构师的能力模型里,“AI”不仅仅是“工作负载类型”,它意味着更多维度的东西:GPU资源需要被抽象成可调度的数量指标、模型版本需要支持灰度发布、服务需要按GPU利用率和请求并发数共同伸缩、训练任务需要支持排队和抢占。这篇文章的学习路线会把这些点全部串起来。
1.3 能力分层:从会用K8S到能设计平台的三级跳
我习惯把K8S学习者的能力分为三层,你可以先给自己定位一下。
| 层级 | 能力特征 | 典型交付 |
|---|---|---|
| L1:使用者 | 会编写Deployment、Service、Ingress等核心YAML,能把应用跑起来,能查看日志和事件 | 单应用的容器化部署 |
| L2:排障者 | 理解控制器原理、调度过程、网络通信路径,能定位启动失败和性能问题 | 故障复盘报告、资源优化 |
| L3:架构师 | 会做多团队多集群治理、成本控制、容量规划,能让AI工作负载高可用运行 | 云原生AI平台方案、多集群体系设计 |
绝大多数教程停留在帮人跨过L1的门槛,但架构师的真正分水岭在L2到L3之间。你需要的不是更多YAML片段,而是一套能解释“为什么这样配置”的底层框架。后面每一个章节,我都会在讲实操步骤的同时,把背后的设计取舍讲透。
2. 开箱即用的学习环境:一台普通电脑也能搭出可模拟生产环境的集群
2.1 学习环境选型:为什么我推荐裸机自建而不是一键方案
市面上的各大云平台都提供托管K8S服务和各种本地版一键安装方案,但对学习者来说,它们恰恰有两个致命问题。第一,托管控制面的集群,你接触不到kube-apiserver、etcd、controller-manager这些核心组件,等于只能看到黑盒表面。第二,一键安装方案往往把大量配置预置好,你少走了很多“正确的弯路”。
对比下来,我强烈建议在个人电脑的虚拟机里用kubeadm自建一套集群,这样学习收益最大。
| 方案 | 能看到控制面组件? | 适合学习程度 |
|---|---|---|
| 托管K8S(云平台版) | 否 | 生产使用,学习价值有限 |
| Minikube / kind | 部分(单节点) | 快速体验,但掩盖了网络和控制面细节 |
| kubeadm自建 | 全量 | 最推荐,故障能还原、组件能排查 |
机器要求其实很低:8GB内存,4核CPU,让我自己跑一套3节点的kubadm集群都没问题,如果你内存紧张,也可以像下面这样在单机上先跑2个节点,即1个master + 1个worker。
2.2 一次装好的完整步骤(基于常见实践的补充配置)
下面这套步骤我在某实验室的测试服务器上验证过多次。系统使用Ubuntu 22.04 LTS,容器运行时使用containerd,网络插件使用Calico。
先做系统初始化(所有节点都执行):
# 关闭交换分区,Kubernetes的kubelet要求swap必须关闭 sudo swapoff -a sudo sed -i '/swap/s/^/#/' /etc/fstab # 加载内核模块 cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter # 设置iptables桥接流量 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF sudo sysctl --system然后安装containerd,这里有一个非常容易踩的坑:必须把cgroup驱动改成systemd,否则kubelet和容器运行时之间会一直报驱动冲突。
sudo apt update sudo apt install -y containerd sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml # 手动修改 /etc/containerd/config.toml 中的 SystemdCgroup 为 true安装kubeadm和kubelet(以某存储库镜像源为例):
sudo apt update sudo apt install -y apt-transport-https ca-certificates curl gpg curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/' | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt update sudo apt install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl初始化控制面节点(master节点执行):
sudo kubeadm init --apiserver-advertise-address=<本机IP> \ --pod-network-cidr=10.244.0.0/16 \ --image-repository=registry.aliyuncs.com/google_containers这里把--pod-network-cidr设为10.244.0.0/16,是让Pod网段与Calico默认配置匹配。初始化完成后会输出一条kubeadm join命令,到worker节点上去执行即可加入集群。
最后安装网络插件,我推荐Calico:
kubectl apply -f https://docs.tigera.io/calico/latest/manifests/calico.yaml这套环境装完之后,你会有一个真正完整、能看到各组件日志、也能随时破坏掉再重来的集群。以后任何排障问题,你都能在自己架子上复现一遍,这才是“开箱即用”的真正含义——不是帮你装好让你不用动手,而是让你在不需要外部资源的前提下,随时能进入实战状态。
2.3 没有GPU的机器,怎么学习GPU调度
现在很多学习者的机器没有独立GPU,怎么办?我的经验是用“设备资源模拟”的方式骗过调度器。
K8S识别GPU是通过Extended Resource实现的——所谓“扩展资源”就是API Server中一个自定义的资源名。在生产环境里,某个GPU厂商的驱动会以Device Plugin方式把“gpu”资源上报给每个节点。比如节点上插了2张卡,调度器就会看到这个节点剩余“gpu”的数量是2。你在自己电脑上只需模拟这个“上报”动作:写一个极简的Device Plugin,在节点上报出几个虚拟的“gpu”资源;或者更简单的方式——直接调用kubectl patch node <节点名> -p '{"status":{"capacity":{"example.com/gpu":"2"}}}'。但通过kubectl直接patch的方式,修改的是节点状态,重启后会丢失,且与真实Device Plugin的互动机制不同。若想更深层理解,我推荐写一个简单的fake Device Plugin代码,运行在DaemonSet中,向kubelet注册资源时显式返回一个固定数量(比如2个虚拟GPU),让调度器真正参与资源决策。
这样一来,你依然可以练习“指定resources.limits里设置example.com/gpu: 1”的写法,依然能观察调度器如何根据显存/GPU卡数过滤节点,也可以验证设置了GPU资源的Pod在虚拟GPU不充足时为何会一直Pending。这里真正的核心是理解调度器对扩展资源只做整数分配、不感知具体隔离细节这一设计——这就是架构师视角。
3. 四周围绕“部署-调度-治理”的高效学习路径
3.1 第一周:把核心对象变成肌肉记忆
第一周不建议碰任何高级特性。你需要像背单词一样掌握的K8S对象是:Pod、Deployment、Service、Namespace、Label与Selector、ConfigMap和Secret。这些对象就是云原生的“字母表”。
我推荐的实操方法是**“干跑”**:不要只对着文档看,每个对象都亲手建一遍。比如创建一个Deployment,观察它拉起Pod的过程;手动kubectl delete pod其中一个Pod,清楚看到它被Deployment控制器重新拉起;再改一下镜像版本,观察滚动更新的逻辑。这套流程做三遍以上,你就不用再背YAML了,因为这些字段组合已经变成了条件反射。
第一周的验收标准是:你能不打开文档写出一个带环境变量、资源限制、启动探针的Deployment,并且能够解释Pod的生命周期阶段(Pending、Running、Succeeded、Failed)分别对应什么状态。
3.2 第二周:调度、存储、网络,这三块是架构师分水岭
第二周的内容,是普通使用者和架构师拉开差距的地方。
调度是K8S的“大脑”。需要掌握节点选择器、节点亲和性、Pod亲和性和反亲和性、污点与容忍度、优先级和抢占。这里的学习要点是理解调度器的过滤和打分两阶段:过滤阶段排除不满足硬性条件的节点,打分阶段根据资源余量等策略给候选节点排名。你在配置资源预留时经常疑惑“为什么Pod不调度到某节点”,多数就是过滤阶段出了岔子。
存储。重点掌握PV、PVC、StorageClass三级体系。我建议你在自己的测试机上装一个NFS服务,然后通过NFS的CSI驱动把NFS当作动态供给的存储类。这会让你理解“存储与计算分离”这个云原生关键思想,也能为后续给AI训练数据做持久化存储打基础。
网络。必须搞清Service的几种类型和Ingress的区别。ClusterIP是集群内部访问,NodePort是宿主机端口映射到Pod,LoadBalancer是交给云负载均衡器做接入,Ingress则是七层路由规则、需要IngressController落地。一个最常见的坑:在集群外访问不到ClusterIP类型的服务——因为ClusterIP本来就是在集群内使用的,需要借助kubectl port-forward或NodePort才能从外部测试。
这一周的验收标准:给一个业务创建一套完整的网络拓扑——前端通过Ingress暴露域名,后端通过Service连接,数据库使用StatefulSet挂载PVC,各组件通过Namespace隔离,再用NetworkPolicy限制Pod之间的访问。
3.3 第三周:可观测性与交付链路
可观测性是云原生架构师区别于普通运维的关键技能。核心就是“三根柱子”:metrics、logs、traces。对应到K8S生态,你可能装了Prometheus和Grafana做指标采集和展示,Loki做日志聚合,OpenTelemetry做链路追踪。但学习的重点不是“装了什么”,而是围绕“一个请求从Ingress到Pod全链路怎么追踪、异常时从哪里看指标、从哪里捞日志”建立排障直觉。
另一条线是交付链路。传统上你可能是手动kubectl apply,但真正生产级流程是GitOps:代码合并到仓库,ArgoCD检测到声明与集群实际状态不一致,自动同步部署。学习时,把你自己的业务仓库做成一个Git仓库,配置好ArgoCD,然后尝试“改仓库里的镜像版本→提交→观察ArgoCD自动发布”的完整闭环。
心得:不要在第三周就急着学Service Mesh(服务网格)。Istio这种体系复杂度极高,而且对理解K8S核心机制帮助有限。等你对流量治理、可观测性已经有了基础直觉之后,再回头踩Istio,效果会好很多。
3.4 第四周:AI场景专项
前几周已经打好了通用底座,第四周进入“AI”这个变量带来的专项场景。
第一类是模型离线训练任务。K8S原生对象Job适合一次性任务,但AI训练往往需要队列调度、抢占比普通任务更高的资源。你可以先用原生Job做简单体验:提交一个单卡训练任务,观察Pod调度和资源占用的过程。之后如果时间充裕,可以了解如何在K8S生态中引入额外组件以支持批量训练调度。
第二类是在线推理服务。和普通Web服务不同,推理服务往往无状态、但对算力有硬性需求,而且模型加载耗时比较长。你需要在之前学到的Deployment基础之上,加入以下几点配置:启动探针改成检查推理接口就绪状态而不是默认的TCP检查、配置较长的terminationGracePeriodSeconds让旧Pod处理完正在进行的推理请求、设置HPA按GPU利用率和请求并发数伸缩。
第三类是轻量MLOps链路。比起裸部署一堆组件,我更推荐先把训练任务产生的模型产物存到MinIO(一个开源的S3实现),然后用一套轻量实验跟踪组件记录训练参数和指标。这样你就能跑通“训练→模型产物落库→推理服务加载新模型”的最小闭环,把MLOps的逻辑骨架先立起来。
4. 吃透AI部署的三大核心环节:GPU调度、自动伸缩、版本切换
4.1 GPU调度的完整原理链
GPU调度不是简单地在YAML里写一个resources.limits字段就能完成的,它背后有完整的链路。
从最底层看,节点上需要安装GPU驱动和容器运行时工具,容器运行时才能让容器内进程访问GPU设备。再往上一层是Device Plugin机制:它会向kubelet注册“某节点有N张GPU卡”,这样调度器才知道某个节点有多少可分配的GPU资源。最后到调度层面,用户通过资源请求告诉API Server“我的Pod需要1张GPU”,调度器在过滤阶段检查节点剩余GPU数量够不够;如果够,Pod就调度上去,关联容器会被注入GPU环境变量,最终通过容器运行时挂载GPU设备。
很多人在这一步会困惑:多个Pod调度到同一张卡上怎么办?这就是一个真实架构问题的瓶颈。生产环境有几种解决思路,比如通过显存隔离、算力隔离、时片复用等方式提高单卡利用率。但具体到本地模拟环境,至少你要确认两种思维方式:一是资源视图与设备视图是两层——调度器眼里只有数量,而真正的隔离和复用由Device Plugin和运行时实现;二是同一张卡绑给多个Pod使用的时候,容量规划和性能隔离会成为一个联动风险。
在排障上,常见的“GPU资源不足一直Pending”问题,本质是调度器认为节点剩余GPU不够。你可以用kubectl describe node查看节点的Allocatable资源,也可以用kubectl describe pod看调度失败的具体原因。掌握了这条链路,你在生产环境遇到的绝大部分GPU调度问题都可以往这几层去排查。
4.2 自动伸缩不只是HPA:冷却时间、自定义指标、垂直伸缩组合拳
AI推理服务对弹性伸缩的要求比普通Web应用苛刻得多——模型加载慢导致扩容来不及,显存不够导致副本被卡住,CPU利用率平稳但并发请求已经堆积。单纯依赖HPA按CPU伸缩在AI场景是远远不够的。
第一要注意伸缩指标的选择。CPU指标对推理服务不太敏感,我建议优先关注:请求并发数(QPS或InFlight),以及GPU利用率。但如果你启用了GPU共享,经常会发现GPU利用率不高但显存快要打满,这个时候要以显存使用量为主指标去做扩容。
第二要注意伸缩稳定窗口和冷却时间。HPA频繁上下伸缩会造成抖动,合理设置behavior策略——比如快速扩容(60秒内扩容到2倍),但缓慢缩容(等待15分钟稳定后才缩)——能够很好应对推理流量毛刺。
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: inference-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: ocr-inference minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 behavior: scaleDown: stabilizationWindowSeconds: 300 policies: - type: Percent value: 20 periodSeconds: 60第三要注意VPA和HPA的冲突。如果既想调整副本数又想动态调整单个Pod的资源规格,VPA和HPA在某些配置下会互相打架。我的建议是AI负载以HPA为主,把VPA当作资源建议工具而不是自动执行工具,这个思路能省掉很多头疼的故障排查。
4.3 模型版本切换的优雅上下线
模型更新迭代是AI服务常态,但直接把新模型版本全量替换造成的影响很大,轻则流量抖动,重则推理质量崩掉。所以重点掌握两种发布模式:金丝雀发布和蓝绿发布。
蓝绿部署容易理解:旧版本和新版本同时存在,通过Service的标签选择器从旧版本完整切到新版本,切换后旧副本退出。它的问题是要准备双倍资源。金丝雀发布则更精细:通过Ingress权重把少量流量切给新版本,验证指标之后逐步放大权重,直到完全切换。
实操中,最常见的配置方式是使用Nginx Ingress的nginx.ingress.kubernetes.io/canary-weight注解。先让主服务指向稳定版本,再创建一个带有金丝雀注解的Ingress,权重设为10%:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: inference-canary annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "10" spec: rules: - host: ai.example.local http: paths: - path: /v1/models/ocr pathType: Prefix backend: service: name: ocr-inference-canary port: number: 80这里需要注意一个容易踩的小坑:金丝雀Ingress的路径和 host 需要与主Ingress完全一致,否则流量匹配不上。而且权重调整后需要几十秒才能看到新版本请求量变化,不要一调整就以为出故障了。
与发布紧密相关的是优雅下线。新版本全部就绪前,不能把旧版本全部干掉。所以合理配置strategy.rollingUpdate的maxSurge和maxUnavailable很关键,同时要设置terminationGracePeriodSeconds,让Pod在收到终止信号后不要立即退出,给正在处理的推理请求留出完成时间。配合就绪探针,就完成了优雅上下线的组合拳。
4.4 平台治理:多租户隔离、配额管理和成本归属
架构师与单机玩家的另一个差别,在于你是否能用一套平台支撑多个团队、多类工作负载的运行。这里只需要三个核心对象就能模拟多租户治理。
首先是ResourceQuota(资源配额)和LimitRange(默认资源限制),它们解决了“团队A把集群资源打爆怎么办”的问题。你可以在某Namespace里设置CPU/GPU限制总量,让超额任务无法创建。
然后是RBAC权限控制。给不同团队分配独立Namespace,再通过Role、RoleBinding限制它们对K8S集群本身的操作范围。学习时,建一个“普通开发”账号,只用它操作某个Namespace,体验权限不足带来的报错。
再往后是成本归属。虽然本地环境无法真实计费,但你可以提前了解容器成本分配、成本优化和容器资源可视化的方案原理:给每个工作负载打上团队/项目标签,按标签聚合容器CPU、内存、GPU的消耗量。我给自己搭的学习环境,最后也是这样把“哪个团队花掉了多少算力”看清楚的。做好这个层面,你已经从解决“能用”升级到解决“好用且可控”了。
5. 三个拿来即用的实战项目,练完就能写进简历
纸上谈兵终觉浅。接下来是三个我推荐自己拉练过的项目,每个项目都对应一个能说清楚的架构能力点。项目用虚构代称表示,但操作过程完全真实。
5.1 项目一:让一套OCR推理服务具备生产级能力
任务拆解:把一套OCR识别应用容器化后部署到K8S集群,并从“能跑”逐步升级为“能扛生产流量”。
关键在于这四个改造点:
- 通过持久化存储(PV/PVC)挂载模型目录,避免每次发布都要重新下载模型文件。
- 配置启动探针、就绪探针,就绪探针指向OCR服务的健康检查接口,避免流量进入尚未完成模型加载的副本。
- 配置HPA,按CPU和请求并发数双指标伸缩。
- 通过Ingress金丝雀发布完成一次模型版本升级,全程没有中断服务。
验收标准是:任意杀掉一个Pod副本,业务不受影响;升级模型版本期间,错误率没有明显上升。这个项目做好了,你就能在面试里自然讲出一整套“推理服务高可用”的方案逻辑。
5.2 项目二:在K8S上做一个训练任务排队调度器
任务拆解:模拟AI训练场景中“多团队抢GPU”的真实冲突。在这个模拟项目X里,我用K8S原生Job创建多个训练任务,故意提交超出GPU可用数量的任务,然后观察它们如何排队等待。结合优先级抢占机制,让高优先级的“紧急训练任务”在队列中抢占低优先级任务。
实操要点:需要给不同训练任务设置不同PriorityClass,需要把调度器配置成允许抢占,否则高优先级任务只会一直等待而不是抢到资源。做完之后,你要能向别人解释清楚“为什么K8S原生调度器在GPU拥塞时的表现达不到专业训练平台的水平,而K8S生态中的专业调度组件解决的是什么场景”——这个思辨能力,比会写配置金贵得多。
5.3 项目三:多集群管理Demo
作为架构师,单集群能力还不够,多集群设计才是云原生架构的主要抓手之一。这个项目我建议搭建两个K8S集群(一主一备),通过kubectl config的context随时切换,并部署一套可观测组件从全局视角汇总两个集群的指标。更深入一点,还可以使用Cluster API把第二个集群的创建过程自动化。
这个Demo的价值在于让你理解:多集群不只是“多几台机器”,而是隔离边界、容灾单元、扩展方向都在变化。面试时如果你能随口说出“多集群环境下网络通信和配置漂移的策略”,已经超过大部分候选人。
6. 高频问题与避坑实录(学K8S一定会碰到的坑)
6.1 集群启动不起来:swap和cgroup驱动不匹配
现象:kubelet反复启动失败,journalctl -u kubelet里报错信息指向“failed to run Kubelet"或者容器运行时和kubelet的cgroup驱动不一致。
排查方法:第一确认swap已经关闭,第二确认containerd配置里的SystemdCgroup是true,第三确认kubelet的cgroupDriver是systemd。这三个踩一个,控制面基本起不来。我的经验是按顺序排查,能少走很多路。
6.2 镜像拉不下来:网络原因还是配置原因
K8S集群初始化时要拉一堆控制面镜像,这一步卡住的人很多。解决思路有两个:一个是在kubeadm init时指定镜像仓库参数,比如使用国内或特定的镜像仓库地址;另一个是给containerd配置registry mirror。
注意,配置完镜像仓库之后,要重启containerd并清理旧配置缓存,否则改完还是不生效。这个坑我掉进去过一次,改了配置但忘了重启,排查了很久。
6.3 Pod一直CrashLoopBackOff:不要只看容器日志
CrashLoopBackOff的意思是容器启动后反复崩溃。新手习惯立刻kubectl logs看日志,但很多崩溃根本不发生在业务进程里——探针失败、依赖服务没就绪、镜像启动命令不对都会造成这个结果。正确排查顺序是:先kubectl describe pod看事件,再kubectl logs --previous看上一次退出前的日志,最后检查探针和资源限制。
6.4 节点显示NotReady:网络插件才是重灾区
节点NotReady最常见的原因是网络插件没有正确安装,或者Pod网络网段冲突。我见过有人在已有Pod网段的集群上又装了一个新的网络插件,结果CNI配置乱套,花了两小时才弄好。学习阶段建议只用一种网络插件,并且严格按照其官方文档执行,不要叠床架屋。
6.5 证书过期:生产集群的头号定时炸弹
kubeadm默认生成的证书有效期大约一年。学习环境中你一般不会感受到这个问题,但以后进了公司,一定会碰到某天所有API访问突然全部断掉的情况——多半就是证书过期了。学习阶段至少要知道证书存放路径和更新方式,知道备份/etc/kubernetes/pki是一个好习惯。
6.6 学了就忘:对抗遗忘的三种实操办法
根据我带人的经验,学K8S最容易的问题其实是“学了就忘”。推荐三个对抗遗忘的主动策略:
第一,每学一个对象,就写一篇20行以上的笔记,最好配上自己画的架构图。输出会倒逼输入。第二,用K9s(一个终端UI工具)代替频繁敲kubectl,可视化会大幅提高你观察集群状态的频率。第三,维护自己的CheatSheet(速查表),按“资源对象、常用命令、排障手段”整理,随学随查,而不是到用时再翻官方文档。
6.7 简历怎么写:项目经验要带指标
最后给一个非常现实的经验:如果你把项目写进简历,一定要带上可量化的结果。比如“把某OCR推理服务通过HPA扩缩容,峰值QPS从500提升到2000,推理P99延迟维持在200ms以内”,这比“熟悉K8S部署”有说服力得多。项目并不需要多复杂,关键是你要能把“为什么这么做”讲清楚,这是面试官真正在意的判断逻辑。
心得:我在教几位从传统运维转向云原生方向的同学时,发现他们最常犯的错误是一上来就追求高深组件。其实很多人连“Pod一直Pending”都还没有处理过五遍以上,就开始学Service Mesh。架构师的底气不是来自见过多少高级词汇,而是来自对基础机制的手感和故障现场的从容。
最后再分享一个个人观点:真正让你从“会用工具”到“设计平台”的转折点,通常是你开始主动思考多团队共用集群时如何隔离、如何定价、如何编排优先级的那一刻。按上面这条路线把环境搭好、把四周路线跑完、把三个项目做完,你至少不会再对着YAML发怵——到那个时候,你会发现K8S AI云原生架构师这个头衔,研究方向不在话下。