侧边栏壁纸
博主头像
青菜-halo2 博主等级

行动起来,活在当下

  • 累计撰写 74 篇文章
  • 累计创建 6 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

告别手动搬运!Kubernetes 定时任务实现镜像同步/备份

Administrator
2025-05-10 / 0 评论 / 0 点赞 / 20 阅读 / 0 字

项目介绍

在容器化运维场景中,镜像的版本管理与同步备份是至关重要的环节。本项目通过 Kubernetes CronJob 实现了一个自动化镜像同步工具,能够定时从指定的远程仓库(如 Docker Hub)拉取镜像,重新打标签后推送到私有 Harbor 仓库,并为每次同步生成带时间戳的版本。这一方案适用于以下场景:

  • 镜像版本备份:保留历史镜像版本,便于故障回滚。

  • 私有仓库同步:将公共镜像缓存到内网 Harbor,加速内部部署。

  • 自动化运维:减少手动操作,通过定时任务实现无人值守。

项目核心组件

  • Kubernetes CronJob:定时触发任务。

  • 自定义 Docker 镜像:封装镜像同步逻辑的脚本。

  • ConfigMap & Secret:管理配置与敏感信息。

  • Harbor 私有仓库:作为镜像存储目标。


操作实现详解

一、文件结构说明
.
├── 01-configmap.yaml      # Docker配置与镜像列表
├── 02-secret.yaml         # Harbor登录凭证
├── 03-cronjob.yaml        # CronJob定义
└── images/
    ├── custom-script.sh   # 核心同步脚本
    ├── Dockerfile         # 构建任务镜像
    └── images.txt         # 镜像同步清单

二、配置与部署步骤
1. 创建命名空间
kubectl create namespace xiaoya
2. 配置 Docker 守护进程(ConfigMap)

01-configmap.yaml 包含两部分:

  • daemon.json:配置私有仓库为不安全注册表(适用于测试环境)。

  • images.txt:定义同步的镜像列表,格式为 远程镜像 本地仓库路径

apiVersion: v1
kind: ConfigMap
metadata:
  name: docker-daemon-config
  namespace: xiaoya
data:
  daemon.json: |
    {
      "insecure-registries":["192.168.2.206","harbor.yq.com"]
    }
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: image-config
  namespace: xiaoya
data:
  images.txt: |
    xiaoyaliu/alist:latest library/alist
kubectl apply -f 01-configmap.yaml
3. 创建 Harbor 登录凭证(Secret)

02-secret.yaml 存储 Base64 编码的用户名和密码:

apiVersion: v1
kind: Secret
metadata:
  name: dockerhub-secret
  namespace: xiaoya
type: Opaque
data:
  username: eHh4eHh4eHg=
  password: eHh4eHh4eHg=

部署 Secret:

kubectl apply -f 02-secret.yaml
4. 构建自定义任务镜像

Dockerfile 基于 docker:latest 构建,集成同步脚本:

dockerfile

FROM docker:latest
COPY ./custom-script.sh /custom-script.sh
COPY ./images.txt /images.txt
RUN chmod +x /custom-script.sh
ENTRYPOINT ["/custom-script.sh"]

构建并推送镜像:

docker build -t harbor.yq.com/library/docker-cron ./images/
docker push harbor.yq.com/library/docker-cron
5. 部署 CronJob

03-cronjob.yaml 关键配置解析:

  • 定时任务:每天 5:50 执行(schedule: "50 5 * * *")。

  • DNS 配置:指定内部 DNS 服务器解析 Harbor 域名。

  • 特权模式:允许容器操作 Docker 守护进程。

  • 时间同步:挂载宿主机时间确保时间戳准确。

应用 CronJob:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-update-image
  namespace: xiaoya
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          hostAliases:
          - ip: "192.168.2.206"
            hostnames:
            - "harbor.yq.com"
          restartPolicy: OnFailure
          dnsPolicy: "None"  # 必须设置为 "None" 才能使用自定义 DNS 配置
          dnsConfig:
            nameservers:
              - 192.168.2.199
            options:
              - name: ndots
                value: "2"
              - name: timeout
                value: "2"
          containers:
          - name: cronjob-update-image
            image:  harbor.yq.com/library/docker-cron
            imagePullPolicy: Always
            securityContext:
              privileged: true # 启用特权模式
            #command: ["/bin/sh", "-c"]
            #args: ["docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD harbor.yq.com && echo 'docker login successful'" ]
            env:
            - name: DOCKERHUB_USERNAME
              valueFrom:
                secretKeyRef:
                  name: dockerhub-secret
                  key: username
            - name: DOCKERHUB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: dockerhub-secret
                  key: password
            volumeMounts:
               - name: docker-daemon-config
                 mountPath: /etc/docker/daemon.json
                 subPath: daemon.json
               - name: config-volume
                 mountPath: /images.txt
                 subPath: images.txt
               - name: localtime
                 mountPath: /etc/localtime
                 readOnly: true
          volumes:
            - name: docker-daemon-config
              configMap:
                name: docker-daemon-config
            - name: config-volume
              configMap:
                name: image-config
            - name: localtime
              hostPath:
                path: /etc/localtime
                type: File
kubectl apply -f 03-cronjob.yaml

三、核心脚本逻辑(custom-script.sh)
#!/bin/sh
# 等待 Docker 服务启动
dockerd-entrypoint.sh &
until docker info; do sleep 1; done
​
# 生成时间戳
time_tag=$(date +%Y%m%d%H%M)
​
# Harbor 登录
docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD harbor.yq.com
​
# 镜像处理函数
handle_image() {
    docker pull $1
    docker tag $1 "harbor.yq.com/$2:latest"
    docker push "harbor.yq.com/$2:latest"
    docker tag $1 "harbor.yq.com/$2:$time_tag"
    docker push "harbor.yq.com/$2:$time_tag"
    docker rmi "harbor.yq.com/$2:$time_tag"
}
​
# 遍历 images.txt 处理每个镜像
while IFS= read -r line; do
    handle_image $(echo $line | awk '{print $1, $2}')
done < /images.txt

脚本功能

  1. 等待 Docker 服务就绪。

  2. 使用 Secret 中的凭证登录 Harbor。

  3. 遍历镜像列表,拉取远程镜像并推送带 latest 和时间戳的版本到 Harbor。

  4. 清理临时镜像以减少磁盘占用。


四、验证与监控
  1. 查看 CronJob 状态

kubectl -n xiaoya get cronjobs
  1. 检查任务日志

kubectl -n xiaoya logs <pod-name>
  1. 验证 Harbor 镜像: 登录 Harbor 控制台,确认镜像已成功推送并包含时间戳标签。


总结与扩展

项目优势

  • 全自动化:定时任务减少人工干预。

  • 灵活配置:通过 images.txt 轻松扩展同步镜像列表。

  • 版本追溯:时间戳标签便于历史版本管理。

安全建议

  • 生产环境中建议使用 TLS 证书替代 insecure-registries

  • 限制 Secret 的访问权限,避免敏感信息泄露。

扩展方向

  • 添加通知机制(如邮件/Slack)报告任务状态。

  • 集成镜像扫描工具,提升安全性。

  • 增加日志持久化功能,便于审计。

通过本项目,您可以快速搭建一个可靠的镜像同步系统,为容器化部署提供坚实的基础保障。

0

评论区