欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!
H2 Database是一个优秀的数据库,又小又方便,支持内存和文件形式,经常会在测试、POC(proof of concept)或开发环境用到它。在Springboot的许多应用中,也是内置了H2数据库,很常用。接下来我们来一步步把它推上k8s,让它坐上一个不一样的位置。
H2 Database
测试
POC(proof of concept)
开发环境
Springboot
H2数据库
k8s
建议阅读下面文章以帮助理解:
Kubernetes用Helm安装Ingress并踩一下使用的坑
容器技术相关文章
下载官网jar包如下:
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 -ifNotExists TCP 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}
成功启动后访问http://localhost:8082就能登陆控制台了。如下:
http://localhost:8082
Driver Class:org.h2.Driver,驱动类;
Driver Class
org.h2.Driver
JDBC URL:jdbc:h2:mem:pkslow,使用内存数据库,数据库名为pkslow;
JDBC URL
jdbc:h2:mem:pkslow
pkslow
账号密码设置为admin/123456。
admin/123456
设置完成后,点击连接即可创建数据库。
如果我们把JDBC URL改为jdbc:h2:file:~/pkslow,就是以文件形式存在,这样能把数据持久化,所以我们采取这种方式。这里就会在~目录,即${HOME}目录生成文件pkslow.mv.db以保存数据。还有文件~/.h2.server.properties。
jdbc:h2:file:~/pkslow
~
${HOME}
pkslow.mv.db
~/.h2.server.properties
更多URL的配置方法如下表:
URL
编写Dockerfile文件:
Dockerfile
FROM adoptopenjdk/openjdk8-openj9:latest COPY h2/ h2/ ENV DATA_DIR /opt/h2-data RUN mkdir -p ${DATA_DIR} EXPOSE 8082 9092 ENTRYPOINT 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端口。
/opt/h2-data
8082/9092
通过Dockerfile创建镜像:
$ docker build -t h2:1.4.199 .
启动Docker容器:
Docker
$ docker run -itd --name h2 -p 8082:8082 -p 9092:9092 h2:1.4.199
成功启动后,访问http://localhost:8082配置连接如下:
进入容器,查看在/opt/h2-data目录生成了存储文件:
$ docker exec -it h2 /bin/bash root@0121e369b933:/opt/h2-data# l test.mv.db
通过IDEA配置连接H2时要注意路径,通过TCP方式,不用加baseDir,配置为jdbc:h2:tcp://localhost:9092/test。如果要加,应该配置为jdbc:h2:tcp://localhost:9092//opt/h2-data/test。
IDEA
H2
TCP
baseDir
jdbc:h2:tcp://localhost:9092/test
jdbc:h2:tcp://localhost:9092//opt/h2-data/test
PersistentVolumeClaim,简称PVC,是Kubernetes用于存储的单元,为了可以使H2的数据持久化,在Pod死掉后重启数据不丢失,我们来创建对应的PVC:
PersistentVolumeClaim
PVC
Kubernetes
Pod
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: h2-db labels: app: h2-db annotations: volume.alpha.kubernetes.io/storage-class: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 0.05Gi
这里空间只给0.05G,反正实验为主,不作其它用途。
0.05G
这里最关键的是要注意PVC的配置:
apiVersion: apps/v1 kind: Deployment metadata: name: h2-db labels: app: h2-db spec: 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镜像时指定的路径。
mountPath
Service和Ingress对应的yaml文件如下:
Service
Ingress
yaml
apiVersion: v1 kind: Service metadata: name: h2-db labels: app: h2-db spec: ports: - port: 8082 name: web - port: 9092 name: tcp selector: app: h2-db --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: h2-ingress annotations: kubernetes.io/ingress.class: nginx spec: 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
Web方式简单,通过访问http://h2-web.localhost/配置连接即可。
Web
http://h2-web.localhost/
TCP方式就麻烦了,无论如何配置,死活连不上。具体原因接下来继续讨论。
之前TCP连不上的原因是Ingress是不支持TCP路由转发的,虽然Ingress是基于Nginx,而Nginx又可以转发代理TCP/UDP。那就来探索一番吧。
Nginx
TCP/UDP
为了让它支持TCP/UDP,我们要修改Ingress-Controller,在它的配置文件增加参数:
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
上面的Controller指定了tcp-services的ConfigMap,那我们就添加上:
Controller
tcp-services
ConfigMap
kind: ConfigMap apiVersion: v1 metadata: name: tcp-services namespace: default data: "9092": default/h2-db:9092
其中,"9092": default/h2-db:9092表示:<Nginx port>: <namespace/service name>:<service port>:[PROXY]:[PROXY],我们这样配置相当于把Nginx的9092端口,指向H2的9092端口。
"9092": default/h2-db:9092
<Nginx port>: <namespace/service name>:<service port>:[PROXY]:[PROXY]
9092
在只有http/https的基础上,增加H2配置:
http/https
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
完成以上步骤后,就可以连接了,如下:
配置后连接成功。
至此,我们一步步从jar包到部署H2Database上Kubernetes,希望大家能从整个过程学到一些知识吧。我们解决了之前安装Ingress不支持TCP的问题,但始终不是一个太好的方案。如果我们把连接数据库的应用都部署在Kubernetes上,那就没有必要把H2TCP暴露出去了。
H2Database
H2TCP
原文链接:https://www.cnblogs.com/larrydpk/p/13496644.html