3.1 KiB
3.1 KiB
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 |
| 应用 | 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 |
验证:
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。
发布新版本
kubectl set image deployment/nodejs-demo nodejs-demo=node:20-alpine -n default
kubectl rollout status deployment/nodejs-demo -n default
回滚
kubectl rollout undo deployment/nodejs-demo -n default
kubectl rollout history deployment/nodejs-demo -n default
验证
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
相关文档
排障
- 先看 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。