成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Gitlab CI 在 Kubernetes 中的 Docker 緩存

運維 系統運維
我們運行一個獨立的 Docker DIND 容器,構建容器的所有 Docker CLI 都連接到這個一個 Docker 守護進程上,這個時候我們將 Docker layer 層進行持久化,也就起到了緩存的作用了。

[[434251]]

前面我們有文章介紹過如何在 Kubernetes 集群中使用 GitLab CI 來實現 CI/CD,在構建鏡像的環節我們基本上都是使用的 Docker On Docker 的模式,這是因為 Kubernetes 集群使用的是 Docker 這種容器運行時,所以我們可以將宿主機的 docker.sock 文件掛載到容器中構建鏡像,而最近我們在使用 Kubernetes 1.22.X 版本后將容器運行時更改為了 Containerd,這樣節點上沒有可用的 Docker 服務了,這個時候就需要更改構建鏡像的模式了,當然要實現構建鏡像的方式有很多,我們這里還是選擇使用 Docker 來構建我們的 Docker 鏡像,也就是使用 Docker IN Docker 的模式。

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

這個問題的解決方法非常簡單,與其為每個 Pod 運行一個 Docker DIND 服務的 sidecar 容器,不如讓我們運行一個獨立的 Docker DIND 容器,構建容器的所有 Docker CLI 都連接到這個一個 Docker 守護進程上,這個時候我們將 Docker layer 層進行持久化,也就起到了緩存的作用了。

首先創建一個 PVC 來存儲 Docker 的持久化數據,為了性能考慮,這里我們使用的是一個 Local PV:

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

然后使用 Deployment 部署一個 Docker DIND 服務:

  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/  # 指定一個鏡像加速器地址 
  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 # 需要設置成特權模式 
  37.       volumes: 
  38.         - name: docker-dind-data-vol 
  39.           persistentVolumeClaim: 
  40.             claimName: docker-dind-data 

然后創建一個 Service 以方便構建的 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 服務部署完成后,我們就可以在 Gitlab CI 中使用這個守護程序來構建鏡像了,如下所示:

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

由于我們緩存了 Docker layer 層,這個時候構建的速度會明顯提升。最后隨著鏡像的大量構建會產生很多鏡像數據,我們可以寫一個 Cronjob 用來定時清除緩存:

  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 

 

責任編輯:姜華 來源: k8s技術圈
相關推薦

2025-04-29 02:10:00

2023-08-18 10:24:52

GitLabCI 流水線

2021-12-21 15:17:53

Kubernetes緩存Linux

2020-10-21 14:10:28

工具測試開發

2021-05-18 08:00:00

Kubernetes容器進程

2023-05-04 16:03:50

KubernetesCI/CD集成

2023-04-02 21:49:10

開源Tekton

2020-10-12 07:00:00

JenkinsDevOps測試工具

2023-03-13 14:46:32

CI/CD工具軟件開發

2023-05-09 16:20:54

藍綠部署CI/CD 管道自動化部署

2020-11-26 08:46:52

Spinnaker

2023-04-25 08:01:23

JavaQuarkusKubernetes

2023-04-18 08:17:11

GitLab持續集成

2023-04-27 08:18:25

GitLab開源

2021-10-26 10:28:41

開發架構Kubernetes

2020-11-06 16:50:43

工具GitLab CICD

2020-12-31 11:28:09

GitLabCICD

2016-07-29 15:49:58

DockerKubernetesMongoDB

2021-07-19 06:02:56

DockerGitLab 14.0開源

2024-08-07 10:14:35

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区免费在线 | 欧美日韩中文字幕在线 | 欧美精品在线视频 | 国产一区h | 黄色国产视频 | 精品国产一区二区三区av片 | 一区中文字幕 | 亚洲一区二区 | 精品永久 | 狠狠入ady亚洲精品经典电影 | 精品一区二区在线视频 | 国产高清视频一区二区 | 国产精品揄拍一区二区久久国内亚洲精 | 精品一区二区三区在线观看 | 欧美成人精品激情在线观看 | 久久里面有精品 | 国产精品一区二区在线播放 | 日韩中文字幕在线 | 欧美日韩亚洲视频 | 高清国产一区二区 | 精品中文字幕一区 | 成年人免费网站 | 亚洲国产精品区 | 亚洲国产二区 | 国产这里只有精品 | 99久久精品一区二区成人 | 日本精品一区二区三区视频 | 久久99视频 | 人人干天天干 | 天天插日日操 | 日本一区二区三区在线观看 | 全免一级毛片 | 亚洲成人精品一区二区 | 亚洲激情一区二区三区 | 日日骚av | 亚洲激情专区 | av国产精品毛片一区二区小说 | 精品久久久久久久久久久久久久久久久 | 亚洲精品久久久一区二区三区 | 国产精品视频观看 | 国产成人网 |