1 前言

欢送拜访南瓜慢说 www.pkslow.com获取更多精彩文章!

H2 Database是一个优良的数据库,又小又不便,反对内存和文件模式,常常会在测试POC(proof of concept)开发环境用到它。在Springboot的许多利用中,也是内置了H2数据库,很罕用。接下来咱们来一步步把它推上k8s,让它坐上一个不一样的地位。

倡议浏览上面文章以帮忙了解:

Kubernetes用Helm装置Ingress并踩一下应用的坑

容器技术相干文章

2 本地jar包运行

2.1 下载和启动

下载官网jar包如下:

$ curl http://www.h2database.com/h2-2019-03-13.zip -o h2-2019-03-13.zip

解压:

$ unzip h2-2019-03-13.zip

启动H2数据库

$ java -cp h2/bin/h2*.jar org.h2.tools.Server -ifNotExistsTCP server running at tcp://localhost:9092 (only local connections)PG server running at pg://localhost:5435 (only local connections)Web Console server running at http://localhost:8082 (others can connect)

如果须要批改配置,如端口号、数据存储目录,能够在启动时增加参数:

java -cp h2/bin/h2*.jar org.h2.tools.Server -ifNotExists \     -web -webAllowOthers -webPort 8082 \     -tcp -tcpAllowOthers -tcpPort 9092 \     -baseDir ${DATA_DIR} ${H2_OPTIONS}

2.2 配置连贯

胜利启动后拜访http://localhost:8082就能登陆控制台了。如下:

Driver Classorg.h2.Driver,驱动类;

JDBC URLjdbc:h2:mem:pkslow,应用内存数据库,数据库名为pkslow

账号密码设置为admin/123456

设置实现后,点击连贯即可创立数据库。

如果咱们把JDBC URL改为jdbc:h2:file:~/pkslow,就是以文件模式存在,这样能把数据长久化,所以咱们采取这种形式。这里就会在~目录,即${HOME}目录生成文件pkslow.mv.db以保留数据。还有文件 ~/.h2.server.properties

更多URL的配置办法如下表:

TopicURL Format and Examples
Embedded (local) connectionjdbc:h2:[file:][]<databaseName> jdbc:h2:~/test jdbc:h2:file:/data/sample jdbc:h2:file:C:/data/sample (Windows only)
In-memory (private)jdbc:h2:mem:
In-memory (named)jdbc:h2:mem:<databaseName> jdbc:h2:mem:test_mem
Server mode (remote connections) using TCP/IPjdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName> jdbc:h2:tcp://localhost/~/test jdbc:h2:tcp://dbserv:8084/~/sample jdbc:h2:tcp://localhost/mem:test
Server mode (remote connections) using TLSjdbc:h2:ssl://<server>[:<port>]/[<path>]<databaseName> jdbc:h2:ssl://localhost:8085/~/sample;
Using encrypted filesjdbc:h2:<url>;CIPHER=AES jdbc:h2:ssl://localhost/~/test;CIPHER=AES jdbc:h2:file:~/secure;CIPHER=AES
File locking methodsjdbc:h2:<url>;FILE_LOCK={FILE\SOCKET\NO} jdbc:h2:file:~/private;CIPHER=AES;FILE_LOCK=SOCKET
Only open if it already existsjdbc:h2:<url>;IFEXISTS=TRUE jdbc:h2:file:~/sample;IFEXISTS=TRUE
Don't close the database when the VM exitsjdbc:h2:<url>;DB_CLOSE_ON_EXIT=FALSE
Execute SQL on connectionjdbc:h2:<url>;INIT=RUNSCRIPT FROM '~/create.sql' jdbc:h2:file:~/sample;INIT=RUNSCRIPT FROM '~/create.sql';RUNSCRIPT FROM '~/populate.sql'
User name and/or passwordjdbc:h2:<url>;USER=<username> jdbc:h2:file:~/sample;USER=sa;PASSWORD=123
Debug trace settingsjdbc:h2:<url>;TRACE_LEVEL_FILE=<level 0..3> jdbc:h2:file:~/sample;TRACE_LEVEL_FILE=3
Ignore unknown settingsjdbc:h2:<url>;IGNORE_UNKNOWN_SETTINGS=TRUE
Custom file access modejdbc:h2:<url>;ACCESS_MODE_DATA=rws
Database in a zip filejdbc:h2:zip:<zipFileName>!/<databaseName> jdbc:h2:zip:~/db.zip!/test
Compatibility modejdbc:h2:<url>;MODE=<databaseType> jdbc:h2:~/test;MODE=MYSQL;DATABASE_TO_LOWER=TRUE
Auto-reconnectjdbc:h2:<url>;AUTO_RECONNECT=TRUE jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE
Automatic mixed modejdbc:h2:<url>;AUTO_SERVER=TRUE jdbc:h2:~/test;AUTO_SERVER=TRUE
Page sizejdbc:h2:<url>;PAGE_SIZE=512
Changing other settingsjdbc:h2:<url>;<setting>=<value>[;<setting>=<value>...] jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3

3 在Docker运行

3.1 创立镜像并启动

编写Dockerfile文件:

FROM adoptopenjdk/openjdk8-openj9:latestCOPY h2/ h2/ENV DATA_DIR /opt/h2-dataRUN mkdir -p ${DATA_DIR}EXPOSE 8082 9092ENTRYPOINT java -cp h2/bin/h2-1.4.199.jar org.h2.tools.Server -ifNotExists \     -web -webAllowOthers \     -tcp -tcpAllowOthers \     -baseDir ${DATA_DIR} ${H2_OPTIONS}

