本章目录(点击跳转):
- 10.1 综合案例:部署 WordPress + MySQL
- 10.1.1 准备配置与密钥
- 10.1.2 完整 YAML
- 10.1.3 部署与验证
- 10.1.4 升级演练
- 10.1.5 清理
- 10.2 生产环境最佳实践清单
- 10.2.1 集群层面
- 10.2.2 应用层面(最重要)
- 10.2.3 安全层面
- 10.2.4 发布与运维
- 10.3 常用命令速查表(全书浓缩)
- 10.4 下一步学习路线
- 10.5 全书总结
本章目标:用完整案例(WordPress + MySQL)把前面 9 章串起来,再给一份"生产上 K8s 前必看"的最佳实践清单和常用命令速查表。
10.1 综合案例:部署 WordPress + MySQL
目标架构:
浏览器 → NodePort Service → WordPress Pod (x2) → MySQL Pod (x1, 带 PVC)
涉及知识点:Deployment、StatefulSet/带 PVC 的 Deployment、ConfigMap、Secret、Service、就绪探针、资源限制——正好是全书的大串联。
10.1.1 准备配置与密钥
# 1) 数据库密码(Secret)
kubectl create secret generic wp-db-secret \
--from-literal=password='Wp@2026K8s' \
--from-literal=username=wpuser
# 2) WordPress 配置(ConfigMap)
kubectl create configmap wp-config \
--from-literal=WORDPRESS_DB_HOST=mysql \
--from-literal=WORDPRESS_DB_USER=wpuser \
--from-literal=WORDPRESS_DB_NAME=wordpress
建议:把这两条命令生成的 YAML 用
--dry-run=client -o yaml落盘进 git(密码部分用加密方案管理,见第 7 章)。
10.1.2 完整 YAML
# wordpress-stack.yaml
# ---------- 1. MySQL ----------
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: wp-db-secret
key: password
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wpuser
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: wp-db-secret
key: password
ports:
- containerPort: 3306
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: "1"
memory: 1Gi
readinessProbe:
tcpSocket:
port: 3306
periodSeconds: 5
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumes:
- name: data
persistentVolumeClaim:
claimName: mysql-data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5Gi
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
---
# ---------- 2. WordPress ----------
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 2
selector:
matchLabels:
app: wordpress
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:6.7-php8.3-apache
envFrom:
- configMapRef:
name: wp-config
- secretRef:
name: wp-db-secret # 注意:这里会引入 password/username 两个变量,
# WordPress 镜像约定 WORDPRESS_DB_PASSWORD,见下方 env 修正
env:
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: wp-db-secret
key: password
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: wordpress
spec:
type: NodePort
selector:
app: wordpress
ports:
- port: 80
targetPort: 80
nodePort: 30081
10.1.3 部署与验证
kubectl apply -f wordpress-stack.yaml
# 1) 等资源全部就绪
kubectl get pods -w
# mysql 1/1 Running 且 READY;wordpress 2/2
# 2) 确认 WordPress 连上了数据库
kubectl logs -l app=wordpress --tail=20
# 看到 "Successful database connection" 或正常 Apache 日志即可
# 3) 打开网页
minikube service wordpress --url
# 或 curl http://<节点IP>:30081
# 看到 WordPress 安装页面 → 成功!
10.1.4 升级演练
# 把 WordPress 升到更高版本(改 YAML 里的 image 后 apply)
kubectl set image deployment/wordpress wordpress=wordpress:6.8-php8.3-apache
kubectl rollout status deployment/wordpress
# 观察两个 Pod 逐个替换,全程可访问
# 有问题?回滚
kubectl rollout undo deployment/wordpress
10.1.5 清理
kubectl delete -f wordpress-stack.yaml
kubectl delete configmap wp-config
kubectl delete secret wp-db-secret
# PVC 默认保留(reclaimPolicy 视 StorageClass 而定),确认后可:
kubectl delete pvc mysql-data
10.2 生产环境最佳实践清单
10.2.1 集群层面
- 至少 3 个控制面节点、跨可用区;工作节点按业务分池(不同机型/用途打标签)。
- 节点打标签 + 污点(taint)隔离:如
gpu=true、dedicated=ml:NoSchedule。 - 集群版本跟进:跟随社区,落后不超过 1-2 个版本(1.35 是当前主流线)。
10.2.2 应用层面(最重要)
- 无状态化:会话放 Redis 等外部组件,应用本身不存状态 → 随意扩缩容。
- 必须写 resources:requests 按日常水位,limits 按峰值;先压测再定。
- 必须配探针:readiness 必有;liveness 谨慎(别把"暂时慢"判成"死");慢启动加 startup。
- 优雅退出:应用处理 SIGTERM;
terminationGracePeriodSeconds给足时间。 - 反亲和:多副本打散到不同节点:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: web
topologyKey: kubernetes.io/hostname
- PDB(PodDisruptionBudget):保证升级/维护时至少 N 个副本可用:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: web-pdb
spec:
minAvailable: 1
selector:
matchLabels:
app: web
10.2.3 安全层面
- 镜像用最小基础镜像(distroless/alpine),定期扫描漏洞(Trivy 等)。
- 容器以非 root 运行:
securityContext: { runAsNonRoot: true, runAsUser: 1000 }。 - 默认拒绝:NetworkPolicy 白名单;只暴露必须暴露的 Service。
- 密钥管理:etcd 静态加密 + 外部 KMS(生产强烈建议);git 里不存明文 Secret。
- RBAC 最小权限 + 定期审计(第 8 章)。
10.2.4 发布与运维
- 一切变更走 YAML + git(GitOps:Argo CD / Flux 自动同步,了解即可)。
- 发布用滚动更新 + PDB;重大版本先灰度(新 Deployment 小流量,观察后切)。
- 监控告警三件套必备:Prometheus(指标)+ 日志系统 + 告警通道。
- 备份:数据库定期 dump + Velero 集群级备份,并演练恢复(没演练过的备份等于没有)。
10.3 常用命令速查表(全书浓缩)
# ===== 看 =====
kubectl get pods -A -o wide # 全局 Pod 状态
kubectl get all -n <ns> # 某 ns 所有资源
kubectl describe pod <name> # 详情+事件
kubectl logs <name> -f # 实时日志
kubectl logs <name> -p # 上次崩溃日志
kubectl top pods -A --sort-by=memory # 资源消耗
kubectl get events -A --sort-by=.lastTimestamp
kubectl get endpoints <svc> # Service 背后有没有 Pod
kubectl auth can-i --list # 我的权限
# ===== 改 =====
kubectl apply -f xxx.yaml # 创建/更新
kubectl apply -f xxx.yaml --dry-run=client -o yaml # 预演
kubectl scale deployment web --replicas=5 # 扩缩容
kubectl set image deployment/web web=app:v2 # 升级
kubectl rollout status/undo/history deployment/web # 发布三件套
kubectl rollout restart deployment web # 重启(如改完 ConfigMap)
kubectl edit -n dev configmap app-config # 在线改配置(慎用)
# ===== 玩 =====
kubectl exec -it <pod> -- sh # 进容器
kubectl port-forward svc/web 8080:80 # 本地访问
kubectl cp <pod>:/app/cfg.yaml ./cfg.yaml # 拷文件
kubectl debug -it <pod> --image=busybox:1.36 # 调试容器
kubectl run tmp --rm -it --image=busybox:1.36 -- sh # 临时 Pod
# ===== 删 =====
kubectl delete -f xxx.yaml # 按文件删
kubectl delete pod -l app=web # 按标签删(Deployment 会自动补)
kubectl delete ns <ns> # 删整个 ns(危险)
10.4 下一步学习路线
学完本书(约等于 K8s 中级水平),建议按兴趣继续:
| 方向 | 关键词 |
|---|---|
| 深入原理 | kube-scheduler 调度算法、CRI/CNI/CSI、etcd、apiserver 架构 |
| 生态工具 | Helm(打包)、Argo CD(GitOps)、cert-manager(证书)、Operator(自定义控制器) |
| 平台化 | 多集群管理、服务网格(Istio/Linkerd)、Serverless(Knative) |
| 认证 | CKA(管理员认证,实验考试)、CKAD(应用开发者认证) |
| 源码学习 | 读 apiserver + kubelet 源码,跑 etcd 单节点集群观察 |
10.5 全书总结
回顾一下这条学习主线:
第1章 是什么 → 容器编排、声明式思想
第2章 搭环境 → minikube + kubectl
第3章 Pod → 最小单位、探针、排障基础
第4章 工作负载 → Deployment 四件套、有状态/任务型
第5章 网络 → Service、DNS、Ingress、NetworkPolicy
第6章 存储 → PV/PVC/SC
第7章 配置密钥 → ConfigMap/Secret 三种注入
第8章 隔离权限 → Namespace、Quota、RBAC
第9章 可观测性 → 日志/指标/事件 + 排障流程
第10章 实战 → 完整案例 + 生产清单
第11章 急救 → 高频故障手册 + 日常维护清单
一句话收尾:K8s 的核心就一句"声明期望,自动收敛"。把这一句吃透,剩下的都是语法。
恭喜你读完全书。去 minikube 里把每个实验跑一遍,你就真的会了。
原文链接:第10章 综合实战与生产最佳实践,转载请注明来源!
