ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kubernetes入门实战:Deployment + YAML部署Nginx全链路解析

Kubernetes入门实战:Deployment + YAML部署Nginx全链路解析 很多朋友问过我同一个问题2026 年了Kubernetes 到底还值不值得学我的回答一直没变——值得而且越早趟一遍越好。尤其是你亲手写下第一份 Deployment YAML、把 Nginx 跑起来那一刻对“部署”这个词的理解会发生根本变化从登录服务器拷文件、手动起进程变成提交一份描述文件让集群自己把状态调整到期望值。这篇文章就用 Deployment YAML 这个组合把 Kubernetes 部署一个 Nginx 的完整链路讲透从环境准备、字段拆解到滚动更新、回滚、服务暴露和排错实战所有命令都可以直接抄适合刚入门 Kubernetes、被各种概念绕晕的读者。1. 为什么还在学 YAMLKubernetes 部署的底层逻辑1.1 Deployment 到底解决了什么问题先别急着敲kubectl apply。你得先想明白一个问题我为什么不直接在服务器上apt install nginx非要折腾 K8s传统部署你面对的是“单机视角”一台机器、一个进程、一个配置文件Nginx 挂了那就挂了你得手动拉起来。Kubernetes 的视角是“集群视角”你声明“我要 3 个 Nginx 副本”Deployment 控制器就负责保证集群里始终有 3 个 Pod 在处理流量。某个节点宕机导致 Pod 消失控制器会立刻在别的节点上重建一个流量太大想扩展到 10 个副本改replicas字段重新 apply 即可发布新版本Deployment 能按你设定好的策略滚动替换不会断掉整个服务。这个“自愈 扩缩容 发布管理”的组合是 Deployment 存在的全部意义。你写 YAML 时其实是在跟控制器签一份“期望状态合同”控制器只是一个执行者。1.2 “声明式”这三个字值多少钱我见过太多初学者把 YAML 当成一种“配置文件格式”来背这方向就偏了。YAML 在 Kubernetes 里之所以重要不是因为格式本身而是因为它承载了声明式 API的思想。命令式操作是“我告诉你每一步做什么”比如“先装 Docker再跑容器再映射端口”声明式操作是“我告诉你最终要什么”比如“我要一个叫 web 的 Deployment镜像 nginx:1.27-alpine副本数 2端口 80请让它一直保持这样”。这区别有多大举个真实场景你的 Nginx 跑得好好的突然有一个节点故障某个 Pod 被调度到别的节点重建了。如果用命令式思路你根本不知道这个 Pod 现在在哪、配置还是不是原来那份但用声明式 YAML你只需要kubectl apply -f nginx.yaml集群会自动对账把不匹配的地方改回去。这份 YAML 就是你环境的“唯一真相”放进 Git 里就能审计、能回滚、能协作评审。1.3 Nginx 为什么是入门首选讲真Nginx 是被 Kubernetes 入门教程用烂了但确实好用镜像小、配置简单、端口固定是 80、几乎没有依赖。更重要的是Nginx 部署成功后你能立刻验证网络链路——浏览器能不能访问、集群外能不能通、Service 有没有生效、Ingress 有没有把路由转发对。对初学者来说排查链路的能力比背 YAML 字段值钱得多。2. 动手前的准备集群环境与工具链选型2.1 本地开发选 minikube 还是 kind 还是 k3s这一步是新手最容易纠结的地方。很多人问“我该装哪个集群”我的答案是先分清楚你的目标是什么。方案适合场景资源占用一句话点评minikube本地单机学习验证 Deployment 概念中等默认要求 2C2G最像“正经集群”组件最全kind本地快速测试CI 跑用例较低依赖 Docker用容器装集群启动最快k3s低配机器、边缘设备、想长期自用很低内存 512M 能跑生产级发行版适合穷人自用kubeadm想完整体验生产集群搭建高入门不推荐后面再搞我个人的建议是如果你机器内存超过 8G直接上 minikube如果只是想在 4G 内存的老笔记本上快速看个效果kind 比较友好如果你除了学习还想在服务器上挂点个人服务那 k3s 一步到位。下面都以 minikube 为例因为它的报错信息对新手最友好。安装命令很简单macOS 用户可以直接用 Homebrewbrew install minikube minikube start --driverdocker --cpus2 --memory4096这里--driverdocker是让 minikube 在 Docker 容器里跑一个单节点集群不用装虚拟机最省事。启动成功后minikube status应该能看到host: Running、kubelet: Running、apiserver: Running三行。2.2 kubectl 安装与 kubeconfig 的常见小坑kubectl 是操作集群的客户端需要单独安装。macOS 上同样一条命令brew install kubectl装完先别急着使有个非常经典的问题本地 kubectl 版本和集群版本不一致。虽然小版本差异通常没问题但差距过大会直接报错“client version is too old / too new”看着就很挫败。稳妥做法是让 kubectl 大版本和集群匹配查一下kubectl version --client kubectl get nodes -o wide如果装了不止一个集群比如同时用 minikube 和 k3s你会遇到第二个常见问题kubeconfig 里 context 混乱不知道自己在操作哪个集群。我的建议是执行任何写操作前先看一眼当前 contextkubectl config get-contexts kubectl config current-contextminikube 的 context 名一般是minikubek3s 通常是default。搞混了轻则看错 Pod重则把一个环境的配置 apply 到另一个环境。养成用kubectl config use-context minikube切换并确认的好习惯能免掉太多麻烦。2.3 一个快速验证环境的命令清单环境准备完成后跑一遍下面这些命令确认链路通kubectl cluster-info # 看 API 服务是否可访问 kubectl get nodes # 节点应该处于 Ready 状态 kubectl get pods -A # 看系统组件 Pod 是否正常比如 kube-system kubectl get events --sort-by.metadata.creationTimestamp # 有异常时第一时间看事件如果kubectl get nodes一直是 NotReady多半是 minikube 的容器运行时没起来minikube logs里能找到蛛丝马迹。别急着往下走先把环境弄干净后面实战才会顺利。3. 从零写一个 Nginx DeploymentYAML 字段逐个拆解3.1 apiVersion、kind、metadata第一屏先看什么网上有很多 YAML 模板但如果你不懂字段含义改起来就是碰运气。我习惯把 YAML 分成三块来看元信息、spec、容器模板。先看最上面这几行apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginxapiVersion是“这份资源属于哪个 API 组、哪个版本”。Deployment 的稳定版本是apps/v12026 年了没有别的选择看到extensions/v1beta1这种老字段直接绕道走。kind声明资源类型这里是 Deployment。metadata.name是这个 Deployment 的唯一标识同一个命名空间内不能重名。labels是给资源打标签用的后面 Service 选择 Pod 全靠它。这里有个非常关键、又很容易被忽略的对应关系metadata.labels.app: nginx是 Deployment 自己的标签下面spec.selector是用来挑选 Pod 的两者不是一回事。新手经常把这俩搞混导致 Service 选不中 Pod。3.2 spec副本数、选择器、模板怎么写才规范进入正题看specspec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.27-alpine ports: - containerPort: 80replicas是期望副本数这里说 2 就是要有 2 个 Pod 同时在跑。selector.matchLabels决定 Deployment 管哪些 Pod它必须和template.metadata.labels对得上否则控制器会一脸懵——它根本不知道该控制谁。这两处标签习惯上都用app: nginx保持一致性就好。template的部分其实是一个完整的 Pod 模板你会注意到它的结构和 Pod YAML 很像。template.spec.containers.image指定镜像这里我用了nginx:1.27-alpine而不是nginx:latest原因后面专门说。containerPort: 80只起到“声明这个容器会监听 80 端口”的作用它并不会自动帮你做端口映射——很多人以为写了这里就能从外部访问这是误解。这是一个最小可用版本但我想说这个 YAML 虽然能跑但不该作为你的实战起点。因为缺了探针和资源限制后面我会补上。3.3 给 Nginx 加上探针与资源配额让 Pod 真正“健康”官方入门教程常让你用最小 YAML 跑通但生产环境不可能这么干。你至少得加两样东西探针和资源配额。探针是 K8s 判断容器“活着”和“可用”的机制。Nginx 是个非常标准的 HTTP 服务用/路径做 HTTP 探测就够livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 3 periodSeconds: 5 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 3 periodSeconds: 5livenessProbe存活探针决定什么时候重启容器readinessProbe就绪探针决定服务是否开始接收流量。对 Nginx 来说这俩可以先配一样的等你在第 6 章看到 CrashLoopBackOff 和“服务不通但 Pod 明明在跑”这类情况时就会明白它们的作用完全不重复。资源配额也是一定要写的不然一个失控的容器可能把整个节点内存耗尽resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 256Mirequests是“最低保障”调度器依据它找节点limits是“最高上限”超过会被杀掉或限流。100m表示 0.1 颗 CPU 核128Mi是 128 MiB 内存对 Nginx 来说完全够用。加上探针和资源限制后完整 YAML 如下apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.27-alpine ports: - containerPort: 80 livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 3 periodSeconds: 5 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 3 periodSeconds: 5 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 256Mi3.4 imagePullPolicy 和镜像版本选择别再用 latest 了关于镜像我特意单独说一段。很多人在本地实验时发现 imagePullPolicy 默认是IfNotPresent——即本地有镜像就用本地没有才拉取。但当你把镜像改成nginx:latest时行为会变得非常坑对latest 标签K8s 默认使用Always策略每次 Pod 创建都去远程仓库拉一遍这在网络慢的环境里就会出现镜像拉取超时Pod 一直 ImagePullBackOff。所以我现在的习惯是明确指定版本号并且指定imagePullPolicy: IfNotPresent。如果你在本地已经docker pull过一遍镜像那么创建 Pod 时就不会因为网络问题卡住对新手尤其友好。版本号推荐用你本机跑过一次验证过的稳定版本别追新Nginx 官方现在滚动更新很频繁非 LTS 版本没准过俩月就没人维护了。4. 将 YAML 真正跑起来apply、滚动更新与回滚实操4.1 kubectl apply 之后发生了什么把上面那段 YAML 保存为nginx-deployment.yaml然后执行kubectl apply -f nginx-deployment.yaml输出一般是deployment.apps/nginx-deployment created。这之后你可以用kubectl get pods看 Pod 状态NAME READY STATUS RESTARTS AGE nginx-deployment-7c9fdc6d7b-4zx8m 1/1 Running 0 35s nginx-deployment-7c9fdc6d7b-8j2tq 1/1 Running 0 35s注意 Pod 名里的那一串随机字符前面是 Deployment 的哈希后面是 Pod 内唯一 ID。这说明 Deployment 是通过ReplicaSet间接管理 Pod 的——你先定义 DeploymentDeployment 创建 ReplicaSetReplicaSet 再创建 Pod。后面做滚动更新时你还会看到旧的 ReplicaSet 被“留住”但副本缩到 0那是为了回滚用的。如果status不是 Running别急用这个命令看细节kubectl describe pod nginx-deployment-7c9fdc6d7b-4zx8mdescribe末尾会有 Events 记录这里面藏着所有线索镜像拉取失败、探针失败、资源不足全都会列出来。4.2 修改镜像触发滚动更新现在这部分是核心体验。你把 YAML 里的镜像从nginx:1.27-alpine改成nginx:1.28-alpine假设存在再执行kubectl apply -f nginx-deployment.yaml这时候 Deployment 会发起一次滚动更新先新建一个 ReplicaSet逐步增加新副本同时逐步缩减旧副本。默认策略是RollingUpdate相关参数有maxSurge和maxUnavailable。maxSurge表示更新期间最多允许超出期望副本数的 Pod 数量默认 25%maxUnavailable表示允许不可用的 Pod 数量默认也是 25%。对 2 副本的 Deployment 来说整个流程很短你可能看不到中间态但可以观察watch kubectl get pods你会看到旧的 Pod 变成 Terminating新的 Pod 变成 Running整个过程没有让服务断掉。这正是前面强调的“声明式 控制器”带来的核心价值——如果是手动 SSH 到机器上替换 Nginx你根本没法想象这种升级方式。4.3 回滚不是玄学rollout undo发布翻车了怎么办比如你改了配置结果新版本 Nginx 起不来探针全红。这时候直接重新 apply 旧 YAML 能行但更标准的是用 rollout 命令kubectl rollout status deployment/nginx-deployment kubectl rollout history deployment/nginx-deployment kubectl rollout undo deployment/nginx-deploymentrollout history能看到这次 Deployment 的每个版本REVISION 编号rollout undo默认回滚到上一个版本。如果你知道具体要回哪个版本可以指定kubectl rollout undo deployment/nginx-deployment --to-revision1回滚期间同样遵循滚动更新策略不会一瞬间全停。执行完再跑一下kubectl get pods确认新一版 Pod 都 Running 即可。这里插一句个人经验不要把 rollout 当日常操作。比起临时去rollout undo更好的习惯是把 YAML 本身改回正确状态然后 apply让 Git 里的记录始终反映集群情况。rollout 适合救火不适合作为常规发布流程。4.4 进入容器验证 Nginx 是否真的在工作部署完不验证等于没部署。几个命令组合起来用kubectl get pods -l appnginx kubectl logs deployment/nginx-deployment kubectl exec -it nginx-deployment-7c9fdc6d7b-4zx8m -- /bin/sh注意logs deployment/nginx-deployment这种写法在较新 kubectl 里支持直接通过 Deployment 看日志但在多副本时它只会随机选一个 Pod想指定 Pod 就写全名。进入容器后curl http://localhost:80能看到Welcome to nginx!那串 HTML 就说明 Nginx 本身没问题。如果返回 connection refused先确认 Nginx 进程是否还在ps aux | grep nginx。这一步能区分“容器网络问题”和“Nginx 自身配置问题”。5. 暴露服务Service 与 Ingress 的取舍5.1 ClusterIP / NodePort / LoadBalancer 怎么选Pod 默认是在集群内网里的外部根本访问不到。把 Nginx 暴露出去你需要一个 Service。Service 是访问 Pod 的稳定入口因为 Pod IP 会变化Service IP 不会变。Service 最常用的三种类型我直接给结论类型作用范围适用场景ClusterIP集群内部默认类型内部服务互调比如后端调数据库NodePort集群外可通过节点IP:端口访问本地实验、小规模服务暴露LoadBalancer对接云厂商负载均衡云上生产环境自动创建 LB本地 minikube 环境下想快速看到效果用 NodePort 就行apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: NodePort selector: app: nginx ports: - port: 80 targetPort: 80 nodePort: 30080这里三个端口值得说清楚port是 Service 自己监听的端口targetPort是 Pod 里容器的端口——必须和 Deployment 里 containerPort 对应且是 Nginx 真实监听的那个 80nodePort是集群节点上暴露的端口范围默认 30000-32767。如果你不写 nodePortK8s 会随机分配一个。apply 之后kubectl apply -f nginx-service.yaml minikube service nginx-service --urlminikube 会返回一个可访问地址通常是http://192.168.49.2:30080浏览器打开如果能见到 Nginx 欢迎页就说明 Service 的路由选通正确。5.2 从 Ingress 到云负载均衡什么时候该上NodePort只是入门玩具。生产环境里你不可能让用户通过http://节点IP:30080去访问那样端口暴露面太大、也不好做域名路由和 TLS 终止。这时候主角是Ingress。Ingress 本身就是一组路由规则真正的流量入口是Ingress Controller比如社区的 ingress-nginx、云厂商的 ALB Ingress 等。你在 minikube 上可以先启用自带插件体验一下minikube addons enable ingress然后写一个简单的 Ingress 把nginx.example.com路由到上面的 ServiceapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress spec: rules: - host: nginx.example.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80path: /匹配所有路径pathType: Prefix表示按前缀匹配。在本地测试时可以把nginx.example.com解析到 minikube IP写进/etc/hosts即可。关于 Ingress 和 Service 的关系我见过太多人搞混Ingress 不是 Service 的替代品它是“位于 Service 之前的另一半”——流量先进 Ingress Controller再由 Controller 转发到 ServiceService 再做负载均衡到各 Pod。所以哪怕有 Ingress你大概率还是需要 Service。5.3 一个完整的访问路径把整个链路串起来就是浏览器 - Ingress Controller / 云负载均衡 - Service - Pod(ReplicaSet 管理) - Nginx 容器这个理解非常重要。以后你排查网络问题时会一个个环节去定位浏览器访问不了先查 IngressIngress 正常但 Service 不通查 Service 的 selectorService 正常但 Pod 不可用查 Pod 状态和探针。链路越清晰排错越快。6. 排错实录部署 Nginx 时最常见的 5 个坑6.1 Pending 卡住不动调度问题现象kubectl get pods看到 Pod 一直是Pending不变成 Running。原因大概率是调度器找不到合适的节点节点资源不足CPU/内存不够 requests、节点有污点且 Pod 没有容忍度、或者显式声明了nodeSelector指向不存在的节点。排查步骤kubectl describe pod pod-name看 Events 里的“FailedScheduling”消息。如果是“Insufficient memory”说明请求的内存超过节点可分配内存要么加节点资源要么调低 requests。如果本地只有 minikube 单节点最简单的方法是先看节点实际可分配资源kubectl describe node minikube kubectl get nodes -o yaml | grep -A 10 Allocatable6.2 ErrImagePull / ImagePullBackOff镜像拉不下来现象Pod 一直是ImagePullBackOff或ErrImagePull。这是新手遇到最多的坑原因通常是这三类镜像标签写错镜像仓库需要认证网络问题导致拉取超时。排查顺序kubectl describe pod pod-name kubectl logs pod-name先确认镜像名和 tag 是否真实存在。nginx:1.27-alpine这个写法本身没问题但你如果手滑写成nginx:1.27-alpine2就会拉取失败。其次看 Events 里的错误信息——如果报unauthorized: authentication required说明仓库需要登录你得先用kubectl create secret docker-registry创建镜像仓库凭据并在 Deployment 里加imagePullSecrets。关于网络问题我的建议是本地实验别死磕拉镜像先在宿主机上手动docker pull nginx:1.27-alpine确认能拿到镜像再部署。只要本地 Docker 缓存里有镜像配合imagePullPolicy: IfNotPresentPod 创建时就不会去远程仓库拉直接规避掉超时问题。6.3 CrashLoopBackOff启动即崩先查日志现象Pod 反复重启状态显示CrashLoopBackOff。没有比这更直白的信号了——容器启动后很快就退出K8s 一遍遍帮你重启每次都失败。处理顺序是固定的先看日志再看事件。kubectl logs pod-name --tail50 kubectl logs pod-name --previous # 如果当前容器日志被覆盖看上一个容器的Nginx 镜像默认前台启动如果容器崩了大概率是你改了入口命令或挂载了不存在的文件。还有一种可能是探针配置太激进——initialDelaySeconds设得过短Nginx 还没起来就被 livenessProbe 判定失败触发重启。这时候看事件里会反复出现“Liveness probe failed”字样把initialDelaySeconds调大到 10-15 秒再试。6.4 Service 端口不通selector 没对上现象Pod 都 RunningService 也存在但访问 NodePort 时连接被拒绝。这个坑的根源往往是 Service 的 selector 和 Pod 的标签没对上。比如 Service 里写了app: nginx-web但 Pod 的 label 是app: nginxService 就选不到任何端点。验证方法kubectl get endpoints nginx-service如果ENDPOINTS列为空说明 Service 没选中 Pod。手动对比两边的标签kubectl get pods -l appnginx --show-labels kubectl get svc nginx-service -o yaml | grep selector还有一种情况是 targetPort 配错。比如容器里 Nginx 监听的是 8080但targetPort写的 80那 Service 转发也会失败。进入容器确认 Nginx 实际监听端口kubectl exec pod-name -- netstat -tlnp6.5 探针把服务“误杀”了readiness 和 liveness 的坑最后这个坑特别隐蔽。你把探针配得都差不多结果发现Nginx 明明正常但 Service 的 endpoints 数量时多时少时不时 503。问题出在readinessProbe的探测路径或端口。比如 Nginx 的访问日志里/healthz返回 404readiness 探测就一直失败Pod 状态虽然是 Running但READY列是0/1Service 不会把流量打给它。所以我有三条建议第一不要用首页/当探针路径尤其是你的 Nginx 后面还有鉴权逻辑时首页返回码可能不稳定最好单独留一个/healthzlocation 返回 200第二periodSeconds默认 10 秒可以但别设成 1 秒会给 K8s 造成额外负载第三liveness 和 readiness 的判定标准要分开想——liveness 管“要不要重启”readiness 管“要不要分流量”很多场景没必要用同一个探针。7. 2026 年 Kubernetes 部署的最佳实践清单7.1 用命名空间隔开环境别再 all in default 了新手最容易犯的错是把所有资源都丢进default命名空间。本地实验没问题但只要你跟别人协作或者开始部署第二个应用就一定会乱套。建议从一开始就按环境或团队划分命名空间kubectl create namespace dev kubectl create namespace prod kubectl apply -f nginx-deployment.yaml -n dev资源名在不同命名空间可以重复互不干扰。查询时也要带-nkubectl get pods -n dev7.2 镜像 tag 必须可溯源这年头镜像供应链不安全latest这种标签在生产环境就是定时炸弹。因为你根本不知道这次拉下来的东西跟上次有什么区别。我现在的习惯是对每个版本打一个固定 digest 标签比如nginxsha256:xxx或者至少在 CI 里生成语义化版本号比如nginx:1.27.3-alpine-20260101。YAML 里写成image: nginx:1.27-alpine imagePullPolicy: IfNotPresent能让部署可重复今天 apply 的集群半年后重新 apply产物应该一模一样而不是“拉到啥算啥”。7.3 资源配额从小到大会救你几次资源请求和限制不会让你的服务“变快”但它能防止一个服务拖垮整个节点。有一种极其常见的故障某个服务发生内存泄漏慢慢吃满节点内存其他 Pod 开始被 OOMKilled——你排查半天以为是自己的问题结果是隔壁服务惹的祸。给每个容器都设 requests 和 limits是基本素养。Nginx 这种轻量服务requests 给 100m/128Milimits 给 500m/256Mi留点余量又不会失控。7.4 YAML 进入 Git部署进入 GitOps把 YAML 文件放本地磁盘只有你自己能看到这等于没版本控制。2026 年的常规做法是YAML 进 Git 仓库用 GitOps 工具比如 Argo CD / Flux自动同步到集群。你只需要合并一个 Pull Request集群就会自动应用新配置出问题直接回滚一个 commit而不是在命令行里输入一条历史命令。如果现在不想引入整套 GitOps至少做到两件事YAML 按应用分目录存好每次 apply 前在仓库里留个记录。半年后你回来看会感谢自己。7.5 安全是默认项非 root 用户 只读根文件系统Nginx 官方镜像默认以 root 用户跑这在生产环境里很扎眼。2026 年的安全基线早就不接受容器以 root 身份运作了。建议在容器配置里加几行securityContext: runAsNonRoot: true runAsUser: 101 capabilities: drop: [ALL]Nginx 镜像里用户nginx的 UID 是 101这样容器内外都用低权限用户运行。配合只读根文件系统securityContext: readOnlyRootFilesystem: trueNginx 需要写/tmp和/var/run可以给这两个目录挂 emptyDir 单独可写。这些配置初看麻烦但你越早养成“非 root 最小权限”的习惯越不会在安全扫描时手忙脚乱。7.6 可观测性不是可选项最后说一个最容易拖到最后一刻才做的事日志和监控。日志层面K8s 默认把 Pod stdout 日志存在节点上但日志会轮转、会丢。2026 年的标准方案是收集到统一存储里比如 Loki 或 Elasticsearch。入门阶段你至少要知道kubectl logs能看实时日志但要有个预期这不适合做长期排障。监控层面Nginx 本身的指标默认不在容器日志里需要通过配置暴露/stub_status或/metrics。我的建议是如果只是入门先把kubectl top pods用熟看看每个 Pod 的 CPU/内存用量养成“部署完先看资源趋势”的习惯。等你要上生产再引入 Prometheus Grafana那又是一套体系了。最后分享一个小习惯我这里不写总结了就分享一个自己这几年养成的实操习惯很不起眼但真的能救命每份 YAML 文件开头用注释写明用途、负责人、最后验证日期。比如# nginx web 服务负责人zhang最后验证2026-06-01 apiVersion: apps/v1 kind: Deployment这行注释平时没人在意但半年后你翻 Git 历史时能瞬间知道这份 YAML 是谁写的、为什么写的省掉大量考古时间。另外提醒一句kubectl apply的执行者不是虚拟机是现实中的你——所以任何变更先想清楚回滚方案再按回车。Kubernetes 只是个可靠的执行者它不能替你思考。这几年代码没写多少但每次部署 Nginx 这类基础服务时我反而更愿意多花几分钟把 YAML 里这些细节写到位因为部署环境的稳定性从来不是靠运气堆出来的。
返回列表