# 04-03-nodejs-镜像与运行命令 > 在 [`04-01-k3s-nodejs-高级部署.md`](04-01-k3s-nodejs-高级部署.md) 的 `nodejs-demo` 基线上,调整**镜像**与**进程启动方式**。 ## TL;DR - **自动化验收**:`./scripts/verify.sh run 04-03` - **关键前置**:按本文「前置条件」准备环境变量/Secret/入口 IP - **成功判据**:达到本文「预期」且 playbook 断言通过 - **排障**:见本文「排障」 ## 前置条件 - 已按 `04-01` 部署并验证 `curl` 可达。 ## 清单路径(唯一真源) | 项 | 路径 / 命令 | |----|-------------| | 本篇完整清单(累积至 04-03) | [`ansible/files/04-01/04-03-nodejs-demo.yaml`](../ansible/files/04-01/04-03-nodejs-demo.yaml) | | 手工应用 | `kubectl apply -f ansible/files/04-01/04-03-nodejs-demo.yaml` | | Ansible | `ansible-playbook -i ansible/inventory.ini ansible/playbooks/verify/04-01.yml -e nodejs_demo_manifest=04-03-nodejs-demo.yaml` | 若你更喜欢命令行换镜像,文末也给了 **`kubectl set image`**,可不改仓库清单。 ## 场景说明(白话) - **换镜像版本**:就像本地 `docker pull node:18.20-alpine`,K8s 里改 `image:` 一行即可;写死版本号比总写 `latest` 更容易排查「昨天还能跑今天不行」。 - **何时拉镜像(imagePullPolicy)**:节点上还没有这个镜像时肯定要拉;若 CI 总往同一个 tag 里覆盖推送,一般要 **`Always`**,否则会用到旧层。 - **改启动命令**:镜像自带的入口不满足时,用 `command` / `args` 告诉 K8s「用哪条命令起 Node」;和 Docker 里覆盖 `ENTRYPOINT`/`CMD` 一个意思。 - **NODE_OPTIONS 等**:适合放在环境变量里,见 [`04-04-nodejs-环境变量与配置注入.md`](04-04-nodejs-环境变量与配置注入.md)。 ### 相对 `04-02` 的变更(原文 → 新文) | 位置 | 原文(`04-02`) | 新文(`04-03`) | |------|-----------------|-----------------| | `containers[].image` | `node:18-alpine` | `node:18.20-alpine` | | `containers[].imagePullPolicy` | (默认) | `IfNotPresent` | | `containers[].command` / `args` | 单行 `["node","-e","...listen(8080)"]` | `command: ["node"]` + `args` 两段,`listen(8080)`,`res.end('Hello from pinned image')` | 应用: ```bash kubectl apply -f ansible/files/04-01/04-03-nodejs-demo.yaml # 或仅打补丁(示意) kubectl set image deployment/nodejs-demo nodejs-demo=node:18.20-alpine -n default ``` ## 验证 ```bash kubectl describe pod -l app=nodejs-demo -n default | sed -n '/Image:/,/Port:/p' kubectl get pod -l app=nodejs-demo -n default curl -s --max-time 3 http://<节点IP>/node/ ``` 预期:Pod 为 Running;响应体与当前 `command`/`args` 一致。 ## 删除 / 回滚 ```bash kubectl rollout undo deployment/nodejs-demo -n default # 或恢复 04-01 原始 YAML 后 kubectl apply -f nodejs-demo.yaml ``` ## 失败排查 - **ImagePullBackOff**:镜像名/tag 错误、私有仓库未配置 `imagePullSecrets`、节点无法访问 registry。 - 统一网络与策略:`06-01-k3s-networkpolicy-故障排查.md` ## 相关文档 - [`04-04-nodejs-环境变量与配置注入.md`](04-04-nodejs-环境变量与配置注入.md) - [`04-08-nodejs-资源请求与限制.md`](04-08-nodejs-资源请求与限制.md) ## 排障 - **先看 playbook 输出**:失败时先定位是 deploy/wait/http_check 哪一步。 - **集群侧总览**:`kubectl get nodes -o wide`、`kubectl -n kube-system get pods -o wide`。 - **事件与日志**:`kubectl -n describe ...`、`kubectl -n logs ... --tail=200`。