项目介绍
在容器化运维场景中,镜像的版本管理与同步备份是至关重要的环节。本项目通过 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 xiaoya2. 配置 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/alistkubectl apply -f 01-configmap.yaml3. 创建 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.yaml4. 构建自定义任务镜像
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-cron5. 部署 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: Filekubectl 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脚本功能:
等待 Docker 服务就绪。
使用 Secret 中的凭证登录 Harbor。
遍历镜像列表,拉取远程镜像并推送带
latest和时间戳的版本到 Harbor。清理临时镜像以减少磁盘占用。
四、验证与监控
查看 CronJob 状态:
kubectl -n xiaoya get cronjobs检查任务日志:
kubectl -n xiaoya logs <pod-name>验证 Harbor 镜像: 登录 Harbor 控制台,确认镜像已成功推送并包含时间戳标签。
总结与扩展
项目优势:
全自动化:定时任务减少人工干预。
灵活配置:通过
images.txt轻松扩展同步镜像列表。版本追溯:时间戳标签便于历史版本管理。
安全建议:
生产环境中建议使用 TLS 证书替代
insecure-registries。限制 Secret 的访问权限,避免敏感信息泄露。
扩展方向:
添加通知机制(如邮件/Slack)报告任务状态。
集成镜像扫描工具,提升安全性。
增加日志持久化功能,便于审计。
通过本项目,您可以快速搭建一个可靠的镜像同步系统,为容器化部署提供坚实的基础保障。
评论区