k8s部署单机容器和高可用集群
1. 单机容器
进入k8s集群的master节点上,创建名为ivorysql的namespace
[root@k8s-master ~]# kubectl create ns ivorysql
下载最新docker_library代码
[root@k8s-master ~]# git clone https://github.com/IvorySQL/docker_library.git
进入单机目录
[root@k8s-master ~]# cd docker_library/k8s-cluster/single
[root@k8s-master single]# vim statefulset.yaml #根据个人环境自行修改statefulset中的pvc信息及数据库密码
使用statefulset.yaml创建一个单机pod
[root@k8s-master single]# kubectl apply -f statefulset.yaml
service/ivorysql-svc created
statefulset.apps/ivorysql created
等待pod创建成功
[root@k8s-master single]# kubectl get all -n ivorysql
NAME READY STATUS RESTARTS AGE
pod/ivorysql-0 0/1 ContainerCreating 0 47s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ivorysql-svc NodePort 10.108.178.236 <none> 5432:32106/TCP,1521:31887/TCP 47s
NAME READY AGE
statefulset.apps/ivorysql 0/1 47s
[root@k8s-master single]# kubectl get all -n ivorysql
NAME READY STATUS RESTARTS AGE
pod/ivorysql-0 1/1 Running 0 2m39s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ivorysql-svc NodePort 10.108.178.236 <none> 5432:32106/TCP,1521:31887/TCP 2m39s
NAME READY AGE
statefulset.apps/ivorysql 1/1 2m39s
psql连接IvorySQL的PG端口
[root@k8s-master single]# psql -U ivorysql -p 32106 -h 127.0.0.1 -d ivorysql
Password for user ivorysql:
ivorysql=# select version();
version
------------------------------------------------------------------------------------------------------------------------
PostgreSQL 18.0 (IvorySQL 5.0) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-28), 64-bit
(1 row)
ivorysql=# show ivorysql.compatible_mode;
ivorysql.compatible_mode
--------------------------
pg
(1 row)
ivorysql=# exit
psql连接IvorySQL的Oracle端口
[root@k8s-master single]# psql -U ivorysql -p 31887 -h 127.0.0.1 -d ivorysql
Password for user ivorysql:
ivorysql=# select version();
version
------------------------------------------------------------------------------------------------------------------------
PostgreSQL 18.0 (IvorySQL 5.0) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-28), 64-bit
(1 row)
ivorysql=# show ivorysql.compatible_mode;
ivorysql.compatible_mode
--------------------------
oracle
(1 row)
卸载单机容器
[root@k8s-master single]# kubectl delete -f statefulset.yaml
2. 高可用集群
进入k8s集群的master节点上,创建名为ivorysql的namespace
[root@k8s-master ~]# kubectl create ns ivorysql
下载最新docker_library代码
[root@k8s-master ~]# git clone https://github.com/IvorySQL/docker_library.git
进入高可用集群目录
[root@k8s-master ~]# cd docker_library/k8s-cluster/ha-cluster/helm_charts
[root@k8s-master single]# vim values.yaml #根据个人环境自行修改values.yaml中的pvc信息及集群规模等信息,数据库密码查看templates/secret.yaml并自行修改。
使用 Helm 命令部署高可用集群
[root@k8s-master helm_charts]# helm install ivorysql-ha-cluster -n ivorysql .
NAME: ivorysql-ha-cluster
LAST DEPLOYED: Wed Sep 10 09:45:36 2025
NAMESPACE: ivorysql
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@k8s-master helm_charts]# kubectl get all -n ivorysql
NAME READY STATUS RESTARTS AGE
pod/ivorysql-patroni-hac-0 1/1 Running 0 42s
pod/ivorysql-patroni-hac-1 0/1 Running 0 18s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ivorysql-patroni-hac NodePort 10.96.119.203 <none> 5432:32391/TCP,1521:32477/TCP 42s
service/ivorysql-patroni-hac-config ClusterIP None <none> <none> 42s
service/ivorysql-patroni-hac-pods ClusterIP None <none> <none> 42s
service/ivorysql-patroni-hac-repl NodePort 10.100.122.0 <none> 5432:30111/TCP,1521:32654/TCP 42s
NAME READY AGE
statefulset.apps/ivorysql-patroni-hac 1/3 42s
等待所有 Pod 进入“Running”(运行中)状态,即表示集群已部署成功。
[root@k8s-master helm_charts]# kubectl get all -n ivorysql
NAME READY STATUS RESTARTS AGE
pod/ivorysql-patroni-hac-0 1/1 Running 0 88s
pod/ivorysql-patroni-hac-1 1/1 Running 0 64s
pod/ivorysql-patroni-hac-2 1/1 Running 0 41s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ivorysql-patroni-hac NodePort 10.96.119.203 <none> 5432:32391/TCP,1521:32477/TCP 88s
service/ivorysql-patroni-hac-config ClusterIP None <none> <none> 88s
service/ivorysql-patroni-hac-pods ClusterIP None <none> <none> 88s
service/ivorysql-patroni-hac-repl NodePort 10.100.122.0 <none> 5432:30111/TCP,1521:32654/TCP 88s
NAME READY AGE
statefulset.apps/ivorysql-patroni-hac 3/3 88s
使用psql连接集群主节点的PG、Oracle端口
[root@k8s-master helm_charts]# psql -U ivorysql -p 32391 -h 127.0.0.1 -d ivorysql
Password for user ivorysql:
ivorysql=# show ivorysql.compatible_mode;
ivorysql.compatible_mode
--------------------------
pg
(1 row)
ivorysql=# SELECT pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
ivorysql=# exit
[root@k8s-master helm_charts]# psql -U ivorysql -p 32477 -h 127.0.0.1 -d ivorysql
Password for user ivorysql:
ivorysql=# show ivorysql.compatible_mode;
ivorysql.compatible_mode
--------------------------
oracle
(1 row)
ivorysql=# SELECT pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
ivorysql=#
使用psql连接集群备节点的PG、Oracle端口
[root@k8s-master helm_charts]# psql -U ivorysql -p 30111 -h 127.0.0.1 -d ivorysql
Password for user ivorysql:
ivorysql=# show ivorysql.compatible_mode;
ivorysql.compatible_mode
--------------------------
pg
(1 row)
ivorysql=# SELECT pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
ivorysql=# exit
[root@k8s-master helm_charts]# psql -U ivorysql -p 32654 -h 127.0.0.1 -d ivorysql
Password for user ivorysql:
ivorysql=# show ivorysql.compatible_mode;
ivorysql.compatible_mode
--------------------------
oracle
(1 row)
ivorysql=# SELECT pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
ivorysql=#
卸载高可用集群
[root@k8s-master helm_charts]# helm uninstall ivorysql-ha-cluster -n ivorysql
删除PVC
[root@k8s-master helm_charts]# kubectl delete pvc ivyhac-config-ivorysql-patroni-hac-0 -n ivorysql
[root@k8s-master helm_charts]# kubectl delete pvc ivyhac-config-ivorysql-patroni-hac-1 -n ivorysql
[root@k8s-master helm_charts]# kubectl delete pvc ivyhac-config-ivorysql-patroni-hac-2 -n ivorysql
[root@k8s-master helm_charts]# kubectl delete pvc pgdata-ivorysql-patroni-hac-0 -n ivorysql
[root@k8s-master helm_charts]# kubectl delete pvc pgdata-ivorysql-patroni-hac-1 -n ivorysql
[root@k8s-master helm_charts]# kubectl delete pvc pgdata-ivorysql-patroni-hac-2 -n ivorysql