一套实用的 K8s 经典部署方案,通常由 Deployment 管理应用副本、Service 提供稳定访问入口,再按负载情况配置弹性伸缩。所谓“一键部署”,重点不是把集群变成无需管理的黑盒,而是把镜像、配置、资源需求和发布步骤标准化,让同一套应用配置能够重复部署、更新和回滚。
如果目标是快速上线一个普通 Web 服务,可以先从 Deployment、Service 和 HPA(水平 Pod 自动伸缩)入手。服务网格并非每个项目的必选项:先把应用运行和扩缩容做稳定,只有当流量治理、服务间通信或可观测性需求确实增加时,再引入网格更合适。
先把应用部署和访问入口固定下来
Deployment 负责声明应用使用哪个镜像、需要多少个副本,以及容器的资源需求;Service 则通过标签选择对应的 Pod,为集群内访问提供稳定地址。Pod 可能因更新或故障重新创建,地址会变化,因此业务服务通常不应直接依赖某个 Pod IP。
下面是一个精简示例。镜像名、端口和资源数值应按实际应用调整;其中 CPU 的 requests 配置也会影响后续基于 CPU 利用率的自动伸缩。
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: example/web:1.0
ports:
- containerPort: 8080
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: "1"
memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080
type: ClusterIP
Service 的类型取决于访问范围。只供集群内部调用时,ClusterIP 通常够用;需要从集群外访问时,再根据环境配置 Ingress、网关或云厂商负载均衡。把入口层和应用副本分开管理,后续扩缩容时就不必频繁改变客户端访问地址。
弹性伸缩要有指标,也要有资源基线
HPA 根据指标调整 Pod 数量,但它不会凭空判断业务是否繁忙。基于 CPU 利用率伸缩时,集群需要具备可用的指标采集能力,容器也应设置合理的 CPU requests。若没有资源请求值,利用率的计算基准可能不符合预期;如果集群没有提供指标,HPA 也无法正常依据 CPU 数据作出调整。
例如,可以先将副本数限制在 2 到 10 之间,并把目标 CPU 利用率设为 70%。这只是配置示例,不是适用于所有应用的最佳值:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
设置目标值时,要同时看扩容速度和应用承载能力。扩容过慢,突发流量可能先造成响应变慢;上限设得过高,则可能耗尽节点资源。还要确认集群有足够的可调度容量,否则 HPA 虽然增加了副本数,新的 Pod 仍可能处于 Pending 状态。对以内存、队列长度或请求量为主要瓶颈的服务,CPU 指标未必能反映真实负载,应选择能代表业务压力的指标。
服务网格不是“一键部署”的前置条件
服务网格可以在应用之间增加流量管理、通信策略和遥测能力,适用于服务数量较多、需要细粒度治理的场景。但它也会带来控制面、数据面配置和故障排查成本。单体应用或少量服务,通常先用 Kubernetes 的 Service、Ingress 和应用自身的监控能力就能满足基本需求。
采用网格前,先明确要解决的问题:是需要灰度流量分配、服务间加密、统一重试策略,还是统一追踪?如果需求不明确,只因“经典架构”而安装网格,往往会增加发布环节,却没有相应收益。对已决定采用网格的系统,应先在非关键服务验证延迟、资源开销和故障恢复方式,再逐步扩大范围。
把部署封装成可重复的一键流程
手动运行 kubectl apply 可以完成基础发布,但若要让多人稳定复用,建议把 Kubernetes 清单、环境差异和发布操作纳入统一流程。小型项目可以用一组版本化配置配合脚本;需要管理多环境或较多参数时,可以采用 Helm 等模板化方式。无论选哪种方式,都应避免把密码等敏感信息直接写进公开配置文件。
一键流程至少应做到:选择目标环境与镜像版本,应用经过审查的配置,等待 Deployment 达到可用状态,并在失败时给出原因或执行回滚。镜像使用明确版本而不是持续变化的标签,能够减少“同一配置、不同镜像”的问题。部署完成后,可用 kubectl rollout status 检查发布状态,用 kubectl get pods 查看副本是否就绪;实际自动化中还应加入健康检查和发布后的基本验证。
上线前重点核对的几项配置
- 探针:配置合理的存活与就绪检查,避免未准备好的 Pod 接收流量,也避免短暂卡顿导致容器反复重启。
- 资源:结合压测和运行数据设置 requests、limits,并确认节点容量能够承接预期副本数。
- 伸缩:检查 HPA 指标是否可读、扩缩容范围是否合理,并观察扩容后应用是否真的恢复到目标响应水平。
- 发布:为配置和镜像保留版本记录,确认失败时有清晰的回退办法。
总体上,K8s 的经典部署思路是先让应用以可预测的方式运行,再通过指标驱动副本伸缩,最后按实际治理需求增加服务网格或发布自动化。把这几层职责分清,简单部署才能保持简单,扩容和后续演进也更容易控制。
eb7y4hx68dy8vx0d7caxvngowdz2kr













