高可用返利机器人服务的容器化部署:Docker + Kubernetes 基础架构配置

大家好,我是 微赚淘客系统3.0 的研发者省赚客!

为支撑日均百万级用户消息请求与毫秒级响应要求,微赚淘客系统3.0 的返利机器人服务已全面容器化,基于 Docker 构建镜像,并通过 Kubernetes(K8s)实现弹性伸缩、故障自愈与滚动发布。本文详解核心配置与部署实践。

一、Dockerfile 编写规范

服务采用 Spring Boot 2.7 开发,使用多阶段构建减小镜像体积:

# 构建阶段
FROM maven:3.8.6-openjdk-17 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests -q

# 运行阶段
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=builder /app/target/rebate-bot-*.jar app.jar
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \
    CMD curl -f http://localhost:8080/actuator/health || exit 1
ENTRYPOINT ["java", "-XX:+UseG1GC", "-Xms512m", "-Xmx512m", "-jar", "app.jar"]

关键点:

  • 使用 slim 镜像降低攻击面;
  • 启用 G1GC 优化 GC 停顿;
  • 集成 Spring Boot Actuator 健康检查端点。

二、Kubernetes Deployment 配置

定义 deployment.yaml 实现无状态服务部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rebate-bot
  namespace: juwatech-prod
spec:
  replicas: 6
  selector:
    matchLabels:
      app: rebate-bot
  template:
    metadata:
      labels:
        app: rebate-bot
    spec:
      containers:
      - name: rebate-bot
        image: registry.juwatech.cn/rebate-bot:v1.2.3
        ports:
        - containerPort: 8080
        env:
        - name: SPRING_PROFILES_ACTIVE
          value: "prod"
        - name: TZ
          value: "Asia/Shanghai"
        resources:
          requests:
            memory: "512Mi"
            cpu: "200m"
          limits:
            memory: "1Gi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /actuator/health/liveness
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 30
        readinessProbe:
          httpGet:
            path: /actuator/health/readiness
            port: 8080
          initialDelaySeconds: 20
          periodSeconds: 10
        volumeMounts:
        - name: logs
          mountPath: /app/logs
      volumes:
      - name: logs
        emptyDir: {}

三、Service 与 Ingress 暴露

通过 ClusterIP + Ingress 对外提供 HTTPS 访问:

apiVersion: v1
kind: Service
metadata:
  name: rebate-bot-svc
  namespace: juwatech-prod
spec:
  selector:
    app: rebate-bot
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rebate-bot-ingress
  namespace: juwatech-prod
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
spec:
  tls:
  - hosts:
    - bot.juwatech.cn
    secretName: juwatech-tls-secret
  rules:
  - host: bot.juwatech.cn
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: rebate-bot-svc
            port:
              number: 80

TLS 证书通过 Cert-Manager 自动签发,juwatech-tls-secret 由其管理。

四、ConfigMap 与 Secret 管理敏感配置

数据库密码、OAuth2 密钥等通过 Secret 注入:

apiVersion: v1
kind: Secret
metadata:
  name: rebate-bot-secret
  namespace: juwatech-prod
type: Opaque
data:
  TAOBAO_CLIENT_SECRET: <base64-encoded>
  DB_PASSWORD: <base64-encoded>
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: rebate-bot-config
  namespace: juwatech-prod
data:
  application-prod.yml: |
    spring:
      datasource:
        url: jdbc:mysql://mysql.juwatech-prod.svc.cluster.local:3306/rebate_db
        username: rebate_user
        password: ${DB_PASSWORD}
      redis:
        host: redis.juwatech-prod.svc.cluster.local

在 Deployment 中挂载:

env:
- name: DB_PASSWORD
  valueFrom:
    secretKeyRef:
      name: rebate-bot-secret
      key: DB_PASSWORD
volumeMounts:
- name: config-volume
  mountPath: /app/config
volumes:
- name: config-volume
  configMap:
    name: rebate-bot-config

应用启动时加载 /app/config/application-prod.yml

五、HPA 自动扩缩容

基于 CPU 与内存使用率动态调整副本数:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: rebate-bot-hpa
  namespace: juwatech-prod
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: rebate-bot
  minReplicas: 3
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 75

在大促期间,Pod 数可自动从 6 扩展至 18,保障服务稳定性。

六、Java 应用适配 K8s 环境

服务需监听 0.0.0.0 并支持优雅停机:

package juwatech.cn.bot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@SpringBootApplication
public class RebateBotApplication {
    public static void main(String[] args) {
        // 确保绑定到所有网络接口
        System.setProperty("server.address", "0.0.0.0");
        SpringApplication.run(RebateBotApplication.class, args);
    }

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                    .allowedOrigins("https://bot.juwatech.cn")
                    .allowedMethods("GET", "POST");
            }
        };
    }
}

同时,在 application.yml 中启用优雅关闭:

server:
  shutdown: graceful
spring:
  lifecycle:
    timeout-per-shutdown-phase: 30s

配合 K8s Pod 的 terminationGracePeriodSeconds: 45,确保正在处理的微信消息完成后再终止。

七、日志与监控集成

  • 日志输出至 stdout,由 Fluentd 收集至 ELK;
  • 暴露 /actuator/prometheus 端点,被 Prometheus 抓取;
  • Grafana 面板监控 QPS、错误率、JVM 堆内存。

通过上述配置,返利机器人服务在 K8s 集群中实现 99.99% 可用性,单集群支持 5000+ TPS。

本文著作权归 微赚淘客系统3.0 研发团队,转载请注明出处!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