IvorySQL Operator | 一键部署IvorySQL集群,高效管理与个性化配置尽在掌控

本文介绍了如何在Kubernetes上使用IvorySQLOperator快速部署和管理IvorySQL集群,包括安装、CRD配置、创建实例、高可用性、备份恢复以及用户和数据库管理等内容。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值