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 外置配置,探针保证发布与自愈安全。先跑通最小可运行的一套,再逐步加能力。

笔记加载中…