学习基于记录,而不止于记录。
希望自己能坚持下去~
0.写在前面
spring boot版本:2.2.7.RELEASE
Seata版本:1.2.0
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.18 |
+-----------+
1.部署Eureka
1)打包Eureka spring boot项目成jar包
2)编写Dockerfile文件
FROM java:8
VOLUME /tmp
ADD jar包的名字.jar app.jar
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo 'Asia/Shanghai' >/etc/timezone
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
3)打包成镜像
docker build -t 镜像名称:v1.0.0 .
注意:后面的点不能省略,代表当前路径
这里我使用了Harbor私人仓库,如果没有使用的话则直接在需要部署的机器上打包成k8s资源
4)推向私人仓库
#imageid:镜像id,后面的ip代表仓库地址,eureka:代表仓库里面的项目,server:v1.0.0代表仓库里面的镜像和版本
docker tag imageid 192.168.18.200/eureka/server:v1.0.0
#推向私人仓库
docker push 192.168.18.200/eureka/server:v1.0.0
5)如果不用私人仓库则跳过第四步,编写yaml文件
server.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: eurekaserver
namespace: default
labels:
app: eurekaserver
spec:
replicas: 1
selector:
matchLabels:
app: eurekaserver
template:
metadata:
labels:
app: eurekaserver
spec:
containers:
- name: eurekaserver
# 这里的镜像我指向的是私人仓库镜像,如果你没有则直接在k8snode节点上先把镜像生成
# 因为如果node节点有镜像,k8s就不会拉取镜像,但是名称必须一致
image: 192.168.18.200/eureka/server:v1.0.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5060
dnsPolicy: Default
---
#------service---------------
apiVersion: v1
kind: Service
metadata:
name: eurekaserver
namespace: default
labels:
name: eurekaserver
spec:
type: NodePort
ports:
- port: 5060
name: http
targetPort: 5060
selector:
app: eurekaserver
6)生成k8s资源并检查状态
kubectl apply -f server.yaml
kubectl get pod
image.png
image.png
2.部署Seata
这里可以参考官方文档
我使用的是自定义配置,但是官方文档给出的案例是注册中心是nacos的配置方式,这个貌似是阿里自己的。
而我们是想用Eureka注册中心,所以yaml编写有差异。
apiVersion: apps/v1
kind: Deployment
metadata:
name: seata-server
namespace: default
labels:
k8s-app: seata-server
spec:
replicas: 1
selector:
matchLabels:
k8s-app: seata-server
template:
metadata:
labels:
k8s-app: seata-server
spec:
containers:
- name: seata-server
#官方镜像太慢了所以我使用的是私人仓库,官方镜像地址:docker.io/seataio/seata-server:latest
image: 192.168.18.200/eureka/seata:v1.0.0
imagePullPolicy: IfNotPresent
env:
- name: SEATA_CONFIG_NAME
value: file:/root/seata-config/registry
ports:
- name: http
containerPort: 8091
protocol: TCP
volumeMounts:
- name: seata-config
mountPath: /root/seata-config
volumes:
- name: seata-config
configMap:
name: seata-server-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: seata-server-config
data:
registry.conf: |
registry {
type = "eureka"
eureka {
application = "seata-server"
serviceUrl = "http://192.168.18.187:31076/eureka/eureka"
weight = "1"
}
}
config {
type = "file"
file {
name = "/root/seata-config/file.conf"
}
}
file.conf: |
store {
mode = "db"
db {
datasource = "druid"
dbType = "mysql"
driverClassName = "com.mysql.cj.jdbc.Driver"
url = "jdbc:mysql://192.168.18.135:3306/seata?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&nullCatalogMeansCurrent=true"
user = "root"
password = "123456"
minConn = 5
maxConn = 30
globalTable = "global_table"
branchTable = "branch_table"
lockTable = "lock_table"
queryLimit = 100
maxWait = 5000
}
}
3.总结
有必要说一下的是,这个只是简单的测试,为了方便使用的是NodePort的类型暴露服务,k8s环境只有master和一个node机器,这样的话也就意味着部署的机器ip固定是node节点机器ip,但是生产环境下node节点机器肯定不止一台,所以说会使用traefik建立路由,统一使用一个域名进行访问,这样ip地址就会被域名代替,这样无论在哪一台机器上都是可以正常访问和运行的。