一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - 編程技術(shù) - Gitlab CI 在 Kubernetes 中的 Docker 緩存

Gitlab CI 在 Kubernetes 中的 Docker 緩存

2021-11-10 23:02k8s技術(shù)圈陽明 編程技術(shù)

我們運(yùn)行一個(gè)獨(dú)立的 Docker DIND 容器,構(gòu)建容器的所有 Docker CLI 都連接到這個(gè)一個(gè) Docker 守護(hù)進(jìn)程上,這個(gè)時(shí)候我們將 Docker layer 層進(jìn)行持久化,也就起到了緩存的作用了。

Gitlab CI 在 Kubernetes 中的 Docker 緩存

前面我們有文章介紹過如何在 Kubernetes 集群中使用 GitLab CI 來實(shí)現(xiàn) CI/CD,在構(gòu)建鏡像的環(huán)節(jié)我們基本上都是使用的 Docker On Docker 的模式,這是因?yàn)?Kubernetes 集群使用的是 Docker 這種容器運(yùn)行時(shí),所以我們可以將宿主機(jī)的 docker.sock 文件掛載到容器中構(gòu)建鏡像,而最近我們?cè)谑褂?Kubernetes 1.22.X 版本后將容器運(yùn)行時(shí)更改為了 Containerd,這樣節(jié)點(diǎn)上沒有可用的 Docker 服務(wù)了,這個(gè)時(shí)候就需要更改構(gòu)建鏡像的模式了,當(dāng)然要實(shí)現(xiàn)構(gòu)建鏡像的方式有很多,我們這里還是選擇使用 Docker 來構(gòu)建我們的 Docker 鏡像,也就是使用 Docker IN Docker 的模式。

在每次構(gòu)建鏡像的時(shí)候,GitLab Runner 都會(huì)啟動(dòng)一個(gè)包含3個(gè)容器的 Pod,其中一個(gè)就是運(yùn)行 Docker 守護(hù)進(jìn)程的 Docker DIND 容器,構(gòu)建的容器會(huì)去連接到運(yùn)行在同一個(gè) Pod 上的 Docker 守護(hù)進(jìn)程,由于 Pod 中的所有容器共享同一個(gè) network namespace,構(gòu)建鏡像的 Docker CLI 能夠通過 localhost 直接連接到 Docker 守護(hù)進(jìn)程進(jìn)行構(gòu)建。但是這種方式最大的一個(gè)問題是每次構(gòu)建都是啟動(dòng)一個(gè)全新的 Docker 守護(hù)進(jìn)程,造成沒有緩存 Docker layer 層,這會(huì)顯著增加我們的構(gòu)建時(shí)間。

這個(gè)問題的解決方法非常簡單,與其為每個(gè) Pod 運(yùn)行一個(gè) Docker DIND 服務(wù)的 sidecar 容器,不如讓我們運(yùn)行一個(gè)獨(dú)立的 Docker DIND 容器,構(gòu)建容器的所有 Docker CLI 都連接到這個(gè)一個(gè) Docker 守護(hù)進(jìn)程上,這個(gè)時(shí)候我們將 Docker layer 層進(jìn)行持久化,也就起到了緩存的作用了。

首先創(chuàng)建一個(gè) PVC 來存儲(chǔ) Docker 的持久化數(shù)據(jù),為了性能考慮,這里我們使用的是一個(gè) Local PV:

  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4. name: local-volume
  5. provisioner: kubernetes.io/no-provisioner
  6. reclaimPolicy: Delete
  7. volumeBindingMode: WaitForFirstConsumer
  8. ---
  9. apiVersion: v1
  10. kind: PersistentVolume
  11. metadata:
  12. name: docker-pv
  13. spec:
  14. capacity:
  15. storage: 5Gi
  16. accessModes:
  17. - ReadWriteOnce
  18. persistentVolumeReclaimPolicy: Retain
  19. storageClassName: local-volume
  20. local:
  21. path: /mnt/k8s/docker # 數(shù)據(jù)存儲(chǔ)的目錄
  22. nodeAffinity:
  23. required:
  24. nodeSelectorTerms:
  25. - matchExpressions:
  26. - key: kubernetes.io/hostname
  27. operator: In
  28. values:
  29. - node1 # 運(yùn)行在node1節(jié)點(diǎn)
  30. ---
  31. apiVersion: v1
  32. kind: PersistentVolumeClaim
  33. metadata:
  34. labels:
  35. app: docker-dind
  36. name: docker-dind-data
  37. namespace: kube-ops
  38. spec:
  39. accessModes:
  40. - ReadWriteOnce
  41. storageClassName: local-volume
  42. resources:
  43. requests:
  44. storage: 5Gi

