IvorySQL Operator是在Kubernetes上部署和管理IvorySQL集群的Operator。借助IvorySQL Operator,用户可以在极短时间内迅速部署一个功能完备的IvorySQL集群,同时涵盖TLS通信安全、高可用、备份恢复及全面的监控。
此外,IvorySQL Operator还支持用户根据实际业务需求进行自定义配置,充分满足个性化的使用场景。
01
安装IvorySQL Operator
1.1 环境准备
操作系统:版本:CentOS 7.x x86_64,配置建议cpu>2核,memory>4G,系统盘>100G
K8S: 版本:1.23.7
go: 版本:1.20
1.2 安装部署
1) 获取项目
git clone git@github.com:IvorySQL/ivory-operator.git
2)构建二进制文件
为了显著提升Go模块的下载和构建速度,我们推荐使用goproxy。通过设置环境变量GOPROXY,并指定国内可靠的代理服务器,可以大大提高模块获取的效率和稳定性,从而优化您的开发体验。
export GOPROXY=https://goproxy.cn,direct
go build -o ivory-operator ./cmd/ivory-operator # ivory-operator可自定义
3)运行该二进制文件,启动ivory-operator
nohup ./ivory-operator > ivyo.log 2>&1 &
4) 安装crd
crd文件位于项目ivory-operator/config/crd/bases下
kubectl create -f ivory-operator.ivorysql.org_ivoryclusters.yaml
5)查看crd
kubectl get crd
02
使用IvorySQL Operator
2.1 创建namespace
在开始之前,建议先创建一个namespace来进行资源隔离,确保后续在K8S中创建的相关资源都限定在这个namespace下。
kubectl create ns ivory-operator # ivory-operator可自定义
2.2 创建实例
编辑一个yaml文件(即CR文件,customer resource),该文件应详细声明IvorySQL集群所期望达到的状态。
apiVersion: ivory-operator.ivorysql.org/v1beta1
kind: IvoryCluster
metadata:
name: ivy01
namespace: ivory-operator
spec:
image: docker.io/ivorysql/ivorysql:ubi8-3.0-2.0-1
postgresVersion: 16
instances:
- name: instance1
replicas: 2
dataVolumeClaimSpec:
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: 1Gi
backups:
pgbackrest:
image: docker.io/ivorysql/pgbackrest:ubi8-2.47-2.0-1
repos:
- name: repo1
volume:
volumeClaimSpec:
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: 1Gi
在K8S中应用这个资源。
[root@k8s-master ivory-operator]# kubectl apply -k examples/kustomize/ivory
ivorycluster.ivory-operator.ivorysql.org/ivy01 configured
查询集群状态,如果查询结果显示STATUS为Running,则表明数据库已经正常启动并处于运行状态。
[root@k8s-master ivory-operator]kubectl -n ivory-operator get pods \
--selector=ivory-operator.ivorysql.org/cluster=ivy01,ivory-operator.ivorysql.org/instance
NAME READY STATUS RESTARTS AGE
ivy01-instance1-llrz-0 4/4 Running 0 3h40m
ivy01-instance1-wbdt-0 4/4 Running 0 3h40m
您可以使用以下命令来查看IvorySQL集群中当前担任主节点的具体节点信息。
kubectl -n ivory-operator get pods \
--selector=ivory-operator.ivorysql.org/role=master \
-o jsonpath='{.items[*].metadata.labels.ivory-operator\.ivorysql\.org/instance}'
除了使用命令查看集群状态,您也可以直接进入IvorySQL集群的容器中查看和了解集群的当前状态。
kubectl exec -it ivy01-instance1-wbdt-0 -c database -n ivory-operator -- /bin/bash
patronictl list
+------------------------+-----------------------------------+--------------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+ Cluster: ivy01-ha (7309663449761415262) -------------------+--------------+---------+----+-----------+
| ivy01-instance1-llrz-0 | ivy01-instance1-llrz-0.ivy01-pods | Sync Standby | running | 4 | 0 |
| ivy01-instance1-wbdt-0 | ivy01-instance1-wbdt-0.ivy01-pods | Leader | running | 4 | |
+------------------------+-----------------------------------+--------------+---------+----+-----------+
由于我们在CR文件中设置了replica数量为2,因此IvorySQL Operator会自动为我们部署一个包含2个节点的集群。目前,这个集群已经成功部署并正常运行。
2.3 链接实例
1)查看服务
[root@k8s-master ivory-operator]# kubectl -n ivory-operator get svc --selector=ivory-operator.ivorysql.org/cluster=ivy01
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ivy01-ha NodePort 10.99.137.135 <none> 5432/TCP 3h42m
ivy01-ha-config ClusterIP None <none> <none> 3h42m
ivy01-pods ClusterIP None <none> <none> 3h42m
ivy01-primary ClusterIP None <none> 5432/TCP 3h42m
ivy01-replicas ClusterIP 10.100.178.96 <none> 5432/TCP 3h42m
2)修改服务类型
在cr文件中,您可以添加service.type为NodePort,这样可以允许外部流量通过节点的IP地址和指定的NodePort访问IvorySQL集群的Service,从而实现对数据库的远程访问。
spec:
service:
metadata:
annotations:
my-annotation: value1
labels:
my-label: value2
type: NodePort
查看IvorySQL服务状态时,发现服务类型(type)已调谐为NodePort,这表示服务现已支持通过节点的IP地址和对应的NodePort来接收外部流量。
kubectl -n ivory-operator get svc --selector=ivory-operator.ivorysql.org/cluster=ivy01
ivy01-ha NodePort 10.99.137.135 <none> 5432:31518/TCP 3h42m
ivy01-ha-config ClusterIP None <none> <none> 3h42m
ivy01-pods ClusterIP None <none> <none> 3h42m
ivy01-primary ClusterIP None <none> 5432/TCP 3h42m
ivy01-replicas ClusterIP 10.100.178.96 <none> 5432/TCP 3h42m
3)使用psql工具连接
psql -h 127.0.0.1 -p 31518 -d postgres -U ivorysql
2.4 用户及数据库管理
1)创建用户、数据库
向cr文件中写入以下内容,代表创建一个名为rhino的用户,并赋予该用户对zoo数据库的访问权限。
spec:
users:
- name: rhino
databases:
- zoo
再次apply这个cr
[root@k8s-master ivory-operator]# kubectl apply -k examples/kustomize/ivory
ivorycluster.ivory-operator.ivorysql.org/ivy01 configured
进入容器查看
kubectl exec -it ivy01-ivy-wgp4-0 -n ivory-operator -- /bin/bashs
[ivorysql@ivy01-instance1-llrz-0 /]$ psql -d zoo
psql (16.0)
Type "help" for help.
zoo=# \du
List of roles
Role name | Attributes
------------+------------------------------------------------------------
_ivoryrepl | Replication
ivy01 |
ivorysql | Superuser, Create role, Create DB, Replication, Bypass RLS
rhino |
2)删除用户/数据库
对于用户或数据库的删除操作,不能简单地通过再次应用修改后的cr文件来实现。相反,您需在集群中直接执行相应的DROP语句来完成这一操作。
DROP OWNED BY rhino;
DROP ROLE rhino;
DROP DATABASE zoo;
3)删除实例
[root@k8s-master ivory-operator]# kubectl delete -k examples/kustomize/ivory
ivorycluster.ivory-operator.ivorysql.org "ivy01" deleted
2.5 实例管理
1)重启集群
kubectl patch IvoryCluster/ivy01 -n ivory-operator --type merge \
--patch '{"spec":{"metadata":{"annotations":{"restarted":"'"$(date)"'"}}}}'
2)关闭集群
kubectl patch IvoryCluster/ivy01 -n ivory-operator --type merge \
--patch '{"spec":{"shutdown": true}}'
3)调整cpu和内存
您可以对cr文件中的cpu和memory部分进行修改,以满足您的特定需求。
spec:
instances:
resources:
limits:
cpu: 2.0
memory: 4Gi
apply
[root@k8s-master ivory-operator]# kubectl apply -k examples/kustomize/ivory
ivorycluster.ivory-operator.ivorysql.org/ivy01 configured
4)自定义配置
在cr文件中做如下修改并应用
spec:
patroni:
dynamicConfiguration:
postgresql:
parameters:
max_parallel_workers: 2
max_worker_processes: 2
shared_buffers: 1GB
work_mem: 4MB
2.6 高可用主备切换
在cr文件中增加如下内容
spec:
patroni:
switchover:
enabled: true
targetInstance: ivy01-instance1-wm5p
(注意:targetInstance 非必填,ivy01-instance1-wm5p为要切换为主的INSTANCE)
apply
[root@k8s-master ivory-operator]# kubectl apply -k examples/kustomize/ivory
ivorycluster.ivory-operator.ivorysql.org/ivy01 configured
主备切换
kubectl annotate -n ivory-operator IvoryCluster ivy01 ivory-operator.ivorysql.org/trigger-switchover="$(date)"
查询主节点
kubectl -n ivory-operator get pods \
--selector=ivory-operator.ivorysql.org/role=master \
-o jsonpath='{.items[*].metadata.labels.ivory-operator\.ivorysql\.org/instance}'
切换回来
kubectl annotate -n ivory-operator IvoryCluster ivy01 ivory-operator.ivorysql.org/trigger-switchover="$(date)" –overwrite
2.7 备份恢复
1)备份
为了完善cr文件中的备份设置,您需要在backups部分增加如下内容,确保options下的各项选项与pgbackrest工具的配置相对应。
spec:
backups:
pgbackrest:
image: docker.io/ivorysql/pgbackrest:ubi8-2.47-2.0-1
manual:
options:
- --type=full
repoName: repo1
执行备份
kubectl annotate -n ivory-operator IvoryCluster ivy01 ivory-operator.ivorysql.org/pgbackrest-backup="$(date)"
2)恢复
编辑cr文件
spec:
backups:
pgbackrest:
image: docker.io/ivorysql/pgbackrest:ubi8-2.47-2.0-1
restore:
enabled: true
repoName: repo1
options:
- --type=time
- --target="2023-06-25 09:38:00"
apply这个cr文件
[root@k8s-master ivory-operator]# kubectl apply -k examples/kustomize/ivory
ivorycluster.ivory-operator.ivorysql.org/ivy01
执行一次恢复
kubectl annotate -n ivory-operator IvoryCluster ivy01 ivory-operator.ivorysql.org/pgbackrest-restore=id1
查询恢复结果
kubectl get all -n ivory-operator
查询恢复完成后实例状态
kubectl get all -n ivory-operator
登录数据库查看数据是否恢复
kubectl exec -it ivy01-ivy-wgp4-0 -n ivory-operator -- /bin/bash