Kubernetes 部署微服务:Deployment/Service/Ingress 简述
容器编排阶段,Kubernetes(K8s)成为事实标准:声明期望状态,平台负责调度、滚动发布、自愈与伸缩。本章把 Spring Cloud 微服务映射到 K8s 的三个核心对象:Deployment(跑多少副本)、Service(集群内负载均衡)、Ingress(对外入口)。对应关系:Pod 是运行单元,Deployment 管副本与滚动发布,Service 给一组 Pod 提供稳定访问名,Ingress 把集群外流量按规则转给 Service。
Deployment:声明“跑几个、怎么更新”
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 3
selector:
matchLabels: { app: order-service }
template:
metadata:
labels: { app: order-service }
spec:
containers:
- name: order-service
image: registry.example.com/order-service:1.0.0
ports: [{ containerPort: 8080 }]
readinessProbe: # 就绪才进 Service 收流量
httpGet: { path: /actuator/health, port: 8080 }
initialDelaySeconds: 20
livenessProbe: # 不健康则重启容器
httpGet: { path: /actuator/health/liveness, port: 8080 }
resources:
requests: { cpu: "500m", memory: 512Mi }
limits: { cpu: "1", memory: 1Gi }
Spring Boot 侧:开启探针分组(management.endpoint.health.probes.enabled=true),让 liveness 与 readiness 分开;开启优雅停机(server.shutdown=graceful 并设宽限期),滚动更新不打断在途请求。更新只需改镜像 tag 后 kubectl apply,默认滚动更新先起新 Pod、探针通过再摘旧 Pod;kubectl rollout undo 可回滚。
Service:稳定的内部入口
apiVersion: v1
kind: Service
metadata:
name: order-service # 集群内 DNS:其他服务用 http://order-service 访问
spec:
selector: { app: order-service }
ports:
- port: 8080
targetPort: 8080
K8s 内服务互调可用 Service DNS 直连,也可继续走 Nacos 注册发现;两种模式不要在同一份配置里混用。
Ingress:对外流量入口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: gateway-ingress
spec:
rules:
- host: api.example.com # 示例域名,按需替换
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: gateway-server
port: { number: 8080 }
Ingress 需集群先装 Ingress Controller(如 Nginx Ingress)才真正生效;网关在 K8s 里同样用 Deployment + Service,由 Ingress 统一接入。
配置与密钥:ConfigMap / Secret
配置从镜像剥离:普通配置放 ConfigMap,敏感信息放 Secret,Deployment 用 env 或 volume 引用:
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
stringData:
db-password: "change-me"
# Deployment 容器内引用
env:
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef: { name: db-secret, key: db-password }
自动伸缩与资源治理
HPA(HorizontalPodAutoscaler)按 CPU/内存或自定义指标自动扩缩副本,前提是服务无状态、配置外置;每个服务设置 requests/limits,避免“吵闹邻居”拖垮节点,资源紧张时按优先级驱逐。
小结
K8s 上部署微服务 = 把进程、网络、配置、发布全部声明化:Deployment 描述副本与滚动更新,Service 提供稳定内部地址,Ingress 承接外部流量,ConfigMap/Secret 外置配置,探针保证发布与自愈安全。先跑通最小可运行的一套,再逐步加能力。