然后使用 Deployment 部署一個(gè) Docker DIND 服務(wù):

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: docker-dind
  5. namespace: kube-ops
  6. labels:
  7. app: docker-dind
  8. spec:
  9. selector:
  10. matchLabels:
  11. app: docker-dind
  12. template:
  13. metadata:
  14. labels:
  15. app: docker-dind
  16. spec:
  17. containers:
  18. - image: docker:dind
  19. name: docker-dind
  20. args:
  21. - --registry-mirror=https://ot2k4d59.mirror.aliyuncs.com/ # 指定一個(gè)鏡像加速器地址
  22. env:
  23. - name: DOCKER_DRIVER
  24. value: overlay2
  25. - name: DOCKER_HOST
  26. value: tcp://0.0.0.0:2375
  27. - name: DOCKER_TLS_CERTDIR # 禁用 TLS
  28. value: ""
  29. volumeMounts:
  30. - name: docker-dind-data-vol # 持久化docker根目錄
  31. mountPath: /var/lib/docker/
  32. ports:
  33. - name: daemon-port
  34. containerPort: 2375
  35. securityContext:
  36. privileged: true # 需要設(shè)置成特權(quán)模式
  37. volumes:
  38. - name: docker-dind-data-vol
  39. persistentVolumeClaim:
  40. claimName: docker-dind-data

然后創(chuàng)建一個(gè) Service 以方便構(gòu)建的 Docker CLI 與其連接:

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: docker-dind
  5. namespace: kube-ops
  6. labels:
  7. app: docker-dind
  8. spec:
  9. ports:
  10. - port: 2375
  11. targetPort: 2375
  12. selector:
  13. app: docker-dind

將 Docker DIND 服務(wù)部署完成后,我們就可以在 Gitlab CI 中使用這個(gè)守護(hù)程序來構(gòu)建鏡像了,如下所示:

  1. tages:
  2. - image
  3. build_image:
  4. stage: image
  5. image: docker:latest
  6. variables:
  7. DOCKER_HOST: tcp://docker-dind:2375 # 通過 service dns 形式連接 docker dind 服務(wù)
  8. script:
  9. - docker info
  10. - docker build -t xxxx .
  11. - docker push xxxx
  12. only:
  13. - tags

由于我們緩存了 Docker layer 層,這個(gè)時(shí)候構(gòu)建的速度會(huì)明顯提升。最后隨著鏡像的大量構(gòu)建會(huì)產(chǎn)生很多鏡像數(shù)據(jù),我們可以寫一個(gè) Cronjob 用來定時(shí)清除緩存:

  1. apiVersion: batch/v1
  2. kind: CronJob
  3. metadata:
  4. name: docker-dind-clear-cache
  5. namespace: kube-ops
  6. spec:
  7. schedule: 0 0 * * 0 # 每周清理一次
  8. jobTemplate:
  9. metadata:
  10. labels:
  11. app: docker-dind
  12. name: docker-dind-clear-cache
  13. spec:
  14. template:
  15. spec:
  16. restartPolicy: OnFailure
  17. containers:
  18. - name: clear-cache
  19. image: docker:latest
  20. command:
  21. - docker
  22. - system
  23. - prune
  24. - -af
  25. env:
  26. - name: DOCKER_HOST
  27. value: tcp://docker-dind:2375

原文鏈接:https://mp.weixin.qq.com/s/rn2xm8YMCW_6JoPljyto9g

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99久久精彩视频 | 亚洲精品九色在线网站 | 国产乱子伦真实china | 91频视| 大香人蕉免费视频75 | 欧美日韩在线一区二区三区 | 丝瓜秋葵番茄绿巨人在线观看 | 亚洲精品中文 | 天天干天天爽天天操 | 99青青青精品视频在线 | 色综合久久日韩国产 | 国产一区二区视频在线 | 日本aa大片在线播放免费看 | 国产性片在线观看 | 香蕉在线精品一区二区 | 精品综合久久久久久88小说 | 色愉拍亚洲偷自拍 | 九哥草逼网 | 国产人成77777视频网站 | 色呦呦在线免费观看 | 91国产在线观看 | 免费全看男女拍拍拍的视频 | 疯狂激吻添下边小说 | 久久精品99国产精品日本 | 蜜桃88av | 国产一区二区三区水野朝阳 | 免费的网址 | 金莲你下面好紧夹得我好爽 | 欧美亚洲欧美 | 国产农村一一级特黄毛片 | 国产卡一卡二卡三卡四 | 波多野结衣中文丝袜字幕 | 99久久精品国产免看国产一区 | 小草观看免费高清视频 | 亚洲成人影院在线观看 | 成人福利网 | 久久久无码精品亚洲A片软件 | 91视频免费观看网站 | 视频免费视频观看网站 | 亚洲欧美午夜 | 五月天婷婷网亚洲综合在线 |