后端服务在部署方面有什么特点
-
每个服务需要的运行资源各不相同,常规业务接口服务对资源没什么特殊要求,数据分析处理服务一般要的内存较多,消息中间件的服务器对网络资源要求较高;
-
同一个服务的多个运行实例之间是平等的,每个实例本身无状态,一个较长业务操作发起多次接口调用时,不用特意指定由哪个后台服务实例处理;
-
可支持水平扩容,快速增加系统整体的处理能力。
部署前提
- 已有可用的Nacos
- 已有可用的数据库
- 已有可用的Redis
- 已有可用的K8S集群资源,给集群节点打上所属的标签
- 创建从镜像中心拉取镜像的密钥
部署服务实例
部署一个后端服务的配置可以很复杂,也可以比较简单,只有少数配置项是必须显式指定的。
除了命名空间、pod类型和实例名称之外,完成部署工作最重要的几项配置如下。
- 指定部署实例数量 spec.replicas,本例中是 1;
- 把实例部署到特定标签的节点上 spec.template.spec.affinity.nodeAffinity;
- 把日志文件输出到宿主机的目录 spec.template.spec.volumes和spec.template.spec.containers.env.volumeMounts,本例中输出到目录 /tmp/logs;
- 指定服务启动的profile spec.template.spec.containers.env.args;
- 指定容器端口spec.template.spec.containers.env.ports.containerPort;
- 指定实例运行时的最小和最大资源量 spec.template.spec.containers.env.resources;
- 配置从镜像中心拉取镜像的密钥 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
- 指定运行项目的JDK版本;
- 指定容器实例的运行时区;
- 把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"]