K8s 应用架构可以理解为业务应用与平台之间的“运行契约”,至少回答以下问题:
因此,K8s 应用架构不是单个 YAML 文件,而是一套围绕应用生命周期的分层设计。
在生产架构中,常用对象可按职责划分:
层次 | 典型对象 | 主要职责 |
|---|---|---|
工作负载 | Deployment、StatefulSet、DaemonSet、Job、CronJob | 描述应用如何运行、副本数和更新策略 |
服务发现 | Service、EndpointSlice、Ingress、Gateway API | 提供稳定访问入口和流量分发 |
配置管理 | ConfigMap、Secret、External Secrets | 配置外置、密钥注入 |
存储 | PV、PVC、StorageClass、CSI | 持久化数据和存储编排 |
弹性治理 | HPA、VPA、PDB、ResourceQuota | 扩缩容、可用性保障和资源约束 |
安全隔离 | Namespace、RBAC、NetworkPolicy、ServiceAccount | 多租户隔离、权限和网络控制 |
可观测性 | Metrics、Logs、Traces、Events | 监控、排障和容量分析 |
发布运维 | Helm、Kustomize、Argo CD、Flux | 模板化、GitOps 和持续交付 |
一个常见误区是“所有应用都用 Deployment”。实际上,无状态服务优先 Deployment;有状态中间件使用 StatefulSet 并谨慎评估是否适合上 K8s;节点级代理用 DaemonSet;批处理用 Job/CronJob。
一个典型的 K8s 应用参考架构可以按流量和数据路径组织:
客户端
-> DNS / CDN / WAF
-> Ingress 或 Gateway API
-> 认证、限流、灰度路由
-> Service
-> Pod(Deployment / StatefulSet)
-> 缓存、数据库、消息队列、对象存储旁路能力包括:
在命名空间规划上,建议按“环境 + 团队/业务域”划分,例如 prod-order、staging-order。每个命名空间配合 ResourceQuota、LimitRange、RBAC 和默认拒绝的 NetworkPolicy,形成基本隔离边界。
业务服务尽量无状态,会话放到 Redis 或令牌中。数据库、消息队列等有状态系统是否上 K8s,要综合评估运维能力、存储性能、备份恢复和故障域。不要因为“云原生”而把核心数据库盲目容器化。
普通配置放 ConfigMap,敏感信息放 Secret,但生产环境更建议使用外部密钥管理或 External Secrets。镜像应做到“一次构建,多环境晋级”。
readinessProbe 决定是否接流量,livenessProbe 决定是否重启。应用还需处理 SIGTERM、设置 preStop 和合理 terminationGracePeriodSeconds,避免发布时请求中断。
所有生产 Pod 应设置 requests/limits。requests 影响调度,limits 影响运行时约束。结合 HPA、PDB 和拓扑分布,避免单节点故障导致整体不可用。
常规服务可用滚动更新;关键服务可采用蓝绿或金丝雀。发布流程应集成镜像扫描、配置校验、健康检查和自动回滚。GitOps 模式下,集群状态由 Git 声明式驱动,便于审计和回滚。
使用非 root 用户、只读根文件系统、最小权限 ServiceAccount、NetworkPolicy 默认拒绝、镜像签名和准入控制。Secret 不应明文提交到 Git。
至少具备指标、日志、追踪和事件四类数据。应用暴露业务指标和 RED/USE 指标,定义 SLO 和告警阈值。没有可观测性的微服务架构,排障成本会迅速上升。
下面仅用一个精简 YAML 表达最小部署单元:Deployment 提供多副本和就绪探针,Service 提供集群内稳定访问。生产环境还需补充 securityContext、PDB、HPA、NetworkPolicy 等。
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
spec:
replicas: 3
selector:
matchLabels: { app: demo }
template:
metadata:
labels: { app: demo }
spec:
containers:
- name: demo
image: nginx:1.27
ports: [{ containerPort: 80 }]
readinessProbe:
httpGet: { path: /, port: 80 }
resources:
requests: { cpu: 100m, memory: 128Mi }
limits: { cpu: 500m, memory: 256Mi }
---
apiVersion: v1
kind: Service
metadata:
name: demo
spec:
selector: { app: demo }
ports:
- port: 80
targetPort: 80这段代码的价值不在“能跑”,而在于体现几个架构习惯:副本化、标签选择、健康检查、资源约束和稳定服务入口。
建议按以下路径落地:
常见误区包括:把 K8s 当虚拟机用;所有服务都拆微服务;没有 requests/limits;Secret 明文入库;只配 liveness 不配 readiness;缺少 PDB 导致滚动发布中断;把数据库随意容器化;缺少 NetworkPolicy 导致横向移动风险。
Kubernetes 应用架构的核心,不是堆砌对象,而是围绕业务应用建立一套可运行的平台契约:工作负载合理、入口清晰、配置外置、存储有边界、安全默认收紧、发布可回滚、观测可排障、容量可治理。对多数团队而言,应先以简单、标准、可自动化的架构跑通生产闭环,再逐步引入服务网格、金丝雀、多集群等高级能力。架构的目标不是“最云原生”,而是让应用在 K8s 上稳定、可控、可持续演进。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。