IT策士 10余年一线大厂经验,专注 IT 思维、架构、职场进阶。我会在各个平台持续发布最新文章,助你少走弯路。
这是《Docker 从 0 到 1 再到 Kubernetes 实战》系列的最后一篇。
50 篇文章,从一条 docker run hello-world 开始,到在 Kubernetes 集群上用 Istio 服务网格管理流量。我们走过了容器技术从单机到集群、从手动到自动化、从"能跑"到"生产级"的完整演进之路。
今天这篇,我将做三件事:回顾 ------梳理你在这 50 篇文章中构建起的知识体系;演示 ------用一个完整的端到端流程,把镜像构建、Compose 编排、K8s 部署、HPA 弹性伸缩、滚动更新、监控告警这六个关键环节串联起来,每个环节都给出真实的命令和输出;展望------为你指明进阶学习的方向。
一、系列全景回顾:从"单容器"到"服务网格"
这个系列的设计逻辑是:先扎实掌握单机容器,再理解单机编排,然后深入集群编排,最后掌握生产级运维。这是一条被无数实践证明有效的学习路径。
第一部分:Docker 容器化基础(第 1--10 篇)
你从零开始,学会了容器化最核心的能力:
-
环境搭建(第 1 篇):在三类操作系统上安装 Docker,跑通第一个容器。
-
容器操作 (第 2 篇):
docker run、docker ps、docker logs、docker exec,掌握了与容器交互的基本命令。 -
镜像原理(第 3 篇):理解了分层结构、联合文件系统(Overlay2)和写时复制(CoW)------这是 Docker 高效、灵活、可复用的根基。
-
Dockerfile 编写 (第 4--5 篇):从
FROM、RUN、COPY、CMD等核心指令,到多阶段构建、BuildKit cache mount 等优化技巧,能把任意应用打包为标准镜像。 -
生命周期与调试(第 6 篇):掌握了容器状态转换、重启策略、健康检查、日志轮转。
-
数据管理(第 7 篇):Volume 和 Bind Mount 实现数据持久化和多容器共享。
-
网络基础(第 8--9 篇):从默认 bridge 到自定义 bridge,从端口映射的 iptables 原理到容器 DNS 解析,理解了 Docker 的网络模型。
-
综合实战(第 10 篇):将 Flask + Redis 计数器应用完整容器化,用脚本一键启动。
第二部分:Docker Compose 编排(第 11--18 篇)
从手动敲命令升级为声明式编排:
-
Compose 入门 (第 11 篇):
docker-compose.yml一条命令启动多服务。 -
文件详解(第 12 篇):services、networks、volumes 三大核心模块拆解。
-
环境变量与配置(第 13 篇):四种来源、变量替换、多环境切换。
-
开发环境优化(第 14 篇):Bind Mount 热重载、调试技巧。
-
服务依赖与启动顺序 (第 15 篇):
depends_on+healthcheck解决竞态条件。 -
实战案例(第 16 篇):编排 WordPress + MySQL。
-
多文件覆盖(第 17 篇):按环境拆分配置,基础 + 开发/生产覆盖。
-
从 Compose 到 K8s(第 18 篇):建立概念映射,为进入 K8s 做思维准备。
第三部分:Kubernetes 核心(第 19--38 篇)
进入 K8s 核心对象和机制的深度学习:
-
架构解读(第 19 篇):控制平面(API Server、etcd、Scheduler、Controller Manager)与工作节点(kubelet、kube-proxy)的协同机制。
-
实验环境(第 20 篇):Minikube 搭建本地集群。
-
Pod(第 21--23 篇):从 YAML 结构、生命周期与重启策略,到 Sidecar/Adapter/Ambassador 设计模式。
-
探针(第 24 篇):liveness、readiness、startup 三种探针的配置与黄金法则。
-
Deployment(第 25--26 篇):声明式管理、副本控制、滚动更新与回滚。
-
控制器(第 27 篇):DaemonSet、Job、CronJob。
-
Service(第 28--29 篇):ClusterIP/NodePort/LoadBalancer 三种类型,Endpoints、kube-proxy、CoreDNS 的服务发现全链路。
-
Ingress(第 30--31 篇):七层路由、TLS 终端、路径重写、Basic Auth。
-
配置管理(第 32--33 篇):ConfigMap 和 Secret 的创建、注入、更新策略。
-
存储(第 34--35 篇):emptyDir/hostPath → PV/PVC → StorageClass 动态供给。
-
资源管理(第 36 篇):Requests/Limits 与 QoS 等级。
-
调度策略(第 37 篇):节点亲和性、Pod 亲和/反亲和、污点与容忍。
-
安全(第 38 篇):RBAC 与 ServiceAccount 最小权限。
第四部分:Kubernetes 生态与实战(第 39--49 篇)
从"会用 K8s"迈向"能运维生产集群":
-
Helm(第 39--40 篇):包管理工具,从使用官方 Chart 到从零编写自定义 Chart。
-
监控(第 41 篇):Metrics Server → Prometheus + Grafana 监控栈。
-
日志(第 42 篇):EFK vs Loki,Loki + LogQL 聚合日志。
-
网络安全(第 43 篇):NetworkPolicy 实现 Pod 间流量隔离。
-
应用迁移(第 44--45 篇):将 Flask + Redis 从 Compose 完整迁移到 K8s,加上 Ingress、HPA、滚动更新、监控和日志。
-
CI/CD(第 46 篇):GitOps 理念 + ArgoCD 实现自动部署和配置漂移自愈。
-
生产级运维(第 47 篇):HA 拓扑、etcd 备份恢复、版本升级。
-
排错(第 48 篇):四层排查法 + 五大高频故障场景。
-
Istio(第 49 篇):Sidecar 代理、金丝雀发布、熔断、零侵入可观测性。
二、端到端项目演示:Flask + Redis 计数器的完整部署流程
现在,让我们用一个完整的端到端演示,把贯穿整个系列的六个关键环节串联起来。
环节一:镜像构建(docker build)
我们从 Flask 应用的源代码开始,使用第 5 篇学到的多阶段 Dockerfile 构建镜像。
bash
# 克隆项目代码(假设已存在于本地)
cd flask-redis-counter
ls
# app.py Dockerfile requirements.txt .dockerignore
bash
# 执行多阶段构建
docker build -t flask-redis-counter:3.0 .
bash
[+] Building 35.2s (17/17) FINISHED
=> [builder 1/4] FROM python:3.12-slim 0.0s
=> [builder 2/4] WORKDIR /build 0.1s
=> [builder 3/4] RUN apt-get update && ... 14.2s
=> [builder 4/4] RUN pip wheel --no-cache-dir ... 9.5s
=> [runtime 1/9] FROM python:3.12-slim 0.0s
=> [runtime 2/9] RUN groupadd -r appuser && ... 0.4s
=> [runtime 3/9] WORKDIR /app 0.0s
=> [runtime 4/9] COPY --from=builder /wheels /wheels 0.2s
=> [runtime 5/9] COPY requirements.txt . 0.1s
=> [runtime 6/9] RUN pip install --no-index ... 3.8s
=> [runtime 7/9] RUN mkdir -p /app/logs && chown ... 0.3s
=> [runtime 8/9] COPY --chown=appuser:appuser . . 0.1s
=> [runtime 9/9] USER appuser 0.0s
=> exporting to image 2.1s
=> => naming to docker.io/library/flask-redis-counter:3.0 0.0s
bash
# 查看镜像体积
docker images | grep flask-redis-counter
# flask-redis-counter 3.0 a1b2c3d4e5f6 138MB
138MB 的镜像包含 Python 运行时、Flask、Redis 客户端及所有依赖,且不包含 gcc 等编译工具。
环节二:Compose 编排(docker compose up)
使用第 11--13 篇学到的 Compose 文件,一键启动多服务:
bash
# 启动 Compose 环境
docker compose up -d
bash
[+] Running 3/3
✔ Network flask-redis-counter_app-net Created 0.1s
✔ Container redis Healthy 5.2s
✔ Container flask-app Started 5.5s
bash
# 验证健康检查
docker compose ps
# NAME IMAGE STATUS PORTS
# flask-app flask-redis-counter:3.0 Up 10 seconds (healthy) 0.0.0.0:5000->5000/tcp
# redis redis:alpine Up 30 seconds (healthy) 6379/tcp
bash
# 测试计数器
curl http://localhost:5000
# Hello World! I have been seen 1 times.
bash
# 清理 Compose 环境
docker compose down
环节三:K8s 对象部署(kubectl apply)
将第 44 篇中准备好的 YAML 文件应用到集群:
bash
# 确保 Minikube 已启动
minikube status
# minikube: Running
# 加载本地镜像到 Minikube
minikube image load flask-redis-counter:3.0
bash
# 部署全部 K8s 资源
kubectl apply -f base/
bash
deployment.apps/redis created
service/redis-service created
persistentvolumeclaim/redis-pvc created
configmap/flask-config created
secret/flask-secret created
deployment.apps/flask-deployment created
service/flask-service created
ingress.networking.k8s.io/flask-ingress created
horizontalpodautoscaler.autoscaling/flask-hpa created
bash
# 查看所有资源状态
kubectl get pods,svc,deploy,ingress,hpa
bash
NAME READY STATUS RESTARTS AGE
pod/flask-deployment-xxxxxxxxx-xxxxx 1/1 Running 0 30s
pod/flask-deployment-xxxxxxxxx-yyyyy 1/1 Running 0 30s
pod/flask-deployment-xxxxxxxxx-zzzzz 1/1 Running 0 30s
pod/redis-xxxxxxxxx-xxxxx 1/1 Running 0 30s
NAME TYPE CLUSTER-IP PORT(S) AGE
service/flask-service ClusterIP 10.96.200.80 5000/TCP 30s
service/redis-service ClusterIP 10.96.100.50 6379/TCP 30s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/flask-deployment 3/3 3 3 30s
deployment.apps/redis 1/1 1 1 30s
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/flask-ingress nginx counter.local 192.168.49.2 80 30s
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
horizontalpodautoscaler.autoscaling/flask-hpa Deployment/flask-deployment 5%/50% 2 10 3 30s
所有资源 READY 均为期望值,Deployment 3/3 全部就绪,HPA 当前 CPU 使用率 5%,状态健康。
环节四:HPA 弹性伸缩
使用 ab 压力测试工具模拟流量高峰,触发 HPA 自动扩容:
bash
# 在终端 1 持续观察 HPA 和 Pod 变化
kubectl get hpa flask-hpa -w
# NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS
# flask-hpa Deployment/flask-deployment 5%/50% 2 10 3
# 在终端 2 发起压力测试
ab -n 10000 -c 100 -H "Host: counter.local" http://$(minikube ip)/
在终端 1 中观察到的 HPA 变化:
bash
flask-hpa Deployment/flask-deployment 5%/50% 2 10 3
flask-hpa Deployment/flask-deployment 120%/50% 2 10 3
flask-hpa Deployment/flask-deployment 120%/50% 2 10 6
flask-hpa Deployment/flask-deployment 65%/50% 2 10 8
flask-hpa Deployment/flask-deployment 40%/50% 2 10 8
bash
# 同时观察 Pod 数量变化
kubectl get pods -l app=flask-counter -w
# flask-deployment-xxxxxxxxx-xxxxx 1/1 Running 0
# flask-deployment-xxxxxxxxx-yyyyy 1/1 Running 0
# flask-deployment-xxxxxxxxx-zzzzz 1/1 Running 0
# flask-deployment-xxxxxxxxx-aaaaa 0/1 ContainerCreating 0
# flask-deployment-xxxxxxxxx-bbbbb 0/1 ContainerCreating 0
# flask-deployment-xxxxxxxxx-aaaaa 1/1 Running 0
# flask-deployment-xxxxxxxxx-bbbbb 1/1 Running 0
HPA 检测到 CPU 飙升至 120% 后,自动将副本数从 3 逐步扩展到 8,将平均 CPU 负载拉回 40%。整个过程无需人工干预。
环节五:滚动更新
发布 v4.0 版本,体验零停机更新:
bash
# 构建并加载 v4.0 镜像
docker build -t flask-redis-counter:4.0 .
minikube image load flask-redis-counter:4.0
# 触发滚动更新
kubectl set image deployment/flask-deployment flask=flask-redis-counter:4.0
bash
# 实时观察滚动更新进度
kubectl rollout status deployment/flask-deployment
# Waiting for deployment "flask-deployment" rollout to finish:
# 1 out of 3 new replicas have been updated...
# deployment "flask-deployment" successfully rolled out
同时观察 Pod 的逐个替换过程:
bash
kubectl get pods -l app=flask-counter -w
# flask-deployment-xxxxxxxxx-xxxxx 1/1 Running 0
# flask-deployment-yyyyyyyy-aaaaa 0/1 ContainerCreating 0
# flask-deployment-yyyyyyyy-aaaaa 1/1 Running 0
# flask-deployment-xxxxxxxxx-xxxxx 1/1 Terminating 0
# flask-deployment-yyyyyyyy-bbbbb 0/1 ContainerCreating 0
# flask-deployment-yyyyyyyy-bbbbb 1/1 Running 0
# flask-deployment-xxxxxxxxx-yyyyy 1/1 Terminating 0
新旧 Pod 逐个交替------先创建新 Pod,等待就绪后再删除旧 Pod。在整个更新过程中,始终有足够数量的 Pod 在服务。
环节六:监控告警
Prometheus + Grafana + Alertmanager 构成了完整的可观测性体系。
在 Grafana 仪表板上可以看到应用的关键指标:
-
CPU 使用率:从基线的 5% 在压测期间飙升至 120%,触发 HPA 扩容后逐步回落至 40%
-
内存使用量:稳定在 100MiB~128MiB 之间,符合设定的 Requests/Limits 范围
-
请求速率:QPS 从稳态的 10 左右飙升至 500+,扩容后各 Pod 分摊压力
-
错误率:保持为 0%,健康检查持续通过
当配置的告警规则被触发时(如 Pod 5 分钟内重启超过 2 次),Alertmanager 会发送告警通知:
-
告警名称:PodFrequentlyRestarting
-
告警级别:warning
-
告警内容:Pod flask-deployment-xxxxxxxxx-xxxxx has restarted 5 times in the last 5 minutes.
在 Grafana 中无缝切换到 Loki 查询,使用 {app="flask-counter"} |= "ERROR" 可以立即看到导致错误的具体日志行,完成从"发现异常"到"定位根因"的闭环。
三、技术演进路线图
回顾整个系列,我们走过的路正是容器技术从单机到集群、从手动到自动化、从"能跑"到"生产级"的完整演进路径:
bash
单机容器化(Docker)
├── 将应用打包为镜像:Dockerfile → 多阶段构建
├── 管理容器生命周期:run / stop / logs / exec
├── 管理数据与网络:Volume / Bind Mount / 自定义 Bridge
└── 贯穿案例:docker build + docker run 启动 Flask + Redis
↓ 从手动命令到声明式 YAML
单机编排(Docker Compose)
├── 声明式管理多服务:docker-compose.yml
├── 环境配置分离:.env + 多文件覆盖
└── 贯穿案例:docker compose up -d 一键启动
↓ 从单机到集群
集群编排(K8s 核心对象)
├── 工作负载管理:Pod → Deployment → DaemonSet / Job / CronJob
├── 网络与服务发现:Service → Endpoints → CoreDNS → Ingress
├── 配置与存储:ConfigMap / Secret → PVC / StorageClass
├── 调度与安全:亲和性 / 污点容忍 → RBAC / ServiceAccount
└── 贯穿案例:kubectl apply -f 部署全套应用
↓ 从"能跑"到"可运维"
生产级运维
├── 包管理:Helm Chart 模板化、版本化
├── 监控与日志:Prometheus + Grafana + Loki
├── CI/CD:GitOps + ArgoCD 自动部署
├── 网络治理:NetworkPolicy → Istio 服务网格
├── 高可用:多节点 HA、etcd 备份恢复、版本升级
└── 贯穿案例:Git Push → 自动部署 → 自动伸缩 → 零停机更新
四、后续扩展:进阶学习方向
完成这 50 篇文章,你已经具备了独立部署和运维中小规模 K8s 集群的能力。但云原生技术栈远比这庞大。以下是你可以继续深入的八个方向:
-
Service Mesh 深度实践(Istio):深入掌握流量管理(金丝雀发布、AB 测试)、故障注入(混沌工程)、mTLS 无感加密、多集群网格联邦。从"会用 Istio"到"能定制网格策略"。
-
Serverless 与 Knative:学习事件驱动的 Serverless 架构,使用 Knative 实现请求驱动的自动扩缩容(Scale-to-Zero)、基于事件源的函数触发。适合处理波峰波谷明显的业务场景。
-
边缘计算(KubeEdge):将 Kubernetes 延伸到边缘节点,支持 IoT、5G、CDN 等场景下的离线自治、边缘设备管理和云边协同。
-
多云与混合云管理:通过 Cluster API、Karmada 等工具实现跨云厂商、跨数据中心的统一集群管理和应用调度,避免云厂商锁定。
-
GitOps 工作流深化:使用 ArgoCD + Helm + Image Updater 构建全自动化的 GitOps 流水线,实现从代码 Push 到镜像构建(GitHub Actions)再到自动部署(ArgoCD)的完整 CI/CD 闭环。
-
FinOps 成本优化:使用 Kubecost、Karpenter 等工具分析集群成本构成,实施资源推荐、闲置资源回收、Spot 实例调度等优化手段。
-
安全合规加固:使用 OPA/Gatekeeper 实现策略即代码(Policy as Code),集成镜像签名(Cosign)、漏洞扫描(Trivy)、运行时安全(Falco),构建完整的 K8s 安全防线。
-
Operator 开发:使用 Operator Framework(Operator SDK / Kubebuilder)编写自定义控制器,将运维知识编码为自动化 Operator,管理复杂有状态应用(如数据库集群、消息队列)的全生命周期。
五、结束语
这 50 篇文章的写作,每一篇都力求"内容充实、逻辑严谨、实例丰富"------初衷始终未变:为容器和 K8s 的学习者提供一条清晰、可动手、从零到生产级的完整路径。
如果你从头到尾跟下来,现在你的工具箱里已经装了 Docker、Compose、Kubernetes、Helm、Prometheus、Grafana、Loki、ArgoCD、Istio,以及排错方法论和生产级运维经验。你不再是一个"听说过 K8s"的人,而是一个能独立部署、监控、排错、优化 K8s 集群的实践者。
但技术的世界永远是学不完的。完成了这套系列,并不代表你已经掌握了所有细节,而是说明你已经有能力在实践中继续成长。任何技术都是在实践中迭代出来的,不要害怕在生产环境中试验今天所学到的工具和理念。
纸上得来终觉浅,绝知此事要躬行。
愿我们在云原生的道路上越走越远。
想了解更多还可以去各个平台搜索「IT策士」,一起升级 IT 思维 !