「实战记录」集群部署后端服务

432 阅读3分钟

后端服务在部署方面有什么特点

  • 每个服务需要的运行资源各不相同,常规业务接口服务对资源没什么特殊要求,数据分析处理服务一般要的内存较多,消息中间件的服务器对网络资源要求较高;

  • 同一个服务的多个运行实例之间是平等的,每个实例本身无状态,一个较长业务操作发起多次接口调用时,不用特意指定由哪个后台服务实例处理;

  • 可支持水平扩容,快速增加系统整体的处理能力。

部署前提

  1. 已有可用的Nacos
  2. 已有可用的数据库
  3. 已有可用的Redis
  4. 已有可用的K8S集群资源,给集群节点打上所属的标签
  5. 创建从镜像中心拉取镜像的密钥

部署服务实例

部署一个后端服务的配置可以很复杂,也可以比较简单,只有少数配置项是必须显式指定的。

除了命名空间、pod类型和实例名称之外,完成部署工作最重要的几项配置如下。

  1. 指定部署实例数量 spec.replicas,本例中是 1;
  2. 把实例部署到特定标签的节点上 spec.template.spec.affinity.nodeAffinity;
  3. 把日志文件输出到宿主机的目录 spec.template.spec.volumesspec.template.spec.containers.env.volumeMounts,本例中输出到目录 /tmp/logs;
  4. 指定服务启动的profile spec.template.spec.containers.env.args
  5. 指定容器端口spec.template.spec.containers.env.ports.containerPort
  6. 指定实例运行时的最小和最大资源量 spec.template.spec.containers.env.resources
  7. 配置从镜像中心拉取镜像的密钥 spec.template.spec.imagePullSecrets
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: auth-backend
  name: auth-backend
  namespace: mojiayi-prod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth-backend
  strategy: { }
  template:
    metadata:
      labels:
        app: auth-backend
    spec:
      volumes:
        - name: log-file
          hostPath:
            path: /tmp/logs
            type: ''
        - name: date-config
          hostPath:
            path: /etc/localtime
            type: ''
      containers:
      - env:
        - name: NACOS_SERVER
          value: 'localhost:8848'
        - name: NACOS_NAMESPACE
          value: '1018a999-cbfa-4d84-aea1-94646222277e'
        - name: NACOS_GROUP
          value: 'app-config'
        image: <IMAGE_VERSION>
        name: auth-backend-service
        args: ["--spring.profiles.active=dev"]
        ports:
        - containerPort: 8001
        resources:
          limits:
            cpu: "1"
            memory: 0.8Gi
          requests:
            cpu: "0.5"
            memory: 0.5Gi
        volumeMounts:
          - name: log-file
            mountPath: /tmp/logs
            policy:
              logs:
                rotate: Hourly
                annotations:
                  pathPattern: /**/*.log
          - name: date-config
            readOnly: true
            mountPath: /etc/localtime
      imagePullSecrets:
        - name: mojiayi-secret
      restartPolicy: Always
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - "backend"

为服务添加集群访问配置

后端服务一般会部署2个或以上的实例,为了能发挥好集群负载,强烈建议创建集群访问(ClusterIP)的Service。

本例中,容器端口和服务端口都是 8001。

apiVersion: v1
kind: Service
metadata:
  labels:
    app: auth-backend
  name: auth-backend
  namespace: mojiayi-prod
spec:
  ports:
    - name: "8001"
      port: 8001
      targetPort: 8001
  selector:
    app: auth-backend
  type: ClusterIP
status:
  loadBalancer: { }

编写Dockerfile

  1. 指定运行项目的JDK版本;
  2. 指定容器实例的运行时区;
  3. 把Jenkins编译好的jar文件复制到目标目录,启动服务。
FROM openjdk:11

ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

ADD ./auth-backend-service/target/auth-backend-service-1.0.0.jar /opt/auth-backend-service-1.0.0.jar
ENTRYPOINT ["java", "-jar", "/opt/auth-backend-service-1.0.0.jar", "--server.port=8000"]

参考文档

  1. 华为云Kubernetes基础知识