Gitlab CI 在 Kubernetes 中的 Docker 缓存

网友投稿 524 2023-03-28

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

Gitlab CI 在 Kubernetes 中的 Docker 缓存

前面我们有文章介绍过如何在 Kubernetes 集群中使用 GitLab CI 来实现 CI/CD,在构建镜像的环节我们基本上都是使用的 Docker On Docker 的模式,这是因为 Kubernetes 集群使用的是 Docker 这种容器运行时,所以我们可以将宿主机的 docker.sock 文件挂载到容器中构建镜像,而最近我们在使用 Kubernetes 1.22.X 版本后将容器运行时更改为了 Containerd,这样节点上没有可用的 Docker 服务了,这个时候就需要更改构建镜像的模式了,当然要实现构建镜像的方式有很多,我们这里还是选择使用 Docker 来构建我们的 Docker 镜像,也就是使用 Docker IN Docker 的模式。

这个问题的解决方法非常简单,与其为每个 Pod 运行一个 Docker DIND 服务的 sidecar 容器,不如让我们运行一个独立的 Docker DIND 容器,构建容器的所有 Docker CLI 都连接到这个一个 Docker 守护进程上,这个时候我们将 Docker layer 层进行持久化,也就起到了缓存的作用了。

首先创建一个 PVC 来存储 Docker 的持久化数据,为了性能考虑,这里我们使用的是一个 Local PV:

apiVersion: storage.k8s.io/v1 kind: StorageClass metadata:   name: local-volume provisioner: kubernetes.io/no-provisioner reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer  --- apiVersion: v1 kind: PersistentVolume metadata:   name: docker-pv spec:   capacity:     storage: 5Gi   accessModes:   - ReadWriteOnce   persistentVolumeReclaimPolicy: Retain   storageClassName: local-volume   local:     path: /mnt/k8s/docker  # 数据存储的目录   nodeAffinity:     required:       nodeSelectorTerms:       - matchExpressions:         - key: kubernetes.io/hostname           operator: In           values:           - node1  # 运行在node1节点 --- apiVersion: v1 kind: PersistentVolumeClaim metadata:   labels:     app: docker-dind   name: docker-dind-data   namespace: kube-ops spec:   accessModes:     - ReadWriteOnce   storageClassName: local-volume   resources:     requests:       storage: 5Gi

然后使用 Deployment 部署一个 Docker DIND 服务:

然后创建一个 Service 以方便构建的 Docker CLI 与其连接:

apiVersion: v1 kind: Service metadata:   name: docker-dind   namespace: kube-ops   labels:     app: docker-dind spec:   ports:     - port: 2375       targetPort: 2375   selector:     app: docker-dind

将 Docker DIND 服务部署完成后,我们就可以在 Gitlab CI 中使用这个守护程序来构建镜像了,如下所示:

tages:   - image  build_image:   stage: image   image: docker:latest   variables:     DOCKER_HOST: tcp://docker-dind:2375  # 通过 service dns 形式连接 docker dind 服务   script:     - docker info     - docker build -t xxxx .     - docker push xxxx   only:     - tags

由于我们缓存了 Docker layer 层,这个时候构建的速度会明显提升。最后随着镜像的大量构建会产生很多镜像数据,我们可以写一个 Cronjob 用来定时清除缓存:

上一篇:提高效率 用好IT运维服务管理中的知识管理
下一篇:如何规范化电子政务建设、运维和管理
相关文章

 发表评论

暂时没有评论,来抢沙发吧~