暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在 Kubernetes 上使用 MinIO 设置和管理 PostgreSQL Operator

新智锦绣 2024-12-26
123

点击蓝字关注我们


本文我们将介绍在 Kubernetes 集群上设置 PostgreSQL Operator、用于备份的 MinIO 和 HostPath CSI 驱动程序。


一、测试环境


Client Version:v1.30.2

Kustomize Version: v5.0.4-0

Server Version: v1.30.2

Database: PostgreSQL 16.3

Operator: cloud-native-postgresql 1.23.2


二、测试步骤


2.1 安装PostgreSQL Operator


首先,我们需要部署PostgreSQL Operator,它可以简化Kubernetes上PostgreSQL集群的管理。

    kubectl apply --server-side -f https://get.enterprisedb.io/cnp/postgresql-operator-1.23.2.yaml
    复制

    此命令部署 PostgreSQL Operator 以及管理 PostgreSQL 集群所需的相关自定义资源定义 (CRD)、服务帐户、角色和部署。

    验证输出:

      kubectl get deployment -n postgresql-operator-system postgresql-operator-controller-manager
      复制

      输出如下:

        NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
        postgresql-operator-controller-manager   1/1     1            1           58s
        复制


        2.2 设置 MinIO用于备份


        MinIO 是一种高性能、与S3兼容的对象存储,我们将使用它来存储 PostgreSQL 备份。

        2.2.1 创建 MinIO 部署

        下面的 YAML 中提供的值是 Base64 编码的字符串。

        ACCESS_KEY_ID: bWluaW8= 解码值: minio

        ACCESS_SECRET_KEY:bWluaW8xMjM= 解码值:minio123

        创建一个包含以下内容的 minio.yaml 文件:

          apiVersion: v1
          kind: Secret
          metadata:
           name: minio-creds
          data:
           ACCESS_KEY_ID: bWluaW8=
           ACCESS_SECRET_KEY: bWluaW8xMjM=


          ---
          apiVersion: v1
          kind: Service
          metadata:
           name: minio-service
          spec:
           ports:
             - port: 9000
               targetPort: 9000
               protocol: TCP
           selector:
             app: minio


          ---
          apiVersion: v1
          kind: PersistentVolumeClaim
          metadata:
           name: minio-pv-claim
          spec:
           accessModes:
             - ReadWriteOnce
           resources:
             requests:
               storage: 2Gi
           storageClassName: standard


          ---
          apiVersion: apps/v1
          kind: Deployment
          metadata:
           name: minio
          spec:
           selector:
             matchLabels:
               app: minio
           template:
             metadata:
               labels:
                 app: minio
             spec:
               volumes:
               - name: data
                 persistentVolumeClaim:
                   claimName: minio-pv-claim
               containers:
               - name: minio
                 image: minio/minio:RELEASE.2024-11-10T18-41-49Z
                 args:
                 - server
                 - data
                 env:
                 - name: MINIO_ACCESS_KEY
                   valueFrom:
                     secretKeyRef:
                       name: minio-creds
                       key: ACCESS_KEY_ID
                 - name: MINIO_SECRET_KEY
                   valueFrom:
                     secretKeyRef:
                       name: minio-creds
                       key: ACCESS_SECRET_KEY
                 ports:
                 - containerPort: 9000
                 readinessProbe:
                   httpGet:
                     path: minio/health/ready
                     port: 9000
                   initialDelaySeconds: 30
                 livenessProbe:
                   httpGet:
                     path: minio/health/live
                     port: 9000
                   initialDelaySeconds: 30
          复制

          Apply MinIO 的配置:

            kubectl apply -f minio.yaml
            复制

            验证MinIO部署:

              kubectl get deployment minio
              复制

              输出如下:

                NAME    READY   UP-TO-DATE   AVAILABLE   AGE
                minio   1/1     1            1           70s
                复制


                三、部署HostPath CSI驱动


                要启用卷快照进行备份,我们需要部署 HostPath CSI 驱动程序。

                创建包含以下内容的deploy-hostpath-csi.sh 脚本:

                  #!/bin/env bash


                  CSI_BASE_URL=https://raw.githubusercontent.com/kubernetes-csi
                  CSI_DRIVER_HOST_PATH_VERSION=v1.11.0
                  SNAPSHOTTER_VERSION="v6.3.1"
                  PROVISIONER_VERSION="v3.6.1"
                  RESIZER_VERSION="v1.9.1"
                  ATTACHER_VERSION="v4.4.1"


                  ## Install external snapshotter CRD
                  kubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
                  kubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
                  kubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
                  kubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
                  kubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
                  kubectl apply -f "${CSI_BASE_URL}"/external-snapshotter/"${SNAPSHOTTER_VERSION}"/deploy/kubernetes/csi-snapshotter/rbac-csi-snapshotter.yaml


                  ## Install external provisioner
                  kubectl apply -f "${CSI_BASE_URL}"/external-provisioner/"${PROVISIONER_VERSION}"/deploy/kubernetes/rbac.yaml


                  ## Install external attacher
                  kubectl apply -f "${CSI_BASE_URL}"/external-attacher/"${ATTACHER_VERSION}"/deploy/kubernetes/rbac.yaml


                  ## Install external resizer
                  kubectl apply -f "${CSI_BASE_URL}"/external-resizer/"${RESIZER_VERSION}"/deploy/kubernetes/rbac.yaml


                  ## Install driver and plugin
                  kubectl apply -f "${CSI_BASE_URL}"/csi-driver-host-path/"${CSI_DRIVER_HOST_PATH_VERSION}"/deploy/kubernetes-1.24/hostpath/csi-hostpath-driverinfo.yaml
                  kubectl apply -f "${CSI_BASE_URL}"/csi-driver-host-path/"${CSI_DRIVER_HOST_PATH_VERSION}"/deploy/kubernetes-1.24/hostpath/csi-hostpath-plugin.yaml


                  ## create volumesnapshotclass
                  kubectl apply -f "${CSI_BASE_URL}"/csi-driver-host-path/"${CSI_DRIVER_HOST_PATH_VERSION}"/deploy/kubernetes-1.24/hostpath/csi-hostpath-snapshotclass.yaml


                  ## create storage class
                  kubectl apply -f "${CSI_BASE_URL}"/csi-driver-host-path/"${CSI_DRIVER_HOST_PATH_VERSION}"/examples/csi-storageclass.yaml
                  复制

                  运行脚本:

                    bash deploy-hostpath-csi.sh
                    复制


                    四、Rollout 重启 Operator


                      % kubectl get deployment -A                                               
                      NAMESPACE                    NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
                      default                      minio                                    1/1     1            1           2d19h
                      kube-system                  coredns                                  2/2     2            2           2d20h
                      kube-system                  snapshot-controller                      2/2     2            2           2d19h
                      local-path-storage           local-path-provisioner                   1/1     1            1           2d20h
                      postgresql-operator-system   postgresql-operator-controller-manager   1/1     1            1           2d19h
                      复制

                      重启 deployment:

                        % kubectl rollout restart deployment -n postgresql-operator-system postgresql-operator-controller-manager
                        复制

                        输出:

                          deployment.apps/postgresql-operator-controller-manager restarted
                          复制

                          验证CSI驱动deployment

                            kubectl get deployment -A
                            复制

                            输出:

                              NAMESPACE                    NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
                              kube-system                  snapshot-controller                      2/2     2            2           53s
                              default                      minio                                    1/1     1            1           70s
                              postgresql-operator-system   postgresql-operator-controller-manager   1/1     1            1           2m15s
                              复制


                              五、创建具有备份配置的PostgreSQL集群


                              创建一个 PostgreSQL 集群并将其配置为使用 MinIO 进行备份。

                              创建包含以下内容的 cluster-example-with-backup.yaml 文件:

                                apiVersion: postgresql.k8s.enterprisedb.io/v1
                                kind: Cluster
                                metadata:
                                 name: cluster-example-backup
                                spec:
                                 instances: 2


                                 storage:
                                   storageClass: csi-hostpath-sc
                                   size: 1Gi


                                 # Backup properties
                                 # This assumes a local minio setup
                                 backup:
                                   volumeSnapshot:
                                     className: csi-hostpath-snapclass
                                   barmanObjectStore:
                                     destinationPath: s3://cluster-backups/
                                     endpointURL: http://minio-service:9000
                                     s3Credentials:
                                       accessKeyId:
                                         name: minio-creds
                                         key: ACCESS_KEY_ID
                                       secretAccessKey:
                                         name: minio-creds
                                         key: ACCESS_SECRET_KEY
                                     wal:
                                       compression: gzip
                                     data:
                                       immediateCheckpoint: true
                                   retentionPolicy: "30d"
                                复制

                                Apply配置:

                                  kubectl apply -f cluster-example-with-backup.yaml
                                  复制

                                  验证集群状态:

                                    kubectl cnp status cluster-example-backup
                                    复制

                                    输出如下:

                                      Cluster Summary
                                      Name:                cluster-example-backup
                                      Namespace:           default
                                      System ID:           7389252359945887770
                                      PostgreSQL Image:    quay.io/enterprisedb/postgresql:16.3
                                      Primary instance:    cluster-example-backup-1
                                      Primary start time:  2024-11-08 13:13:19 +0000 UTC (uptime 2m39s)
                                      Status:              Cluster in healthy state
                                      Instances:           2
                                      Ready instances:     2
                                      复制


                                      六、创建卷快照备份


                                      创建volume-snapshot-backup.yaml 文件,如下:

                                        apiVersion: postgresql.k8s.enterprisedb.io/v1
                                        kind: Backup
                                        metadata:
                                         name: volume-snapshot-backup
                                        spec:
                                         cluster: cluster-example-backup
                                         method: volumesnapshot
                                         volumesnapshot:
                                           className: csi-hostpath-snapclass
                                        复制

                                        部署配置:

                                          kubectl apply -f volume-snapshot-backup.yaml
                                          复制

                                          验证状态:

                                            kubectl cnp status backup volume-snapshot-backup
                                            复制

                                            预期输出:

                                              Backup Summary
                                              Name:             volume-snapshot-backup
                                              Cluster:          cluster-example-backup
                                              Type:             volumeSnapshot
                                              Status:           Completed
                                              Start time:       2024-11-08 14:30:47 +0000 UTC (started 4s ago)
                                              End time:         2024-11-08 14:30:51 +0000 UTC (took 4s)
                                              Volume Snapshots: 2
                                              复制


                                              七、Barman备份


                                              通过Barman创建备份


                                              7.1 创建backup.yaml 文件:


                                                apiVersion: postgresql.k8s.enterprisedb.io/v1
                                                kind: Backup
                                                metadata:
                                                 name: backup-example
                                                spec:
                                                 cluster:
                                                   name: cluster-example-backup
                                                复制


                                                7.2 部署配置


                                                  kubectl apply -f backup.yaml
                                                  复制


                                                  7.3 验证备份


                                                    kubectl get backup
                                                    复制

                                                    预期输出:

                                                      NAME                     AGE     CLUSTER                  METHOD              PHASE       ERROR
                                                      backup-example           18s     cluster-example-backup   barmanObjectStore   completed  
                                                      snapshot-backup-1.23.2   2d19h   cluster-example-backup   volumeSnapshot      completed  
                                                      复制


                                                      7.4 获取备份详细信息


                                                        kubectl describe backup backup-example
                                                        复制

                                                        输出如下:

                                                          Name:         backup-example
                                                          Namespace:    default
                                                          Labels:       <none>
                                                          Annotations:  <none>
                                                          API Version:  postgresql.k8s.enterprisedb.io/v1
                                                          Kind:         Backup
                                                          Metadata:
                                                           Creation Timestamp:  2024-11-11T08:21:30Z
                                                           Generation:          1
                                                           Resource Version:    81003
                                                           UID:                 edb065b4-41d9-433c-82d0-2f0deceee4c1
                                                          Spec:
                                                           Cluster:
                                                             Name:  cluster-example-backup
                                                           Method:  barmanObjectStore
                                                          Status:
                                                           Backup Id:         20241111T082133
                                                           Backup Name:       backup-20241111082132
                                                           Begin LSN:         0/6008870
                                                           Begin Wal:         000000010000000000000006
                                                           Destination Path:  s3://cluster-backups/
                                                           End LSN:           0/8000000
                                                           End Wal:           000000010000000000000008
                                                           Endpoint URL:      http://minio-service:9000
                                                           Instance ID:
                                                             Container ID:  containerd://ddcb4c8e5ddac49991b1a363d4619ec9b0e15bebbdab4e0f831bd57ac4057f55
                                                             Pod Name:      cluster-example-backup-2
                                                           Method:          barmanObjectStore
                                                           Phase:           completed
                                                           s3Credentials:
                                                             Access Key Id:
                                                               Key:   ACCESS_KEY_ID
                                                               Name:  minio-creds
                                                             Secret Access Key:
                                                               Key:      ACCESS_SECRET_KEY
                                                               Name:     minio-creds
                                                           Server Name:  cluster-example-backup
                                                           Started At:   2024-11-11T08:21:33Z
                                                           Stopped At:   2024-11-11T08:21:34Z
                                                          Events:
                                                           Type    Reason     Age   From                            Message
                                                           ----    ------     ----  ----                          -------
                                                           Normal  Starting   89s   cloud-native-postgresql-backup  Starting backup for cluster cluster-example-backup
                                                           Normal  Starting   88s   instance-manager                Backup started
                                                           Normal  Completed  84s   instance-manager                Backup completed
                                                          复制


                                                          八、检查MinIO Web界面


                                                          在 MinIO Web 界面上验证备份:

                                                          端口转发 MinIO 服务

                                                            kubectl port-forward svc/minio-service 9000:9000
                                                            复制

                                                            指示端口转发处于活动状态:

                                                              Forwarding from 127.0.0.1:9000 -> 9000
                                                              Forwarding from [::1]:9000 -> 9000
                                                              Handling connection for 9000
                                                              Handling connection for 9000
                                                              Handling connection for 9000
                                                              复制

                                                              浏览器打开MinIO界面

                                                                http://localhost:9000
                                                                复制


                                                                九、验证MinIO备份


                                                                访问MinIO界面

                                                                1. 使用 minio-creds 密钥中定义的凭据(ACCESS_KEY_ID 和 ACCESS_SECRET_KEY )登录。

                                                                2. 导航到 cluster-backups 存储桶。

                                                                3. 应该看到一个名为 cluster-example-backup/ 的文件夹,其中包含 base/ 和 wals/ 目录,它们分别存储基本备份和 WAL 段。

                                                                这样就使用PostgreSQL Operator以及 Kubernetes上的MinIO和HostPath CSI驱动程序完成了设置、备份创建和验证过程。


                                                                关于公司

                                                                感谢您关注新智锦绣科技(北京)有限公司!作为 Elastic 的 Elite 合作伙伴及 EnterpriseDB 在国内的唯一代理和服务合作伙伴,我们始终致力于技术创新和优质服务,帮助企业客户实现数据平台的高效构建与智能化管理。无论您是关注 Elastic 生态系统,还是需要 EnterpriseDB 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。


                                                                欢迎关注我们,获取更多技术资讯和数字化转型方案,共创美好未来!

                                                                Elastic 微信群

                                                                EDB 微信群


                                                                发现“分享”“赞”了吗,戳我看看吧



                                                                文章转载自新智锦绣,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                评论