当前位置: 首页 > news >正文

OCP中的OCS operator介绍及应用示例

一、OCS operator介绍

Red Hat OpenShift Container Platform(OCP4.8版之前,包含4.8 中,OCS Operator(OpenShift Container Storage Operator) 是用于在 OpenShift 集群中部署、配置和管理 OpenShift Container Storage(OCS) 的核心组件。

OCS 是 Red Hat 推出的一个 软件定义存储(SDS)解决方案,其核心基于 Ceph 构建,为 Kubernetes 工作负载提供持久存储(块、文件、对象存储),并可用于集群内部的多种使用场景,如:

  • 容器持久卷(PV)存储;

  • 内部对象存储(如为 AI/ML 或 S3 接口使用);

  • 镜像仓库存储(例如 OpenShift 内置的镜像仓库);

  • 日志、监控存储(如 Prometheus 数据); 

1、OCS Operator 的作用

OCS Operator 是一个 Operator Framework 应用,核心职责包括:

  1. 部署 OCS 所需的存储组件

    • 部署并管理 Ceph 的核心服务组件(如 rook-ceph-monrook-ceph-osdrook-ceph-mgr 等);

    • 部署 NooBaa(对象存储服务);

    • 部署 StorageClass 供 PVC 动态创建使用。

  2. 管理生命周期

    • 自动执行升级、修补、安全加固;

    • 自动扩容 Ceph 存储池;

    • 故障自愈和监控。

  3. 集成 Kubernetes 存储资源对象

    • 创建 StorageCluster、CephCluster、ObjectBucketClaim 等自定义资源(CR);

    • 支持动态卷调度、存储池自动管理;

    • 提供标准 CSI 接口(块存储、文件存储、对象存储); 

2、关键组件关系图

+-------------------------------+
|         OCS Operator         |
+-------------------------------+|   |            |   |↓   ↓            ↓   ↓
+-----------+   +---------------+
| Rook-Ceph |   |     NooBaa     |   <- 提供对象存储(S3接口)
+-----------+   +---------------+|↓
+----------------------+
| Ceph Cluster         |
| - MON / MGR / OSD    |   <- 支持块、文件存储
+----------------------+

3、部署流程简要说明

  1. 安装 Operator

    • 在 OpenShift 的 OperatorHub 中安装 OCS Operator;

    • Operator 安装后自动安装 Rook-Ceph 和 NooBaa Operator。

  2. 创建 StorageCluster 资源

    • StorageCluster 是 OCS 的顶级 CR,定义了整个存储集群的配置;

    • 你可以指定使用哪些节点、磁盘、存储类型(Internal、External)等。

  3. 自动部署存储集群

    • OCS Operator 基于 StorageCluster 自动创建 Rook-Ceph 集群、存储池等。 

4、常见的资源类型(CR)

  • StorageCluster:定义整个 OCS 集群;

  • CephCluster:由 Rook 创建,定义 Ceph 配置;

  • CephBlockPoolCephFilesystemObjectBucketClaim:分别管理块存储、文件系统和对象存储;

  • StorageClass:Kubernetes 中定义 PV 的接口资源。 

5、使用场景举例

  • 应用数据库(MySQL/PostgreSQL)的 PVC 存储;

  • 部署 AI/ML 任务,使用 OCS 提供的对象存储(S3)上传/读取模型;

  • OpenShift Logging / Monitoring 的数据存储;

  • 为 Jenkins 提供持久化数据支持。 

如果你已经在使用 OCP,并希望搭建自定义存储系统,OCS 是一个企业级的高可用存储解决方案,由 Operator 管理,可深度集成 OpenShift 的生态。

二、OCS Operator 的实际部署 YAML 示例

下面是一个完整的 OpenShift Container Storage(OCS) Operator 安装与配置对象存储(S3 Bucket)的示例流程,包括:

  1. 安装 OCS Operator(通过 Web 控制台或 CLI)

  2. 创建 StorageCluster 资源

  3. 创建对象存储(NooBaa Bucket)并获取 S3 凭据 

1、安装 OCS Operator

可以通过 OpenShift Console 安装(OperatorHub),也可以用 CLI 安装:

1. 创建 OperatorGroup 和 Subscription

# ocs-operator-subscription.yaml
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:name: ocs-operatorgroupnamespace: openshift-storage
spec:targetNamespaces:- openshift-storage
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:name: ocs-subscriptionnamespace: openshift-storage
spec:channel: stable-4.12  # 根据你的 OCP 版本选name: ocs-operatorsource: redhat-operatorssourceNamespace: openshift-marketplace
oc create namespace openshift-storage
oc apply -f ocs-operator-subscription.yaml

 等待几分钟,直到 OCS Operator 安装完成。

2、创建 StorageCluster(本地集群)

# storagecluster.yaml
apiVersion: ocs.openshift.io/v1
kind: StorageCluster
metadata:name: ocs-storageclusternamespace: openshift-storage
spec:manageNodes: falsemonDataDirHostPath: /var/lib/rookstorageDeviceSets:- count: 1dataPVCTemplate:spec:accessModes:- ReadWriteOnceresources:requests:storage: 512GistorageClassName: gp2  # 替换为你的默认 StorageClassvolumeMode: Blockname: ocs-devicesetportable: truereplica: 3resources: {}externalStorage: false
oc apply -f storagecluster.yaml

等待 StorageCluster 状态变为 Ready,表示 Ceph + NooBaa 正常运行。

3、创建对象存储 Bucket(S3 接口)

1. 创建 ObjectBucketClaim(OBC)

# s3-bucket-claim.yaml
apiVersion: objectbucket.io/v1alpha1
kind: ObjectBucketClaim
metadata:name: my-s3-bucketnamespace: openshift-storage
spec:generateBucketName: mybucket-storageClassName: openshift-storage.noobaa.io
oc apply -f s3-bucket-claim.yaml

这将自动创建:

  • 一个 S3 Bucket(在 NooBaa 中);

  • 一个 Secret(包含 S3 access_key、secret_key);

  • 一个 ConfigMap(包含 endpoint 等信息)。

2. 查看访问凭据

# 获取 Secret 名称
SECRET=$(oc get obc -n openshift-storage my-s3-bucket -o jsonpath='{.spec.secretName}')# 查看访问信息
oc get secret -n openshift-storage $SECRET -o yaml

 会看到内容类似:

data:AWS_ACCESS_KEY_ID: BASE64ENCODEDAWS_SECRET_ACCESS_KEY: BASE64ENCODEDBUCKET_HOST: ...BUCKET_NAME: ...BUCKET_PORT: "443"

base64 -d 解码即可使用。

3. 使用 S3 工具访问 Bucket(示例:s3cmd)

# .s3cfg 示例
[default]
access_key = <access-key>
secret_key = <secret-key>
host_base = <bucket-host>
host_bucket = <bucket-host>
use_https = True
signature_v2 = False
s3cmd ls  # 查看 bucket
s3cmd put file.txt s3://mybucket-xxxx/

三、OCS提供PV给数据库使用

下面介绍如何使用 OpenShift Container Storage(OCS)提供的 Persistent Volume(PV) 为数据库(例如 PostgreSQL、MySQL)等提供持久化存储。

OCS 会自动创建多个 StorageClass,这些 StorageClass 通过 Ceph 提供不同类型的存储接口:

1、OCS 默认提供的 StorageClass 类型

部署好 OCS 后,系统会自动创建以下 StorageClass:

StorageClass 名称类型描述
ocs-storagecluster-ceph-rbdBlock 存储适合数据库、缓存等高 IOPS 应用
ocs-storagecluster-cephfs文件存储适合共享访问,如 CI/CD 构建产物
ocs-storagecluster-ceph-rgw对象存储用于 OBC,非 PVC 直接使用

对于数据库,我们一般选择 ocs-storagecluster-ceph-rbd(块存储)

2、创建数据库 PVC(PostgreSQL 示例)

# postgresql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pgdatanamespace: myapp
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: ocs-storagecluster-ceph-rbd

3 、部署 PostgreSQL(StatefulSet 示例)

# postgresql-deployment.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: postgresnamespace: myapp
spec:serviceName: "postgres"replicas: 1selector:matchLabels:app: postgrestemplate:metadata:labels:app: postgresspec:containers:- name: postgresimage: postgres:15ports:- containerPort: 5432env:- name: POSTGRES_DBvalue: mydb- name: POSTGRES_USERvalue: admin- name: POSTGRES_PASSWORDvalue: secretvolumeMounts:- name: pgdatamountPath: /var/lib/postgresql/datavolumeClaimTemplates:- metadata:name: pgdataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 10GistorageClassName: ocs-storagecluster-ceph-rbd

4、部署并验证

oc new-project myapp
oc apply -f postgresql-deployment.yaml

 然后验证 PVC 是否绑定成功:

oc get pvc -n myapp

输出应该类似:

NAME     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                     AGE
pgdata   Bound    pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx   10Gi       RWO            ocs-storagecluster-ceph-rbd      1m

5、说明

  • OCS 使用的 Ceph RBD 提供高性能、可扩展的块存储,非常适合数据库使用;

  • 自动支持故障恢复,节点/Pod 迁移时可自动重挂载;

  • 支持加密、QoS 配置等高级功能(可通过 StorageClass 参数配置); 

如果使用 Helm Chart 部署数据库(如 Bitnami PostgreSQL、MySQL),只需在 values.yaml 中将 storageClass 设置为:

primary:persistence:enabled: truestorageClass: ocs-storagecluster-ceph-rbdsize: 10Gi

四、MySQL示例及设置备份与还原机制

1、使用 OCS 的 PVC 部署 MySQL 示例(StatefulSet)

我们使用 OCS 提供的 块存储(RBD) 来存储 MySQL 数据。

1. 创建命名空间

oc new-project mysql-ocs

2. 创建 MySQL PVC + StatefulSet

# mysql-ocs.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysqlnamespace: mysql-ocs
spec:serviceName: "mysql"replicas: 1selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:8.0env:- name: MYSQL_ROOT_PASSWORDvalue: my-secret-pw- name: MYSQL_DATABASEvalue: mydb- name: MYSQL_USERvalue: myuser- name: MYSQL_PASSWORDvalue: mypassports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-datamountPath: /var/lib/mysqlvolumeClaimTemplates:- metadata:name: mysql-dataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 10GistorageClassName: ocs-storagecluster-ceph-rbd
oc apply -f mysql-ocs.yaml

创建完成后可通过 port-forward 或 Service 暴露端口连接数据库:

oc port-forward statefulset/mysql 3306:3306 -n mysql-ocs

2、MySQL 备份与还原机制(结合 OCS 对象存储)

我们可以用 mysqldump 将数据库导出,然后将其上传到 OCS 提供的 S3 对象存储(NooBaa)中做备份。

1. 创建 ObjectBucketClaim(如之前的示例)

# mysql-backup-obc.yaml
apiVersion: objectbucket.io/v1alpha1
kind: ObjectBucketClaim
metadata:name: mysql-backupnamespace: mysql-ocs
spec:generateBucketName: mysql-backup-storageClassName: openshift-storage.noobaa.io
oc apply -f mysql-backup-obc.yaml

查看并获取访问信息:

SECRET=$(oc get obc mysql-backup -o jsonpath='{.spec.secretName}')
oc get secret $SECRET -n mysql-ocs -o yaml

2. 使用备份脚本上传 MySQL Dump 到对象存储

假设你已经用 mysqldump 导出了一个 mydb.sql 文件:

mysqldump -h 127.0.0.1 -P 3306 -u root -p mydb > mydb.sql

 安装并配置 MinIO Client(mc)或 AWS CLI:

# 安装 awscli(如未安装)
pip install awscli# 配置访问对象存储(用 OBC Secret 中的内容)
aws configure --profile noobaa
AWS Access Key ID: <解码后的 access_key>
AWS Secret Access Key: <解码后的 secret_key>
Default region: us-east-1
Default output: json

上传 SQL 文件:

aws --endpoint-url https://<BUCKET_HOST> --profile noobaa s3 cp mydb.sql s3://mysql-backup-xxxx/

3. 从 S3 恢复备份并导入数据库

# 下载备份
aws --endpoint-url https://<BUCKET_HOST> --profile noobaa s3 cp s3://mysql-backup-xxxx/mydb.sql .# 导入
mysql -h 127.0.0.1 -P 3306 -u root -p mydb < mydb.sql

五、自动定时备份任务(CronJob + S3上传) 示例

1、目标

  • 定时运行备份任务(比如每天凌晨 1 点)

  • 使用 mysqldump 导出数据库

  • 自动上传到 OCS 的对象存储(S3 兼容) 

2、准备工作

1. 获取对象存储的访问凭据(来自 OBC)

假设你已经有了如下 Secret:

oc get secret mysql-backup -n mysql-ocs -o yaml

需要:

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • BUCKET_HOST

  • BUCKET_NAME

3、创建备份 CronJob

# mysql-backup-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:name: mysql-backupnamespace: mysql-ocs
spec:schedule: "0 1 * * *"  # 每天凌晨1点jobTemplate:spec:template:spec:containers:- name: mysql-backupimage: bitnami/mysql:8.0env:- name: MYSQL_ROOT_PASSWORDvalue: my-secret-pw- name: AWS_ACCESS_KEY_IDvalueFrom:secretKeyRef:name: mysql-backupkey: AWS_ACCESS_KEY_ID- name: AWS_SECRET_ACCESS_KEYvalueFrom:secretKeyRef:name: mysql-backupkey: AWS_SECRET_ACCESS_KEY- name: BUCKET_HOSTvalueFrom:secretKeyRef:name: mysql-backupkey: BUCKET_HOST- name: BUCKET_NAMEvalueFrom:secretKeyRef:name: mysql-backupkey: BUCKET_NAMEcommand:- /bin/sh- -c- |apt update && apt install -y awscliTIMESTAMP=$(date +%F-%H%M)mysqldump -h mysql -uroot -p$MYSQL_ROOT_PASSWORD mydb > /tmp/mydb-$TIMESTAMP.sqlaws --endpoint-url https://$BUCKET_HOST s3 cp /tmp/mydb-$TIMESTAMP.sql s3://$BUCKET_NAME/restartPolicy: OnFailure

4、注意事项

1. 修改连接信息:

  • -h mysql:应为数据库服务名称;

  • mydb:要导出的数据库名;

  • my-secret-pw:应与 MySQL 实际密码一致;

  • 如果密码保存在 Secret 中,也可以使用 valueFrom 从 Secret 引用;

2. 安装 awscli:

我们使用 bitnami/mysql 镜像,并在脚本中安装 awscli。为了优化,你也可以:

  • 用自定义镜像提前集成 awscli;

  • 挂载 PVC 临时存储备份文件(目前是在容器临时目录)。 

5、部署 CronJob

oc apply -f mysql-backup-cronjob.yaml

查看执行记录:

oc get cronjob -n mysql-ocs
oc get jobs -n mysql-ocs
oc logs job/<job-name> -n mysql-ocs

6、还原数据(人工触发)

可手动下载:

aws --endpoint-url https://<BUCKET_HOST> --profile noobaa s3 cp s3://mysql-backup-xxxx/mydb-2025-04-10-0100.sql .
mysql -h 127.0.0.1 -u root -p mydb < mydb-2025-04-10-0100.sql

 六、增强版MySQL 自动备份系统

1、功能增强项

  1. 多数据库备份:支持多个数据库定时导出;

  2. 历史版本管理:备份文件带时间戳,保留多个历史版本;

  3. 上传对象存储:上传到 OCS 的 NooBaa(S3 兼容);

  4. Helm Chart 封装:可参数化部署,便于多项目复用;

  5. 可选支持 PVC 缓存临时备份文件

  6. 支持环境隔离、Secret 管理、资源限制配置等企业级部署需求。 

2、文件结构规划

mysql-backup-chart/
├── charts/                    # 子 chart(空)
├── templates/
│   ├── cronjob.yaml           # 核心定时任务
│   ├── secret.yaml            # 存储访问密钥(可选)
│   └── _helpers.tpl           # 模板函数(Helm 专用)
├── values.yaml                # 参数配置(如数据库列表、时间间隔等)
├── Chart.yaml                 # Helm Chart 元数据
└── README.md                  # 使用说明

3、最终成果(Helm Chart)

  • 支持备份数据库:qxdbgztz

  • 每天定时备份,文件自动加上时间戳(如 qxdb-2025-04-10.sql

  • 自动上传到指定 OCS(NooBaa)桶(使用固定前缀)

  • 自动清理 7 天前的备份(S3上删除)

  • 使用自定义镜像(内置 awscli, mysqldump) 

现在将分步输出文件:

步骤 1:values.yaml(用户参数配置)

schedule: "0 1 * * *"  # 每天1点mysql:host: mysqlport: 3306rootPassword: "my-secret-pw"databases:- qxdb- gztzaws:endpoint: https://s3-openshift.noobaa.svcbucket: mysql-backup-prodaccessKey: YOUR_ACCESS_KEYsecretKey: YOUR_SECRET_KEYregion: us-east-1backup:retentionDays: 7image: your-repo/mysql-backup:latesttempDir: /tmp/backups

步骤 2:自定义备份镜像(Dockerfile)

FROM bitnami/mysql:8.0USER rootRUN apt update && apt install -y awscli cron && rm -rf /var/lib/apt/lists/*ENTRYPOINT [ "/bin/bash" ]

 可以构建这个镜像并推送到自己的仓库:

docker build -t your-repo/mysql-backup:latest .
docker push your-repo/mysql-backup:latest

步骤 3:templates/cronjob.yaml

apiVersion: batch/v1
kind: CronJob
metadata:name: {{ include "mysql-backup.fullname" . }}
spec:schedule: "{{ .Values.schedule }}"jobTemplate:spec:template:spec:containers:- name: mysql-backupimage: {{ .Values.backup.image }}env:- name: MYSQL_ROOT_PASSWORDvalue: {{ .Values.mysql.rootPassword }}- name: AWS_ACCESS_KEY_IDvalue: {{ .Values.aws.accessKey }}- name: AWS_SECRET_ACCESS_KEYvalue: {{ .Values.aws.secretKey }}- name: AWS_DEFAULT_REGIONvalue: {{ .Values.aws.region }}command:- /bin/bash- -c- |mkdir -p {{ .Values.backup.tempDir }}for DB in {{ join " " .Values.mysql.databases }}; doFNAME="$DB-$(date +%F-%H%M).sql"mysqldump -h {{ .Values.mysql.host }} -P {{ .Values.mysql.port }} -uroot -p$MYSQL_ROOT_PASSWORD $DB > {{ .Values.backup.tempDir }}/$FNAMEaws --endpoint-url {{ .Values.aws.endpoint }} s3 cp {{ .Values.backup.tempDir }}/$FNAME s3://{{ .Values.aws.bucket }}/done# 自动清理 7 天前备份aws --endpoint-url {{ .Values.aws.endpoint }} s3 ls s3://{{ .Values.aws.bucket }}/ | while read -r line; doFILE_DATE=$(echo $line | awk '{print $1}')FILE_NAME=$(echo $line | awk '{print $4}')if [ -n "$FILE_NAME" ]; thenFILE_TIMESTAMP=$(date -d "$FILE_DATE" +%s)NOW=$(date +%s)AGE=$(( (NOW - FILE_TIMESTAMP) / 86400 ))if [ "$AGE" -ge {{ .Values.backup.retentionDays }} ]; thenecho "Deleting $FILE_NAME (age: $AGE days)"aws --endpoint-url {{ .Values.aws.endpoint }} s3 rm s3://{{ .Values.aws.bucket }}/$FILE_NAMEfifidonerestartPolicy: OnFailure

步骤 4:Chart 元数据 + 辅助模板

Chart.yaml

apiVersion: v2
name: mysql-backup
description: MySQL 自动备份 + OCS 上传 Helm Chart
version: 0.1.0

 templates/_helpers.tpl

{{- define "mysql-backup.fullname" -}}
{{- printf "%s-mysql-backup" .Release.Name -}}
{{- end -}}

步骤 5:README.md 说明(简略)

# MySQL 自动备份 Helm Chart## 功能
- 支持多个数据库
- 自动上传到 OCS (NooBaa)
- 支持自动清理历史版本## 安装```bash
helm install mysql-backup ./mysql-backup-chart -n mysql-ocs

卸载

helm uninstall mysql-backup -n mysql-ocs

七、 S3 SDK调用示例

使用 Python 的 boto3 SDK 调用 S3(兼容 OCS/NooBaa) 示例,可用于列出、上传、下载、删除对象。

1、环境准备

安装依赖:

pip install boto3

2 、配置连接参数(兼容 NooBaa)

import boto3
from botocore.client import Config# 配置参数(替换成你的实际值)
s3 = boto3.client('s3',aws_access_key_id='YOUR_ACCESS_KEY',aws_secret_access_key='YOUR_SECRET_KEY',endpoint_url='https://s3-openshift.noobaa.svc',  # NooBaa S3 endpointconfig=Config(signature_version='s3v4'),region_name='us-east-1'  # NooBaa 通常不限制区域
)

3、S3 操作示例

1. 列出 Bucket 中的文件

response = s3.list_objects_v2(Bucket='mysql-backup-prod')
for obj in response.get('Contents', []):print(obj['Key'], obj['LastModified'])

2. 上传文件到 S3

s3.upload_file('localfile.sql', 'mysql-backup-prod', 'qxdb-2025-04-10.sql')

3. 下载文件从 S3 

s3.download_file('mysql-backup-prod', 'qxdb-2025-04-10.sql', 'downloaded.sql')

4. 删除指定文件

s3.delete_object(Bucket='mysql-backup-prod', Key='qxdb-2025-04-01.sql')

5. 清理 7 天前的备份文件(自动计算) 

import datetimeseven_days_ago = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=7)response = s3.list_objects_v2(Bucket='mysql-backup-prod')
for obj in response.get('Contents', []):if obj['LastModified'] < seven_days_ago:print("Deleting:", obj['Key'])s3.delete_object(Bucket='mysql-backup-prod', Key=obj['Key'])

 这个脚本可以直接作为 自动清理脚本 运行在备份容器里或另一个维护 Job 中。

4、S3 自动清理任务(Python + CronJob)

1.镜像设计(附带 boto3 + python3)

可以基于以下 Dockerfile 构建清理用容器镜像:

FROM python:3.10-slimRUN pip install boto3COPY cleanup.py /app/cleanup.pyENTRYPOINT ["python", "/app/cleanup.py"]

2.Python 脚本 cleanup.py

import boto3
from botocore.client import Config
import datetime
import osaccess_key = os.getenv("AWS_ACCESS_KEY_ID")
secret_key = os.getenv("AWS_SECRET_ACCESS_KEY")
endpoint = os.getenv("S3_ENDPOINT")
region = os.getenv("AWS_REGION")
bucket = os.getenv("S3_BUCKET")
retention_days = int(os.getenv("RETENTION_DAYS", "7"))s3 = boto3.client('s3',aws_access_key_id=access_key,aws_secret_access_key=secret_key,endpoint_url=endpoint,config=Config(signature_version='s3v4'),region_name=region
)cutoff = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=retention_days)response = s3.list_objects_v2(Bucket=bucket)
for obj in response.get('Contents', []):if obj['LastModified'] < cutoff:print(f"Deleting {obj['Key']} (LastModified: {obj['LastModified']})")s3.delete_object(Bucket=bucket, Key=obj['Key'])

3.Helm Chart 中新增 CronJob(templates/s3-cleaner.yaml) 

apiVersion: batch/v1
kind: CronJob
metadata:name: {{ include "mysql-backup.fullname" . }}-s3cleaner
spec:schedule: "0 2 * * *"  # 每天凌晨2点执行jobTemplate:spec:template:spec:containers:- name: s3-cleanerimage: your-repo/s3-cleaner:latestenv:- name: AWS_ACCESS_KEY_IDvalue: {{ .Values.aws.accessKey }}- name: AWS_SECRET_ACCESS_KEYvalue: {{ .Values.aws.secretKey }}- name: AWS_REGIONvalue: {{ .Values.aws.region }}- name: S3_ENDPOINTvalue: {{ .Values.aws.endpoint }}- name: S3_BUCKETvalue: {{ .Values.aws.bucket }}- name: RETENTION_DAYSvalue: "{{ .Values.backup.retentionDays }}"restartPolicy: OnFailure

4.补充说明

需要:

  • 构建并推送清理镜像:

docker build -t your-repo/s3-cleaner:latest .
docker push your-repo/s3-cleaner:latest
  • values.yaml 中补充:
cleanup:enabled: trueimage: your-repo/s3-cleaner:latest
  •  在模板中添加 if .Values.cleanup.enabled 判断逻辑(可选)

相关文章:

OCP中的OCS operator介绍及应用示例

一、OCS operator介绍 在 Red Hat OpenShift Container Platform&#xff08;OCP4.8版之前&#xff0c;包含4.8&#xff09; 中&#xff0c;OCS Operator&#xff08;OpenShift Container Storage Operator&#xff09; 是用于在 OpenShift 集群中部署、配置和管理 OpenShift …...

Linux-服务器添加审计日志功能

#查看audit软件是否在运行(状态为active而且为绿色表示已经在运行) systemctl start auditd #如果没有在运行的话,查看是否被系统禁用 (audit为0表示被禁用) cat /proc/cmdline | grep -w "audit=0" #修改/etc/default/grub里面audit=0 改为audit=1 #更新GRUB…...

ARM Cortex-M中断处理全解析

今天我们聊一聊ARM Cortex-M中断处理。在嵌入式系统中&#xff0c;中断是实现实时响应的核心机制。想象一下&#xff0c;如果没有中断&#xff1a; 按键按下时&#xff0c;系统可能忙于其他任务而错过响应通信数据到来时&#xff0c;可能因为没及时处理而丢失定时任务难以精确…...

douyin_search_tool | 用python开发的抖音关键词搜索采集软件

本软件工具仅限于学术交流使用&#xff0c;严格遵循相关法律法规&#xff0c;符合平台内容合法性&#xff0c;禁止用于任何商业用途&#xff01; 抖音作为国内颇受欢迎的短视频社交平台&#xff0c;汇聚了大量用户群体和活跃用户。分析平台上的热门视频可用于市场调研和竞品分析…...

基于FreeBSD的Unix服务器网络配置

Unix系统版本 FreeBSD-10.1-i386 网络配置 1.配置网络ip及网关 #编辑配置文件 ee /etc/rc.conf #参照如下内容设置 ifconfig_em0”inet 192.168.1.189 netmask 255.255.255.0” defaultrouter”192.168.1.1” #回到命令模式 esc #保存 a a 2.配置dns #编辑配置文件 ee /etc/…...

Margin和Padding在WPF和CSS中的不同

CSS和WPF中 margin 与 padding 在方向上的规定基本一致&#xff0c;但在使用场景和一些细节上有所不同。 CSS - 方向规定&#xff1a; margin 和 padding 属性可以分别指定上、右、下、左四个方向的值。例如 margin:10px 20px 30px 40px; 表示上外边距为10px、右外边距为20…...

JVM 概述

JVM概述 JVM的全为 Java Virtual Machine&#xff0c;但是目前的 JVM 已经不再与任何语言进行深度耦合了&#xff0c;其本质就是运行在计算机上的程序&#xff0c;职责是运行处理 Java 字节码文件。 JVM 功能 解释和运行 JVM 会对字节码文件中的指令&#xff0c;实时的解释为…...

基于django云平台的求职智能分析系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;招聘信息管理系统当然不能排除在外。求职智能分析系统是在实际应用和软件工程的开发原理之上&#xff0c;运用Python语言、爬虫技术以及Dj…...

在 Ubuntu 上通过 Docker 部署 Misskey 服务器

在这篇博客中&#xff0c;我们将探讨如何在 Ubuntu 上通过 Docker 部署 Misskey 服务器。Misskey 是一个开源的社交网络平台&#xff0c;支持丰富的社交功能&#xff0c;适合个人和小型社群使用。而 Docker 则是一个便捷的容器化平台&#xff0c;允许开发者轻松地打包、发布和运…...

Pytorch 第十五回:神经网络编码器——GAN生成对抗网络

Pytorch 第十五回&#xff1a;神经网络编码器——GAN生成对抗网络 本次开启深度学习第十五回&#xff0c;基于Pytorch的神经网络编码器。本回分享的是GAN生成对抗网络。在本回中&#xff0c;通过minist数据集来分享如何建立一个GAN生成对抗网络。接下来给大家分享具体思路。 本…...

gitlab如何查看分支的创建时间

在 GitLab 上查看分支创建时间&#xff0c;常规的界面不会直接显示&#xff0c;但可以通过以下几种方法查到准确时间&#xff1a; 方法一&#xff1a;通过 GitLab Web 界面查看首次提交时间&#xff08;近似&#xff09; 打开你的项目仓库。点击左侧的「Repository&#xff08…...

centos时间不正确解决

检查当前系统时间 date如果时间明显不正确&#xff0c;可以进一步检查硬件时钟&#xff08;BIOS 时间&#xff09;&#xff1a; bash复制代码hwclock --show同步时间&#xff08;推荐方式&#xff09; 为了确保系统时间准确&#xff0c;建议使用 NTP&#xff08;网络时间协议…...

ubuntu启动 Google Chrome 时默认使用中文界面,设置一个永久的启动方式

方法 &#xff1a;通过桌面快捷方式设置 编辑 Chrome 的桌面快捷方式&#xff1a; 找到您的 Google Chrome 快捷方式文件。如果是通过菜单启动&#xff0c;通常会在以下路径找到与 Chrome 相关的 .desktop 文件&#xff1a; sudo vim /usr/share/applications/google-chrome.d…...

opencv腐蚀的操作过程

在腐蚀操作的详细流程中&#xff0c;遍历图像的过程如下&#xff1a; 初始化&#xff1a; 设置一个起始位置&#xff08;通常从图像的左上角开始&#xff09;。 准备好结构元素&#xff08;structuring element&#xff09;&#xff0c;它是一个小的矩阵&#xff0c;大小通常是…...

Docker--Docker镜像原理

docker 是操作系统层的虚拟化&#xff0c;所以 docker 镜像的本质是在模拟操作系统。 联合文件系统&#xff08;UnionFS&#xff09; 联合文件系统&#xff08;UnionFS&#xff09; 是Docker镜像实现分层存储的核心技术&#xff0c;它通过将多个只读层&#xff08;Image Laye…...

HL7消息编辑器的使用手册

REDISANT 提供互联网与物联网开发测试套件 # 互联网与中间件&#xff1a; Redis AssistantZooKeeper AssistantKafka AssistantRocketMQ AssistantRabbitMQ AssistantPulsar AssistantHBase AssistantNoSql AssistantEtcd AssistantGarnet Assistant 工业与物联网&#xff1…...

技术与情感交织的一生 (六)

目录 食色性也 Z 姐 Pizza “修罗场” 之战 大二 下 EP 混乱 危机 撤退 离别 初创 重逢 食色性也 美食、美器、美女。追求美好的事物是人的天性。八部众里&#xff0c;天众界&#xff1a;因修行&#xff0c;有美食而无美女&#xff1b;阿修罗界&#xff1a;因产力…...

AI搜索引擎的局限性

# 揭秘AI搜索引擎的局限性与深度爬取技巧 > 摘要&#xff1a;本文深入分析了基于关键词的AI搜索引擎局限性&#xff0c;探讨了深网内容难以被发现的原因&#xff0c;并提供了一系列实用技巧来提高信息获取的全面性。无论是开发者、研究人员还是普通用户&#xff0c;了解这些…...

IPD项目管理的“黄金三角“在2025年是否需要重构?

——技术革命下的组织进化与实践创新 一、时空背景&#xff1a;IPD黄金三角的底层逻辑与时代挑战 IPD&#xff08;集成产品开发&#xff09;管理体系自1998年引入中国以来&#xff0c;其"黄金三角"——跨职能团队协作、结构化流程体系、决策评审机制——始终是企业…...

Jarpress 开源项目重构公告

项目背景 经过长达三个月的技术攻坚&#xff0c;我们正式宣布完成对九年历史开源项目的全面重构升级&#xff01;原项目基于JFina框架开发&#xff0c;现采用SpringBootMyBatis技术栈重构&#xff0c;正式更名为Jarpress。 架构升级 采用最小组件依赖实现&#xff0c;减少系…...

Redshift 2025.4.1 版本更新:多平台兼容性与功能修复

2025 年 4 月 10 日&#xff0c;Redshift 发布 2025.4.1 版本&#xff08;2025.04&#xff09;&#xff0c;聚焦宿主软件兼容性提升与核心功能修复&#xff0c;具体更新如下&#xff1a; 各平台适配与优化 Maya/3ds Max/Blender&#xff1a;新增对 Maya 2026、3ds Max 2026、…...

使用crxjs插件编写浏览器扩展插件遇到的问题 Waiting for the extension service worker...

目前最新的vitejs/plugin-vue和crxjs/vite-plugin不兼容&#xff0c;在crxjs官网有写 修改插件版本如下&#xff1a; "devDependencies": {"crxjs/vite-plugin": "^1.0.14","vitejs/plugin-vue": "^2.3.4","vite"…...

数据库学习通期末复习一

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…...

数据分析实战案例:使用 Pandas 和 Matplotlib 进行居民用水

原创 IT小本本 IT小本本 2025年04月15日 18:31 北京 本文将使用 Matplotlib 及 Seaborn 进行数据可视化。探索如何清理数据、计算月度用水量并生成有价值的统计图表&#xff0c;以便更好地理解居民的用水情况。 数据处理与清理 读取 Excel 文件 首先&#xff0c;我们使用 pan…...

生态环境影响评价全解析

生态环境影响评价的原则、方法、工作程序、指标选择、参数计算、模型模拟、报告编制 一 &#xff1a;生态环境影响评价的基本程序 生态环境影响评价的涵义、生态影响的类型&#xff1b;生态环境影响评价的原则、流程、等级确定及工作范围。 图1 空间尺度上长江对中华鲟的累积…...

【Netty篇】Netty的线程模型

目录 一、Netty 线程模型是啥&#xff1f;二、Netty 线程模型有啥作用&#xff1f;三、Netty 线程模型解决了什么问题&#xff1f;四、如何使用 Netty 线程模型&#xff1f;五、Netty 线程模型的优缺点&#xff1f;六、总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1…...

PyTorch实现权重衰退:从零实现与简洁实现

一、权重衰退原理 权重衰退&#xff08;L2正则化&#xff09;通过向损失函数添加权重的L2范数惩罚项&#xff0c;防止模型过拟合。其损失函数形式为&#xff1a; 二、从零开始实现 1.1 导入库与数据生成 %matplotlib inline import torch from torch import nn from d2l imp…...

Webflux声明式http客户端:Spring6原生HttpExchange实现,彻底摒弃feign

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

python的strip()函数用法; 字符串切片操作

python的strip()函数用法 目录 python的strip()函数用法代码整体功能概述代码详细解释1. `answer["output_text"]`2. `.strip()`3. `final_answer = ...`字符串切片操作:answer[start_index + len("Helpful Answer:"):].strip()整体功能概述代码详细解释1…...

多模态大语言模型arxiv论文略读(二十一)

EgoPlan-Bench: Benchmarking Multimodal Large Language Models for Human-Level Planning ➡️ 论文标题&#xff1a;EgoPlan-Bench: Benchmarking Multimodal Large Language Models for Human-Level Planning ➡️ 论文作者&#xff1a;Yi Chen, Yuying Ge, Yixiao Ge, Mi…...

MCP学习资料

Anthropic 官方&#xff1a;https://modelcontextprotocol.io/introduction 中文站&#xff1a;https://mcpcn.com/docs/examples/...

《Training Language Models to Self-Correct via Reinforcement Learning》全文翻译

《Training Language Models to Self-Correct via Reinforcement Learning》 通过强化学习训练语言模型实现自我修正 Aviral Kumar ∗ , 1 { }^{\\*, 1} ∗,1, Vincent Zhuang ∗ , 1 { }^{\\*, 1} ∗,1, Rishabh Agarwal ∗ , 1 { }^{\\*}, 1 ∗,1, Yi Su ∗ , 1 { }^…...

Rust 之五 所有权、.. 和 _ 语法、引用和切片、Vec<T>、HashMap<K, V>

概述 Rust 的基本语法对于从事底层 C/C 开发的人来说多少有些难以理解&#xff0c;虽然官方有详细的文档来介绍&#xff0c;不过内容是相当的多&#xff0c;看起来也费劲。本文通过将每个知识点简化为 一个 DEMO 每种特性各用一句话描述的形式来简化学习过程&#xff0c;提高学…...

如何运行Vue 3 + Tauri + Rust 前端项目

Vue 3 Tauri Rust 前端项目运行需要安装以下工具和依赖&#xff1a; 1. 基本开发工具 Node.js (建议 LTS 版本) - 用于运行前端构建工具 包含 npm 或 yarn 包管理器下载地址 Rust 工具链 - Tauri 基于 Rust 构建 通过 rustup 安装安装命令: curl --proto https --tlsv1.2 -…...

Nature图形复现—Origin绘制顶刊水准的多组柱状图

多组柱状图&#xff08;也称分组柱状图或簇状柱状图&#xff09;是一种数据可视化图形&#xff0c;用于同时展示多个组别在不同子类别下的数据对比。其核心特点是通过并列的柱子将不同组别的数据排列在同一子类别下&#xff0c;便于直观比较。 本期教程以2022年发表于Nature的文…...

空格键会提交表单吗?HTML与JavaScript中的行为解析

在网页开发中&#xff0c;理解用户交互细节对于提供流畅的用户体验至关重要。一个常见的问题是&#xff1a;空格键是否会触发表单提交&#xff1f;本文将通过一个简单的示例解释这一行为&#xff0c;并探讨如何使用HTML和JavaScript来定制这种交互。 示例概览 考虑以下HTML代…...

详解@JsonFormat和@DateTimeFormat注解:处理日期格式化的利器

在Java开发中,尤其是Spring和Spring Boot项目中,日期时间类型(如Date、LocalDateTime等)的格式化问题经常困扰开发者。例如,前端传递的日期字符串如何转换为后端对象?后端返回的日期对象如何按指定格式序列化?这时候,@JsonFormat和@DateTimeFormat两个注解可以轻松解决…...

python-各种文件(txt,xls,csv,sql,二进制文件)读写操作、文件类型转换、数据分析代码讲解

1.文件txt读写标准用法 1.1写入文件 要读取文件&#xff0c;首先得使用 open() 函数打开文件。 file open(file_path, moder, encodingNone) file_path&#xff1a;文件的路径&#xff0c;可以是绝对路径或者相对路径。mode&#xff1a;文件打开模式&#xff0c;r 代表以…...

Python(16)Python文件操作终极指南:安全读写与高效处理实践

目录 背景介绍一、文件操作基础架构1. 文件打开模式详解 二、文件读取全攻略1. 基础读取方法2. 大文件处理方案3. 定位与截断 三、文件写入进阶技巧1. 基础写入操作2. 缓冲控制与实时写入 四、with上下文原理剖析1. 上下文管理协议2. 多文件同时操作 五、综合实战案例1. 加密文…...

Maven相关名词及相关配置

1、相关名词 1 Project&#xff1a; 任何你想build的事物&#xff0c;maven都可以认为他们是工程&#xff0c;这些工程被定义为工程对象模型(POM:Project Object Model)一个工程可以依赖其他的工程&#xff0c;一个工程也可以有多个子工程构成。 2 POM&#xff1a; 就是xml文件…...

【自动化测试】如何获取cookie,跳过登录的简单操作

前言 &#x1f31f;&#x1f31f;本期讲解关于自动化测试函数相关知识介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话…...

登录校验:保障系统安全访问的关键技术解析

摘要&#xff1a;本文围绕Tlias智能学习辅助系统的登录校验功能展开&#xff0c;深入剖析了实现登录校验的必要性&#xff0c;介绍了会话技术和统一拦截技术等关键实现思路&#xff0c;并对Cookie、Session和令牌技术三种会话跟踪方案进行了详细对比&#xff0c;旨在为系统的安…...

数据库案例1--视图和索引

以下是一个关于数据库视图和索引的高级使用教程&#xff0c;结合实际案例进行讲解。我们将使用一个电商系统的数据库作为示例&#xff0c;展示如何创建和优化视图&#xff0c;以及如何通过索引提高查询性能。 案例背景 假设我们有一个电商系统&#xff0c;包含以下表&#xf…...

load_summarize_chain ,load_qa_chain 是什么

load_summarize_chain ,load_qa_chain 是什么 目录 load_summarize_chain ,load_qa_chain 是什么`load_summarize_chain``load_qa_chain`其他构建链的方式SequentialChain, TransformChainload_summarize_chain 和 load_qa_chain 都是 LangChain 库中的实用工具函数,用于快速构…...

SQL2API 核心理念:如何重构数据服务交付范式

在企业数据治理的漫长链条中&#xff0c;"数据服务交付" 始终是决定数据价值转化效率的关键一环。传统数据接口开发需经历需求沟通、SQL 编写、后端编码、接口测试、权限配置等多个环节&#xff0c;平均开发周期长达 7-10 天&#xff0c;且技术门槛高&#xff0c;导致…...

Proteus 仿真51单片机-串口收发小窥

51单片机 51单片机是一种经典的8位微控制器&#xff0c;广泛应用于各种嵌入式系统开发中。它具有结构简单、可靠性高、价格低廉等特点&#xff0c;深受工程师和电子爱好者的喜爱。 51单片机的核心是一个8位的CPU&#xff0c;能够执行多种指令&#xff0c;完成数据处理和逻辑运…...

信号与系统期中复习(第一章)

1、连续信号叠加的周期 2、离散信号的周期判定 离散信号只有当周期为整数的时候&#xff0c;才是周期信号 3、信号的时间变换 4、取样性质相关计算 5、系统的描述 6、线性系统的性质 7、信号的时间变换 8、基本概念 判断时不变系统的方法&#xff1a; 若f&#xff08;t&#…...

bash的特性-常用的通配符

在Linux或Unix系统中&#xff0c;Bash作为最常用的命令行解释器之一&#xff0c;提供了多种通配符&#xff08;wildcards&#xff09;来帮助用户更高效地进行文件操作。这些通配符可以用来匹配多个文件名或路径名&#xff0c;极大地简化了批量处理任务。本文将详细介绍Bash中常…...

Android12 自定义系统服务

在Android中可以通过两种方式创建系统服务: 由SystemServer启动的系统服务,使用SystemServer线程资源,适合轻量级的服务,比如各种XMS服务;占用独立进程,在系统启动时,由init进程拉起,比如SurfaceFlinger;本文采用的是第一种方式。 自定义AssistantManagerService 参…...

安防监控视频管理平台EasyCVR助力建筑工地施工4G/5G远程视频监管方案

一、项目背景 随着城市建设的快速发展&#xff0c;房地产建筑工地的数量、规模与施工复杂性都在增加&#xff0c;高空作业、机械操作频繁&#xff0c;人员流动大&#xff0c;交叉作业多&#xff0c;安全风险剧增。施工企业和政府管理部门在施工现场管理上都面临难题。政府部门…...