Docker

在多個系統資料庫上託管 docker 映像,但以相同的方式引用它們,例如在 k8s 部署中

  • November 25, 2020

自從我開始使用 docker 之後,我就有一個問題,到目前為止我還沒有得到一個好的答案。

假設我有一個指定 k8s 部署的 .yaml 文件。我們正在本地建構伺服器上建構我們的 docker 鏡像,它們被推送到本地系統資料庫,例如 registry.mycompany.com,它只能在我們本地公司網路中訪問。因此,在我的 .yaml 中,我將使用“image:registry.mycompany.com/myrepo/myimage:1.0”引用該圖像。

現在,當我在本地 k8s 集群上部署它時,它可以正常工作,因為域名得到解析並且可以拉取圖像。現在我想在任何云中部署相同的內容。好吧,它不會工作,因為系統資料庫不可用。如果我想在我的一個客戶位置部署相同的 .yaml 也是如此,他們也有充分的理由無法訪問我的本地系統資料庫。

這種事情一般是怎麼解決的?現在,我在我的客戶或云帳戶中設置另一個系統資料庫,重新標記我的所有圖像並將它們推送到該系統資料庫,並且當我在客戶位置或云中部署時更改 .yamls 中的所有圖像引用。因此,必須維護大量 99% 相同的文件集。那不是它應該如何工作嗎?

我的“願望”是我可以只指定圖像名稱和標籤“myimage:1.0”,如果他能找到圖像並拉取它,k8s 集群只會檢查所有可用的系統資料庫。但我也知道沒有“知名系統資料庫列表”,您可以在映像名稱中指定系統資料庫或將其省略,然後將查詢 docker hub。但是,如果我可以指定只是

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: MyDeployment
spec:
 replicas: 1
 template:
   metadata:
     labels:
       app: myimage
   spec:
     containers:
       - name: myimage
         image: 'myimage:1.0'
         ports: []

和系統資料庫列表:

registries:
   - registry.mycompany.com
   - registry.cloud.com
   - registry.localcustomer.com

但沒有那樣的事,對吧?

我能想到的唯一其他解決方案是將所有內容建構到 helm 圖表中,使圖像的第一部分引用一個變數並將系統資料庫作為變數傳遞給圖表。

歡迎任何想法和資訊。提前致謝 :)

有一些解決方法可以達到您在問題中描述的結果:

  • 頭盔圖
  • 自定義
  • 登記處

頭盔圖

正如你在問題中所說:

我能想到的唯一其他解決方案是將所有內容建構到 helm 圖表中,使圖像的第一部分引用一個變數並將系統資料庫作為變數傳遞給圖表。

從主觀上講,這是為Deployment.

它的範例可能如下所示:

deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: ubuntu
spec:
 selector:
   matchLabels:
     app: ubuntu
 replicas: 1
 template:
   metadata:
     labels:
       app: ubuntu
   spec:
     containers:
     - name: "{{ .Values.image.repo }}{{ .Values.image.name }}:{{ .Values.image.tag }}"  
       image: 
       command:
       - sleep 
       - "infinity"

a 中的值template可以通過以下方式提供:

  • values.yaml文件:
image: 
 repo: gcr.io/ # <-- only an example
 name: ubuntu
 tag: latest
  • $ helm命令如:

$ helm install ubuntu . --set=image.repo=eu.gcr.io/

一個提示!

指定--set具有現有值的參數values.yaml將覆蓋它(在此範例中)!


自定義

您還可以使用它們各自的儲存庫和圖像kustomize來“渲染” 。Deployment

在下面的部落格文章中有關於如何完成的相當廣泛的解釋:

這種解決方案的範例(通過以下連結)可以歸結為:

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: sl-demo-app
spec:
 selector:
   matchLabels:
     app: sl-demo-app
 template:
   metadata:
     labels:
       app: sl-demo-app
   spec:
     containers:
     - name: app
       image: foo/bar:latest
       ports:
       - name: http
         containerPort: 8080
         protocol: TCP

custom-image.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: sl-demo-app
spec:
 template:
   spec:
     containers:
       - name: app # IMPORTANT 
         image: eu.gcr.io/ubuntu:latest

kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
 - deployment.yaml

patchesStrategicMerge:
- custom-image.yaml

執行上述範例後:

  • kustomize build

您應該看到圖像的變化:

  • 從:image: foo/bar:latest
  • 到:image: eu.gcr.io/ubuntu:latest

您還可以查看此 StackOverflow 答案:


登記處

您還可以查看系統資料庫項目,例如Harbor

你可以在他們的 github 頁面上閱讀:

Harbor 是一個開源可信的雲原生系統資料庫項目,用於儲存、簽名和掃描內容。Harbor 通過添加使用者通常需要的功能(例如安全性、身份和管理)來擴展開源 Docker Distribution。

特徵

  • 雲原生註冊中心:Harbor 支持容器鏡像和 Helm 圖表,可作為雲原生環境(如容器執行時和編排平台)的註冊中心。
  • 基於角色的訪問控制:使用者通過“項目”訪問不同的儲存庫,並且使用者可以對項目下的圖像或 Helm 圖表具有不同的權限。
  • 基於策略的複制:可以使用過濾器(儲存庫、標籤和標籤)基於策略在多個系統資料庫實例之間複製(同步)圖像和圖表。如果遇到任何錯誤,Harbor 會自動重試複製。這可用於輔助負載平衡、實現高可用性並促進混合和多雲場景中的多數據中心部署。

Github.com:Goharbor:港口

有了它,您可以:


除此之外,您還可以查看 Docker Registry 代理,如下所示:


其他資源:

引用自:https://serverfault.com/questions/1043707