一、核心定位:K8s 为什么适配微服务
微服务痛点:多服务部署、扩缩容、故障自愈、灰度发布、服务发现、配置统一、资源隔离;
K8s 核心能力完美匹配:容器编排、自愈、弹性伸缩、服务网关、配置中心、流量治理、资源调度。
整体分层架构(微服务 + K8s):
基础设施层:服务器 / 云主机、存储、网络
Kubernetes 底座:Master 控制平面 + Node 工作节点
微服务运行层:Pod(最小运行单元)
服务网络层:Service、Ingress、ServiceMesh
配置 / 存储层:ConfigMap、Secret、PV/PVC
运维管控层:HPA 自动扩缩容、Deployment、StatefulSet、Job/CronJob
可观测层:日志、监控、链路追踪
二、第一步:微服务容器化(前置条件)
K8s 只管理容器,所有微服务必须先打包镜像:
每个微服务独立编写
Dockerfile,最小基础镜像(Alpine)减小体积构建镜像,推送私有镜像仓库(Harbor)
规范:镜像版本语义化(v1.0.0),区分环境镜像(dev/test/prod)
示例 Java 微服务 Dockerfile:
dockerfile
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/demo-user-service.jar app.jar
# 健康检查,给K8s探测存活/就绪
HEALTHCHECK --interval=10s --timeout=3s --retries=3 \
CMD curl -f http://127.0.0.1:8080/actuator/health || exit 1
ENTRYPOINT ["java","-jar","app.jar"]
三、K8s 核心资源管理不同类型微服务
微服务分无状态服务、有状态服务、定时任务、一次性任务,对应 K8s 控制器:
1. Deployment:无状态微服务(90% 业务微服务)
用户服务、订单服务、商品服务等无状态业务服务,核心能力:
多副本部署,负载均衡
滚动更新 / 回滚(灰度、蓝绿发布基础)
Pod 故障自动重建,自愈
配合 HPA 实现 CPU / 内存自动扩缩容
基础 yaml 示例(user 微服务):
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
namespace: biz-prod # 命名空间隔离环境
spec:
replicas: 3 # 3副本高可用
selector:
matchLabels:
app: user-service
template:
metadata:
labels:
app: user-service
spec:
containers:
- name: user-service
image: harbor.local/biz/user-service:v1.0.0
ports:
- containerPort: 8080
# 资源限制,避免服务抢占节点资源
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1Gi"
# 存活探针:容器崩溃自动重启
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
# 就绪探针:未就绪不加入Service负载均衡
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
2. StatefulSet:有状态微服务
数据库 MySQL、Redis 集群、消息队列 RocketMQ/Kafka、注册中心 Nacos 等:
固定 Pod 名称、稳定网络标识
有序部署、有序删除,适合集群组件
持久化存储绑定,数据不随 Pod 重建丢失
3. Job / CronJob:任务型微服务
数据同步、报表统计、定时清缓存、异步批处理任务:
Job:一次性离线任务,执行完成退出
CronJob:定时周期任务,支持 cron 表达式
四、服务通信:解决微服务调用、流量接入
4.1 Service:内部服务发现(微服务间调用核心)
Pod IP 动态变化,Service 提供固定 ClusterIP,实现服务注册发现:
ClusterIP:集群内部访问,微服务互相调用(默认)
NodePort:节点端口暴露,测试使用
LoadBalancer:云厂商负载均衡,公网入口
yaml
apiVersion: v1
kind: Service
metadata:
name: user-service-svc
namespace: biz-prod
spec:
selector:
app: user-service # 关联Deployment的Pod标签
ports:
- port: 80 # Service内部端口
targetPort: 8080 # 容器端口
type: ClusterIP
微服务调用规则:服务名.命名空间.svc.cluster.local
例:订单服务调用用户服务:http://user-service-svc.biz-prod.svc.cluster.local:80
4.2 Ingress:统一网关,外部流量接入
Service 无法直接暴露公网,Ingress 作为七层网关,统一管理所有微服务外网入口:
域名路由分发(shturl.cc/7kdLEY → user 服务,shturl.cc/7RKcNqE → order 服务)
统一 SSL 证书、限流、黑白名单
常用控制器:Nginx Ingress Controller
4.3 Service Mesh(Istio/Linkerd):精细化流量治理
复杂微服务场景(灰度、蓝绿、熔断、限流、链路追踪、服务认证),补充 K8s 原生能力短板:
流量分发:按权重灰度发布、基于用户标签路由
故障容错:超时、重试、熔断、舱壁隔离
安全:服务间 mTLS 加密、权限访问控制
观测:分布式链路追踪、流量监控
五、配置与密钥统一管理
微服务海量配置文件、数据库账号密码,禁止硬编码进镜像:
ConfigMap:存放明文配置(yml、properties、环境变量)
Secret:加密存储敏感信息(数据库密码、AK/SK、Token)
使用方式:挂载为容器内文件 / 注入环境变量
yaml
# 配置挂载示例,Deployment中添加
volumes:
- name: config-volume
configMap:
name: user-config
- name: secret-volume
secret:
secretName: db-secret
containers:
volumeMounts:
- name: config-volume
mountPath: /app/config
- name: secret-volume
mountPath: /app/secret
readOnly: true
六、弹性伸缩:自动应对流量波动
1. HPA(HorizontalPodAutoscaler)水平扩缩容
根据 CPU、内存、自定义 QPS 指标自动增减 Pod 副本数,应对流量峰值 / 低谷:
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: user-hpa
namespace: biz-prod
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: user-service
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
2. VPA 垂直扩缩容
自动调整 Pod CPU / 内存资源配额,优化资源利用率。
3. Cluster Autoscaler 集群节点伸缩
当节点资源不足,自动新增云服务器节点;低负载自动缩容释放机器。
七、微服务发布策略(K8s 原生 + Istio 增强)
1. K8s Deployment 原生滚动更新(默认)
逐步新建新版本 Pod,销毁旧版本,不中断业务;支持 revision 版本记录,一键回滚。
yaml
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多多启动1个Pod
maxUnavailable: 0 # 更新过程不允许服务不可用
2. 蓝绿发布
两套完整副本(绿:旧版本,蓝:新版本),测试验证通过后,切换 Service 标签瞬间切流量;回滚同样秒级切换。
3. 灰度发布(金丝雀发布)
Istio 流量权重分发,少量流量导入新版本验证,无异常再全量切流。
八、多环境隔离:Namespace 命名空间
同一集群区分开发、测试、预发、生产环境,资源逻辑隔离:
dev、test、staging、prod 独立 Namespace
配合 ResourceQuota 资源配额,限制各环境 CPU 内存上限,避免测试抢占生产资源
NetworkPolicy 网络策略,禁止开发环境访问生产数据库
九、存储管理:微服务持久化数据
微服务缓存、文件、数据库数据使用 PV/PVC 解耦存储与 Pod:
PV:底层存储资源(云盘、NAS、本地磁盘)
PVC:存储申请,微服务 yaml 直接挂载 PVC,无需关心底层存储
StorageClass:动态创建存储卷,无需手动创建 PV
十、可观测体系:监控、日志、链路追踪
微服务故障排查三大支柱,K8s 标准运维栈:
监控(Prometheus + Grafana)
采集 Pod CPU、内存、网络、业务 QPS 指标,配置告警规则(Pod 宕机、CPU 打满、错误率飙升)。
日志(ELK/EFK)
FluentBit 采集容器标准输出日志,统一存入 Elasticsearch,Kibana 检索日志,按服务、Pod、请求 ID 过滤。
链路追踪(Jaeger/Zipkin,配合 Istio)
记录微服务之间完整调用链,快速定位慢接口、调用异常。
十一、完整落地流程(从 0 到 1 管理微服务)
微服务改造:应用健康检查、暴露监控端点、配置外置化
容器化:编写 Dockerfile,打包推送私有镜像仓库
资源编排:编写 Deployment/Service/Ingress/ConfigMap/Secret yaml
环境隔离:创建不同 Namespace,配置资源配额、网络策略
发布部署:kubectl apply 部署服务,使用滚动更新迭代版本
流量治理:Ingress 管理外网,Istio 实现灰度、熔断、限流
弹性伸缩:配置 HPA 实现 Pod 自动扩缩容
可观测:部署 Prometheus、EFK、Jaeger,配置告警
运维自动化:结合 GitOps(ArgoCD/Flux),代码仓库管理 yaml,自动发布
十二、最佳实践总结
资源规范:所有容器配置 requests/limits,防止资源争抢
健康探针:必须配置 liveness/readiness 探针,保障自愈能力
配置分离:禁止镜像硬编码配置、密码,统一使用 ConfigMap/Secret
环境隔离:命名空间区分环境,生产环境严格权限管控
灰度发布:生产优先使用 Istio 金丝雀发布,降低发布风险
自动化运维:采用 GitOps,yaml 纳入代码管理,减少手动 kubectl 操作
服务网格:复杂多微服务场景引入 Istio,补齐流量治理短板
监控告警:全链路监控,关键指标配置告警,提前发现故障