1 前言
H2 Database
是一个优秀的数据库,又小又方便,支持内存和文件形式,经常会在测试
、POC(proof of concept)
或开发环境
用到它。在Springboot
的许多应用中,也是内置了H2数据库
,很常用。接下来我们来一步步把它推上k8s
,让它坐上一个不一样的位置。
建议阅读下面文章以帮助理解:
Kubernetes用Helm安装Ingress并踩一下使用的坑
2 本地jar包运行
2.1 下载和启动
下载官网jar
包如下:
解压:
启动H2数据库
:
如果需要修改配置,如端口号、数据存储目录,可以在启动时添加参数:
2.2 配置连接
成功启动后访问http://localhost:8082
就能登陆控制台了。如下:
Driver Class
:org.h2.Driver
,驱动类;
JDBC URL
:jdbc:h2:mem:pkslow
,使用内存数据库,数据库名为pkslow
;
账号密码设置为admin/123456
。
设置完成后,点击连接即可创建数据库。
如果我们把JDBC URL
改为jdbc:h2:file:~/pkslow
,就是以文件形式存在,这样能把数据持久化,所以我们采取这种方式。这里就会在~
目录,即${HOME}
目录生成文件pkslow.mv.db
以保存数据。还有文件~/.h2.server.properties
。
更多URL
的配置方法如下表:
Topic | URL Format and Examples |
---|---|
Embedded (local) connection | jdbc:h2:[file:][] |
In-memory (private) | jdbc:h2:mem: |
In-memory (named) | jdbc:h2:mem: |
Server mode (remote connections) using TCP/IP | jdbc:h2:tcp:// |
Server mode (remote connections) using TLS | jdbc:h2:ssl:// |
Using encrypted files | jdbc:h2: |
File locking methods | jdbc:h2: |
Only open if it already exists | jdbc:h2: |
Don't close the database when the VM exits | jdbc:h2: |
Execute SQL on connection | jdbc:h2: |
User name and/or password | jdbc:h2: |
Debug trace settings | jdbc:h2: |
Ignore unknown settings | jdbc:h2: |
Custom file access mode | jdbc:h2: |
Database in a zip file | jdbc:h2:zip: |
Compatibility mode | jdbc:h2: |
Auto-reconnect | jdbc:h2: |
Automatic mixed mode | jdbc:h2: |
Page size | jdbc:h2: |
Changing other settings | jdbc:h2: |
3 在Docker运行
3.1 创建镜像并启动
编写Dockerfile
文件:
这里把数据存储文件放在/opt/h2-data
目录上,使用默认端口,所以只对外暴露8082/9092
端口。
通过Dockerfile
创建镜像:
启动Docker
容器:
3.2 通过Web和TCP方式连接
3.2.1 Web界面连接
成功启动后,访问http://localhost:8082
配置连接如下:
进入容器,查看在/opt/h2-data
目录生成了存储文件:
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
:
这里空间只给0.05G
,反正实验为主,不作其它用途。
4.1.2 创建Deployment
这里最关键的是要注意PVC
的配置:
mountPath
对应的是之前在制作Docker
镜像时指定的路径。
4.1.3 创建Service和Ingress
Service
和Ingress
对应的yaml
文件如下:
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
,在它的配置文件增加参数:
在下面内容中插入:
4.2.2 添加tcp-services config
上面的Controller
指定了tcp-services
的ConfigMap
,那我们就添加上:
其中,"9092": default/h2-db:9092
表示:<Nginx port>: <namespace/service name>:<service port>:[PROXY]:[PROXY]
,我们这样配置相当于把Nginx
的9092
端口,指向H2
的9092
端口。
4.2.3 修改Ingress Service的端口
在只有http/https
的基础上,增加H2
配置:
4.2.4 连接使用
完成以上步骤后,就可以连接了,如下:
配置后连接成功。
5 总结
至此,我们一步步从jar
包到部署H2 Database
上Kubernetes
,希望大家能从整个过程学到一些知识吧。我们解决了之前安装Ingress
不支持TCP
的问题,但始终不是一个太好的方案。如果我们把连接数据库的应用都部署在Kubernetes
上,那就没有必要把H2 TCP
暴露出去了。
参考文章: