86 lines
3.1 KiB
Markdown
86 lines
3.1 KiB
Markdown
# 04-06-nodejs-副本与滚动发布
|
||
|
||
> 调整 `nodejs-demo` 的 **副本数** 与 **滚动更新策略**,实现多实例与可控发布。
|
||
|
||
|
||
## TL;DR
|
||
|
||
- **手动练习**:复制本课目录 `ansible/files/04-06/` 下清单到目标路径,按需改字段后按本文 `kubectl`/bash 操作(学习路径可不使用 verify)。
|
||
- **自动化验收**:`./ansible/bin/verify.sh run 04-06`
|
||
- **关键前置**:按本文「前置条件」准备环境变量/Secret/入口 IP
|
||
- **成功判据**:达到本文「预期」且 playbook 断言通过
|
||
- **排障**:见本文「排障」
|
||
|
||
## 前置条件
|
||
|
||
- 已部署 `nodejs-demo`(`04-01`)。
|
||
- 多副本时应用须 **无状态** 或可共享会话;否则需粘性会话/外部会话存储(本文不展开)。
|
||
|
||
## 清单路径(本课分目录)
|
||
|
||
| 本篇完整清单 | [`ansible/files/04-06/04-06-nodejs-demo.yaml`](../ansible/files/04-06/04-06-nodejs-demo.yaml) |
|
||
| 应用 | `kubectl apply -f ansible/files/04-06/04-06-nodejs-demo.yaml` |
|
||
|
||
`replicas` 与 `strategy` 在 **Deployment.spec** 下,与 `selector` / `template` 同级。
|
||
|
||
## 场景说明(白话)
|
||
|
||
- **多副本**:同样应用跑多份,一台挂了别的还能接客;配合 Service 做负载均衡。
|
||
- **滚动发布**:换新版本时**一个一个 Pod 换**,而不是全停再起(可通过 `maxSurge` / `maxUnavailable` 调「多激进」)。
|
||
|
||
### 相对 `04-05` 的变更(原文 → 新文)
|
||
|
||
| 位置 | 原文(`04-05`) | 新文(`04-06`) |
|
||
|------|-----------------|-----------------|
|
||
| `spec.replicas` | `1` | `3` |
|
||
| `spec.strategy` | (默认 RollingUpdate) | 显式 `RollingUpdate`,`maxSurge: 1`,`maxUnavailable: 0` |
|
||
|
||
验证:
|
||
|
||
```bash
|
||
kubectl get deploy nodejs-demo -n default
|
||
kubectl get pod -l app=nodejs-demo -n default -o wide
|
||
```
|
||
|
||
- **`maxUnavailable: 0`**:发布时先起新 Pod 再摘旧 Pod,适合要求 **不中断** 的场景(需足够资源 surge)。
|
||
- 资源紧张时可适当允许 `maxUnavailable: 1`。
|
||
|
||
## 发布新版本
|
||
|
||
```bash
|
||
kubectl set image deployment/nodejs-demo nodejs-demo=node:20-alpine -n default
|
||
kubectl rollout status deployment/nodejs-demo -n default
|
||
```
|
||
|
||
## 回滚
|
||
|
||
```bash
|
||
kubectl rollout undo deployment/nodejs-demo -n default
|
||
kubectl rollout history deployment/nodejs-demo -n default
|
||
```
|
||
|
||
## 验证
|
||
|
||
```bash
|
||
curl -s --max-time 3 -H "Host: app.example.local" "http://<节点IP>/api/"
|
||
```
|
||
|
||
多次请求应看到多 Pod 分担(若 Service 为 ClusterIP + Ingress,由 kube-proxy/Traefik 负载)。
|
||
|
||
## 失败排查
|
||
|
||
- **一直滚动中**:新 Pod 未 Ready(探针、镜像拉取);`kubectl describe deploy` / `kubectl get rs`。
|
||
- **会话漂移**:多副本下登录态不一致为应用架构问题。
|
||
- `06-01-k3s-networkpolicy-故障排查.md`
|
||
|
||
## 相关文档
|
||
|
||
- [`04-05-nodejs-探针与健康检查.md`](04-05-nodejs-探针与健康检查.md)
|
||
- [`04-13-nodejs-HPA.md`](04-13-nodejs-HPA.md)
|
||
|
||
## 排障
|
||
|
||
- **先看 playbook 输出**:失败时先定位是 deploy/wait/http_check 哪一步。
|
||
- **集群侧总览**:`kubectl get nodes -o wide`、`kubectl -n kube-system get pods -o wide`。
|
||
- **事件与日志**:`kubectl -n <ns> describe ...`、`kubectl -n <ns> logs ... --tail=200`。
|