这里把数据存储文件放在/opt/h2-data目录上,应用默认端口,所以只对外裸露8082/9092端口。

通过Dockerfile创立镜像:

$ docker build -t h2:1.4.199 .

启动Docker容器:

$ docker run -itd --name h2 -p 8082:8082 -p 9092:9092 h2:1.4.199

3.2 通过Web和TCP形式连贯

3.2.1 Web界面连贯

胜利启动后,拜访http://localhost:8082配置连贯如下:

进入容器,查看在/opt/h2-data目录生成了存储文件:

$ docker exec -it h2 /bin/bashroot@0121e369b933:/opt/h2-data# ltest.mv.db

3.2.2 TCP形式连贯

通过IDEA配置连贯H2时要留神门路,通过TCP形式,不必加baseDir,配置为jdbc:h2:tcp://localhost:9092/test。如果要加,应该配置为jdbc:h2:tcp://localhost:9092//opt/h2-data/test

4 部署在Kubernetes上运行

4.1 部署上Kubernetes看看

4.1.1 创立PersistentVolumeClaim

PersistentVolumeClaim,简称PVC,是Kubernetes用于存储的单元,为了能够使H2的数据长久化,在Pod死掉后重启数据不失落,咱们来创立对应的PVC

apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: h2-db  labels:    app: h2-db  annotations:    volume.alpha.kubernetes.io/storage-class: defaultspec:  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 0.05Gi

这里空间只给0.05G,反正试验为主,不作其它用处。

4.1.2 创立Deployment

这里最要害的是要留神PVC的配置:

apiVersion: apps/v1kind: Deploymentmetadata:  name: h2-db  labels:    app: h2-dbspec:  replicas: 1  selector:    matchLabels:      app: h2-db  template:    metadata:      labels:        app: h2-db    spec:      containers:      - image: h2:1.4.199        name: h2-db        ports:          - containerPort: 8082            name: h2-web          - containerPort: 9092            name: h2-tcp        volumeMounts:          - name: data            mountPath: /opt/h2-data      volumes:      - name: data        persistentVolumeClaim:          claimName: h2-db

mountPath对应的是之前在制作Docker镜像时指定的门路。

4.1.3 创立Service和Ingress

ServiceIngress对应的yaml文件如下:

apiVersion: v1kind: Servicemetadata:  name: h2-db  labels:    app: h2-dbspec:  ports:    - port: 8082      name: web    - port: 9092      name: tcp  selector:    app: h2-db---apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: h2-ingress  annotations:    kubernetes.io/ingress.class: nginxspec:  rules:    - http:        paths:          - path: /            backend:              serviceName: h2-db              servicePort: 8082      host: h2-web.localhost    - http:        paths:          - path: /            backend:              serviceName: h2-db              servicePort: 9092      host: h2-tcp.localhost

4.1.4 拜访

Web形式简略,通过拜访http://h2-web.localhost/配置连贯即可。

TCP形式就麻烦了,无论如何配置,死活连不上。具体起因接下来持续探讨。

4.2 让Ingress反对TCP

之前TCP连不上的起因是Ingress是不反对TCP路由转发的,尽管Ingress是基于Nginx,而Nginx又能够转发代理TCP/UDP。那就来摸索一番吧。

4.2.1 批改nginx-ingress-controller

为了让它反对TCP/UDP,咱们要批改Ingress-Controller,在它的配置文件减少参数:

- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services- --udp-services-configmap=$(POD_NAMESPACE)/udp-services

在上面内容中插入:

containers:- args:  - /nginx-ingress-controller  - --default-backend-service=default/pki-nginx-ingress-default-backend  - --election-id=ingress-controller-leader  - --ingress-class=nginx  - --configmap=default/pki-nginx-ingress-controller  - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services  - --udp-services-configmap=$(POD_NAMESPACE)/udp-services

4.2.2 增加tcp-services config

下面的Controller指定了tcp-servicesConfigMap,那咱们就增加上:

kind: ConfigMapapiVersion: v1metadata:  name: tcp-services  namespace: defaultdata:  "9092": default/h2-db:9092

其中,"9092": default/h2-db:9092示意:<Nginx port>: <namespace/service name>:<service port>:[PROXY]:[PROXY],咱们这样配置相当于把Nginx9092端口,指向H29092端口。

4.2.3 批改Ingress Service的端口

在只有http/https的根底上,减少H2配置:

spec:  externalTrafficPolicy: Cluster  ports:  - name: http    nodePort: 32231    port: 80    protocol: TCP    targetPort: http  - name: https    nodePort: 30370    port: 443    protocol: TCP    targetPort: https  - name: h2-tcp    nodePort: 30371    port: 9092    protocol: TCP    targetPort: 9092

4.2.4 连贯应用

实现以上步骤后,就能够连贯了,如下:

配置后连贯胜利。

5 总结

至此,咱们一步步从jar包到部署H2 DatabaseKubernetes,心愿大家能从整个过程学到一些常识吧。咱们解决了之前装置Ingress不反对TCP的问题,但始终不是一个太好的计划。如果咱们把连贯数据库的利用都部署在Kubernetes上,那就没有必要把H2 TCP裸露进来了。


欢送关注微信公众号<南瓜慢说>,将继续为你更新...

多读书,多分享;多写作,多整顿。