第50篇 k8s之系列总结 + 项目演示与后续扩展

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 rundocker psdocker logsdocker exec,掌握了与容器交互的基本命令。

  • 镜像原理(第 3 篇):理解了分层结构、联合文件系统(Overlay2)和写时复制(CoW)------这是 Docker 高效、灵活、可复用的根基。

  • Dockerfile 编写 (第 4--5 篇):从 FROMRUNCOPYCMD 等核心指令,到多阶段构建、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 集群的能力。但云原生技术栈远比这庞大。以下是你可以继续深入的八个方向:

  1. Service Mesh 深度实践(Istio):深入掌握流量管理(金丝雀发布、AB 测试)、故障注入(混沌工程)、mTLS 无感加密、多集群网格联邦。从"会用 Istio"到"能定制网格策略"。

  2. Serverless 与 Knative:学习事件驱动的 Serverless 架构,使用 Knative 实现请求驱动的自动扩缩容(Scale-to-Zero)、基于事件源的函数触发。适合处理波峰波谷明显的业务场景。

  3. 边缘计算(KubeEdge):将 Kubernetes 延伸到边缘节点,支持 IoT、5G、CDN 等场景下的离线自治、边缘设备管理和云边协同。

  4. 多云与混合云管理:通过 Cluster API、Karmada 等工具实现跨云厂商、跨数据中心的统一集群管理和应用调度,避免云厂商锁定。

  5. GitOps 工作流深化:使用 ArgoCD + Helm + Image Updater 构建全自动化的 GitOps 流水线,实现从代码 Push 到镜像构建(GitHub Actions)再到自动部署(ArgoCD)的完整 CI/CD 闭环。

  6. FinOps 成本优化:使用 Kubecost、Karpenter 等工具分析集群成本构成,实施资源推荐、闲置资源回收、Spot 实例调度等优化手段。

  7. 安全合规加固:使用 OPA/Gatekeeper 实现策略即代码(Policy as Code),集成镜像签名(Cosign)、漏洞扫描(Trivy)、运行时安全(Falco),构建完整的 K8s 安全防线。

  8. Operator 开发:使用 Operator Framework(Operator SDK / Kubebuilder)编写自定义控制器,将运维知识编码为自动化 Operator,管理复杂有状态应用(如数据库集群、消息队列)的全生命周期。

五、结束语

这 50 篇文章的写作,每一篇都力求"内容充实、逻辑严谨、实例丰富"------初衷始终未变:为容器和 K8s 的学习者提供一条清晰、可动手、从零到生产级的完整路径

如果你从头到尾跟下来,现在你的工具箱里已经装了 Docker、Compose、Kubernetes、Helm、Prometheus、Grafana、Loki、ArgoCD、Istio,以及排错方法论和生产级运维经验。你不再是一个"听说过 K8s"的人,而是一个能独立部署、监控、排错、优化 K8s 集群的实践者。

但技术的世界永远是学不完的。完成了这套系列,并不代表你已经掌握了所有细节,而是说明你已经有能力在实践中继续成长。任何技术都是在实践中迭代出来的,不要害怕在生产环境中试验今天所学到的工具和理念。

纸上得来终觉浅,绝知此事要躬行。

愿我们在云原生的道路上越走越远。


想了解更多还可以去各个平台搜索「IT策士」,一起升级 IT 思维 !

相关推荐
卧室小白1 小时前
K8S-Pod的生命周期与调度
云原生·容器·kubernetes
江华森1 小时前
Docker 基础实战完整指南
运维·docker·容器
张忠琳11 小时前
【SR-IOV cni】(Part 4) SR-IOV Network Device Plugin 3.11.0 — 超深度架构分析
网络·云原生·kubernetes·cni·sriov
qq_4523962311 小时前
第二十篇:《Docker 故障排查常用命令与技巧》
运维·docker·容器
Henry-SAP17 小时前
SAP(ERP) BOM变更实时同步MRP方案
数据库·云原生
IT策士19 小时前
第45篇 k8s之实战:将 Web 应用迁移到 Kubernetes(下)
前端·容器·kubernetes
学代码的真由酱19 小时前
Docker基础
运维·docker·容器
devilnumber20 小时前
Kubernetes(K8s)重要知识点复习与记录
云原生·容器·kubernetes
IT策士21 小时前
第 47 篇 k8s之生产级考量:高可用、备份与升级
云原生·容器·kubernetes