精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Harbor 結合 Traefik 的 HA 安裝配置

開源
Harbor 最核心的功能就是給 docker registry 添加上一層權限保護的功能,要實現這個功能,就需要我們在使用 docker login、pull、push 等命令的時候進行攔截,先進行一些權限相關的校驗,再進行操作。

[[402866]]

Harbor 是一個 CNCF 基金會托管的開源的可信的云原生 docker registry 項目,可以用于存儲、簽名、掃描鏡像內容,Harbor 通過添加一些常用的功能如安全性、身份權限管理等來擴展 docker registry 項目,此外還支持在 registry 之間復制鏡像,還提供更加高級的安全功能,如用戶管理、訪問控制和活動審計等,在新版本中還添加了 Helm 倉庫托管的支持。

Harbor 最核心的功能就是給 docker registry 添加上一層權限保護的功能,要實現這個功能,就需要我們在使用 docker login、pull、push 等命令的時候進行攔截,先進行一些權限相關的校驗,再進行操作,其實這一系列的操作 docker registry v2 就已經為我們提供了支持,v2 集成了一個安全認證的功能,將安全認證暴露給外部服務,讓外部服務去實現。

Harbor 認證原理

上面我們說了 docker registry v2 將安全認證暴露給了外部服務使用,那么是怎樣暴露的呢?我們在命令行中輸入 docker login https://registry.qikqiak.com 為例來為大家說明下認證流程:

  1. docker client 接收到用戶輸入的 docker login 命令,將命令轉化為調用 engine api 的 RegistryLogin 方法
  2. 在 RegistryLogin 方法中通過 http 調用 registry 服務中的 auth 方法
  3. 因為我們這里使用的是 v2 版本的服務,所以會調用 loginV2 方法,在 loginV2 方法中會進行 /v2/ 接口調用,該接口會對請求進行認證
  4. 此時的請求中并沒有包含 token 信息,認證會失敗,返回 401 錯誤,同時會在 header 中返回去哪里請求認證的服務器地址
  5. registry client 端收到上面的返回結果后,便會去返回的認證服務器那里進行認證請求,向認證服務器發送的請求的 header 中包含有加密的用戶名和密碼
  6. 認證服務器從 header 中獲取到加密的用戶名和密碼,這個時候就可以結合實際的認證系統進行認證了,比如從數據庫中查詢用戶認證信息或者對接 ldap 服務進行認證校驗
  7. 認證成功后,會返回一個 token 信息,client 端會拿著返回的 token 再次向 registry 服務發送請求,這次需要帶上得到的 token,請求驗證成功,返回狀態碼就是200了
  8. docker client 端接收到返回的200狀態碼,說明操作成功,在控制臺上打印 Login Succeeded 的信息 至此,整個登錄過程完成,整個過程可以用下面的流程圖來說明:

要完成上面的登錄認證過程有兩個關鍵點需要注意:怎樣讓 registry 服務知道服務認證地址?我們自己提供的認證服務生成的 token 為什么 registry 就能夠識別?

對于第一個問題,比較好解決,registry 服務本身就提供了一個配置文件,可以在啟動 registry 服務的配置文件中指定上認證服務地址即可,其中有如下這樣的一段配置信息:

  1. ...... 
  2. auth: 
  3.   token: 
  4.     realm: token-realm 
  5.     service: token-service 
  6.     issuer: registry-token-issuer 
  7.     rootcertbundle: /root/certs/bundle 
  8. ...... 

其中 realm 就可以用來指定一個認證服務的地址,下面我們可以看到 Harbor 中該配置的內容。

關于 registry 的配置,可以參考官方文檔:https://docs.docker.com/registry/configuration/

第二個問題,就是 registry 怎么能夠識別我們返回的 token 文件?如果按照 registry 的要求生成一個 token,是不是 registry 就可以識別了?所以我們需要在我們的認證服務器中按照 registry 的要求生成 token,而不是隨便亂生成。那么要怎么生成呢?我們可以在 docker registry 的源碼中可以看到 token 是通過 JWT(JSON Web Token) 來實現的,所以我們按照要求生成一個 JWT 的 token 就可以了。

對 golang 熟悉的同學可以去 clone 下 Harbor 的代碼查看下,Harbor 采用 beego 這個 web 開發框架,源碼閱讀起來不是特別困難。我們可以很容易的看到 Harbor 中關于上面我們講解的認證服務部分的實現方法。

安裝

Harbor 涉及的組件比較多,我們可以使用 Helm 來安裝一個高可用版本的 Harbor,也符合生產環境的部署方式。在安裝高可用的版本之前,我們需要如下先決條件:

  • Kubernetes 集群 1.10+ 版本
  • Helm 2.8.0+ 版本
  • 高可用的 Ingress 控制器
  • 高可用的 PostgreSQL 9.6+(Harbor 不進行數據庫 HA 的部署)
  • 高可用的 Redis 服務(Harbor 不處理)
  • 可以跨節點或外部對象存儲共享的 PVC

Harbor 的大部分組件都是無狀態的,所以我們可以簡單增加 Pod 的副本,保證組件盡量分布到多個節點上即可,在存儲層,需要我們自行提供高可用的 PostgreSQL、Redis 集群來存儲應用數據,以及存儲鏡像和 Helm Chart 的 PVC 或對象存儲。

首先添加 Chart 倉庫地址:

  1. # 添加 Chart 倉庫 
  2. helm repo add harbor https://helm.goharbor.io 
  3. # 更新 
  4. helm repo update 
  5. # 拉取1.6.2版本并解壓 
  6. helm pull harbor/harbor --untar --version 1.6.2 

在安裝 Harbor 的時候有很多可以配置的參數,可以在 harbor-helm 項目上進行查看,在安裝的時候我們可以通過 --set 指定參數或者 values.yaml 直接編輯 Values 文件即可:

Ingress 配置通過 expose.ingress.hosts.core 和 expose.ingress.hosts.notary

  • 外部 URL 通過配置 externalURL
  • 外部 PostgreSQL 通過配置 database.type 為 external,然后補充上 database.external 的信息。需要我們手動創建3個空的數據:Harbor core、Notary server 以及 Notary signer,Harbor 會在啟動時自動創建表結構
  • 外部 Redis 通過配置 redis.type 為 external,并填充 redis.external 部分的信息。Harbor 在 2.1.0 版本中引入了 redis 的 Sentinel 模式,你可以通過配置 sentinel_master_set 來開啟,host 地址可以設置為 : ,: ,: 。還可以參考文檔https://community.pivotal.io/s/article/How-to-setup-HAProxy-and-Redis-Sentinel-for-automatic-failover-between-Redis-Master-and-Slave-servers 在 Redis 前面配置一個 HAProxy 來暴露單個入口點。
  • 存儲,默認情況下需要一個默認的 StorageClass 在 K8S 集群中來自動生成 PV,用來存儲鏡像、Charts 和任務日志。如果你想指定 StorageClass,可以通過 persistence.persistentVolumeClaim.registry.storageClass、persistence.persistentVolumeClaim.chartmuseum.storageClass 以及 persistence.persistentVolumeClaim.jobservice.storageClass 進行配置,另外還需要將 accessMode 設置為 ReadWriteMany,確保 PV 可以跨不同節點進行共享存儲。此外我們還可以通過指定存在的 PVCs 來存儲數據,可以通過 existingClaim 進行配置。如果你沒有可以跨節點共享的 PVC,你可以使用外部存儲來存儲鏡像和 Chart(外部存儲支持:azure,gcs,s3 swift 和 oss),并將任務日志存儲在數據庫中。將設置為 persistence.imageChartStorage.type 為你要使用的值并填充相應部分并設置 jobservice.jobLogger 為 database
  • 副本:通過設置 portal.replicas,core.replicas,jobservice.replicas,registry.replicas,chartmuseum.replicas,notary.server.replicas 和 notary.signer.replicas 為 n(n> = 2)

比如這里我們將主域名配置為 harbor.k8s.local,通過前面的 NFS 的 StorageClass 來提供存儲(生產環境不建議使用 NFS),又因為前面我們在安裝 GitLab 的時候就已經單獨安裝了 postgresql 和 reids 兩個數據庫,所以我們也可以配置 Harbor 使用這兩個外置的數據庫,這樣可以降低資源的使用(我們可以認為這兩個數據庫都是 HA 模式)。但是使用外置的數據庫我們需要提前手動創建數據庫,比如我們這里使用的 GitLab 提供的數據庫,則進入該 Pod 創建 harbor、notary_server、notary_signer 這3個數據庫:

  1. $ kubectl get pods -n kube-ops -l name=postgresql 
  2. NAME                          READY   STATUS    RESTARTS   AGE 
  3. postgresql-566846fd86-9kps9   1/1     Running   1          2d 
  4. $ kubectl exec -it postgresql-566846fd86-9kps9 /bin/bash -n kube-ops 
  5. root@postgresql-566846fd86-9kps9:/var/lib/postgresql# sudo su - postgres 
  6. postgres@postgresql-566846fd86-9kps9:~$ psql 
  7. psql (12.3 (Ubuntu 12.3-1.pgdg18.04+1)) 
  8. Type "help" for help. 
  9.  
  10. postgres=# CREATE DATABASE harbor OWNER postgres;  # 創建 harbor 數據庫 
  11. CREATE DATABASE 
  12. postgres=# GRANT ALL PRIVILEGES ON DATABASE harbor to postgres;  # 授權給 postgres 用戶 
  13. GRANT 
  14. postgres=# GRANT ALL PRIVILEGES ON DATABASE harbor to gitlab;  # 授權給 gitlab 用戶 
  15. GRANT 
  16. # Todo: 用同樣的方式創建其他兩個數據庫:notary_server、notary_signer 
  17. ...... 
  18. postgres-# \q  # 退出 

數據庫準備過后,就可以使用我們自己定制的 values 文件來進行安裝了,完整的定制的 values 文件如下所示:

  1. values-prod.yaml 
  2. externalURL: https://harbor.k8s.local 
  3. harborAdminPassword: Harbor12345 
  4. logLevel: debug 
  5.  
  6. expose: 
  7.   type: ingress 
  8.   tls: 
  9.     enabled: true 
  10.   ingress: 
  11.     hosts: 
  12.       core: harbor.k8s.local 
  13.       notary: notary.k8s.local 
  14.     annotations: 
  15.       # 因為我們使用的 Traefik2.x 作為 Ingress 控制器 
  16.       kubernetes.io/ingress.class: traefik 
  17.       traefik.ingress.kubernetes.io/router.entrypoints: websecure 
  18.       traefik.ingress.kubernetes.io/router.tls: "true" 
  19.  
  20. persistence: 
  21.   enabled: true 
  22.   resourcePolicy: "keep" 
  23.   persistentVolumeClaim: 
  24.     registry: 
  25.       # 如果需要做高可用,多個副本的組件則需要使用支持 ReadWriteMany 的后端 
  26.       # 這里我們使用nfs,生產環境不建議使用nfs 
  27.       storageClass: "nfs-storage" 
  28.       # 如果是高可用的,多個副本組件需要使用 ReadWriteMany,默認為 ReadWriteOnce 
  29.       accessMode: ReadWriteMany 
  30.       size: 5Gi 
  31.     chartmuseum: 
  32.       storageClass: "nfs-storage" 
  33.       accessMode: ReadWriteMany 
  34.       size: 5Gi 
  35.     jobservice: 
  36.       storageClass: "nfs-storage" 
  37.       accessMode: ReadWriteMany 
  38.       size: 1Gi 
  39.     trivy: 
  40.       storageClass: "nfs-storage" 
  41.       accessMode: ReadWriteMany 
  42.       size: 2Gi 
  43.  
  44. database
  45.   type: external 
  46.   external: 
  47.     host: "postgresql.kube-ops.svc.cluster.local" 
  48.     port: "5432" 
  49.     username: "gitlab" 
  50.     password"passw0rd" 
  51.     coreDatabase: "harbor" 
  52.     notaryServerDatabase: "notary_server" 
  53.     notarySignerDatabase: "notary_signer" 
  54.  
  55. redis: 
  56.   type: external 
  57.   external: 
  58.     addr: "redis.kube-ops.svc.cluster.local:6379" 
  59.  
  60. # 默認為一個副本,如果要做高可用,只需要設置為 replicas >= 2 即可 
  61. portal: 
  62.   replicas: 1 
  63. core: 
  64.   replicas: 1 
  65. jobservice: 
  66.   replicas: 1 
  67. registry: 
  68.   replicas: 1 
  69. chartmuseum: 
  70.   replicas: 1 
  71. trivy: 
  72.   replicas: 1 
  73. notary: 
  74.   server: 
  75.     replicas: 1 
  76.   signer: 
  77.     replicas: 1 

由于我們這里使用的 Ingress 控制器是 traefik2.x 版本,在配置 Ingress 的時候,我們需要重新配置 annotations(如果你使用的是其他 Ingress 控制器,請參考具體的使用方式)。這些配置信息都是根據 Harbor 的 Chart 包默認的 values 值進行覆蓋的,現在我們直接安裝即可:

  1. $ cd harbor 
  2. $ helm upgrade --install harbor . -f values-prod.yaml -n kube-ops 
  3. Release "harbor" does not exist. Installing it now. 
  4. NAME: harbor 
  5. LAST DEPLOYED: Sat May 29 16:22:13 2021 
  6. NAMESPACE: kube-ops 
  7. STATUS: deployed 
  8. REVISION: 1 
  9. TEST SUITE: None 
  10. NOTES: 
  11. Please wait for several minutes for Harbor deployment to complete. 
  12. Then you should be able to visit the Harbor portal at https://harbor.k8s.local 
  13. For more details, please visit https://github.com/goharbor/harbor 

正常情況下隔一會兒就可以安裝成功了:

  1. $ helm ls -n kube-ops 
  2. NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION 
  3. harbor  kube-ops        1               2021-05-29 16:22:13.495394 +0800 CST    deployed        harbor-1.6.2    2.2.2 
  4. $ kubectl get pods -n kube-ops -l app=harbor 
  5. NAME                                           READY   STATUS    RESTARTS   AGE 
  6. harbor-harbor-chartmuseum-6996f677d4-dhkgd     1/1     Running   0          91s 
  7. harbor-harbor-core-84b8db479-rpwml             1/1     Running   0          91s 
  8. harbor-harbor-jobservice-5584dccd6-gpv79       1/1     Running   0          91s 
  9. harbor-harbor-notary-server-7d79b7d46d-dlgt7   1/1     Running   0          91s 
  10. harbor-harbor-notary-signer-69d8fdd476-7pt44   1/1     Running   0          91s 
  11. harbor-harbor-portal-559c4d4bfd-8x2pp          1/1     Running   0          91s 
  12. harbor-harbor-registry-758f67dbbb-nl729        2/2     Running   0          91s 
  13. harbor-harbor-trivy-0                          1/1     Running   0          50s 

安裝完成后,我們就可以將域名 harbor.k8s.local 解析到 Ingress Controller 所在的節點,我們這里使用的仍然是 Traefik,由于我們開啟了 KubernetesIngress 支持的,所以我們只需要將域名解析到 Traefik 的 Pod 所在節點即可,然后就可以通過該域名在瀏覽器中訪問了:

  1. $ kubectl get ingress -n kube-ops 
  2. NAME                           CLASS    HOSTS              ADDRESS   PORTS     AGE 
  3. harbor-harbor-ingress          <none>   harbor.k8s.local             80, 443   115s 
  4. harbor-harbor-ingress-notary   <none>   notary.k8s.local             80, 443   115s 

用戶名使用默認的 admin,密碼則是上面配置的默認 Harbor12345,需要注意的是要使用 https 進行訪問,否則登錄可能提示用戶名或密碼錯誤:

但是這里也需要注意的是,由于我們這里使用的 traefik2.x 版本的 Ingress 控制器,所以對于 Ingress 資源的支持不是很友好,由于我們添加了 traefik.ingress.kubernetes.io/router.tls: "true" 這個注解,導致我們的 http 服務又失效了,為了解決這個問題,我們這里手動來創建一個 http 版本的 Ingress 對象:

  1. apiVersion: extensions/v1beta1 
  2. kind: Ingress 
  3. metadata: 
  4.   annotations: 
  5.     meta.helm.sh/release-name: harbor 
  6.     meta.helm.sh/release-namespace: kube-ops 
  7.     traefik.ingress.kubernetes.io/router.entrypoints: web 
  8.     traefik.ingress.kubernetes.io/router.middlewares: kube-system-redirect-https@kubernetescrd 
  9.   labels: 
  10.     app: harbor 
  11.     app.kubernetes.io/managed-by: Helm 
  12.     chart: harbor 
  13.     heritage: Helm 
  14.     release: harbor 
  15.   name: harbor-harbor-ingress-http 
  16.   namespace: kube-ops 
  17. spec: 
  18.   rules: 
  19.   - host: harbor.k8s.local 
  20.     http: 
  21.       paths: 
  22.       - backend: 
  23.           serviceName: harbor-harbor-portal 
  24.           servicePort: 80 
  25.         path: / 
  26.         pathType: Prefix 
  27.       - backend: 
  28.           serviceName: harbor-harbor-core 
  29.           servicePort: 80 
  30.         path: /api 
  31.         pathType: Prefix 
  32.       - backend: 
  33.           serviceName: harbor-harbor-core 
  34.           servicePort: 80 
  35.         path: /service 
  36.         pathType: Prefix 
  37.       - backend: 
  38.           serviceName: harbor-harbor-core 
  39.           servicePort: 80 
  40.         path: /v2 
  41.         pathType: Prefix 
  42.       - backend: 
  43.           serviceName: harbor-harbor-core 
  44.           servicePort: 80 
  45.         path: /chartrepo 
  46.         pathType: Prefix 
  47.       - backend: 
  48.           serviceName: harbor-harbor-core 
  49.           servicePort: 80 
  50.         path: /c 
  51.         pathType: Prefix 
  52. --- 
  53. apiVersion: extensions/v1beta1 
  54. kind: Ingress 
  55. metadata: 
  56.   annotations: 
  57.     kubernetes.io/ingress.class: traefik 
  58.     meta.helm.sh/release-name: harbor 
  59.     meta.helm.sh/release-namespace: kube-ops 
  60.     traefik.ingress.kubernetes.io/router.entrypoints: web 
  61.     traefik.ingress.kubernetes.io/router.middlewares: kube-system-redirect-https@kubernetescrd 
  62.   labels: 
  63.     app: harbor 
  64.     app.kubernetes.io/managed-by: Helm 
  65.     chart: harbor 
  66.     heritage: Helm 
  67.     release: harbor 
  68.   name: harbor-harbor-ingress-notary-http 
  69.   namespace: kube-ops 
  70. spec: 
  71.   rules: 
  72.   - host: notary.k8s.local 
  73.     http: 
  74.       paths: 
  75.       - backend: 
  76.           serviceName: harbor-harbor-notary-server 
  77.           servicePort: 4443 
  78.         path: / 
  79.         pathType: Prefix 

為了讓能夠跳轉到 https,我們還需要創建如下所示的一個 Middleware(如果你使用的是其他 Ingress 控制器,請參考具體的使用方式):

  1. apiVersion: traefik.containo.us/v1alpha1 
  2. kind: Middleware 
  3. metadata: 
  4.   name: redirect-https 
  5.   namespace: kube-system 
  6. spec: 
  7.   redirectScheme: 
  8.     scheme: https 

需要注意的是在 Ingress 的 annotations 中配置中間件的格式為 -redirect-https@kubernetescrd。

登錄過后即可進入 Harbor 的 Dashboard 頁面:

我們可以看到有很多功能,默認情況下會有一個名叫 library 的項目,該項目默認是公開訪問權限的,進入項目可以看到里面還有 Helm Chart 包的管理,可以手動在這里上傳,也可以對該項目里面的鏡像進行一些其他配置。

推送鏡像

現在我們來測試下使用 docker cli 來進行 pull/push 鏡像,直接使用 docker login 命令登錄:

  1. $ docker login harbor.k8s.local 
  2. Username: admin 
  3. Password
  4. Error response from daemon: Get https://harbor.k8s.local/v2/: x509: certificate signed by unknown authority 

可以看到會登錄失敗,這是因為在使用 docker login 登錄的時候會使用 https 的服務,而我們這里是自簽名的證書,所以就報錯了,我們可以將使用到的 CA 證書文件復制到 /etc/docker/certs.d/harbor.k8s.local 目錄下面來解決這個問題(如果該目錄不存在,則創建它)。ca.crt 這個證書文件我們可以通過 Ingress 中使用的 Secret 資源對象來提供:

  1. $ kubectl get secret harbor-harbor-ingress -n kube-ops -o yaml 
  2. apiVersion: v1 
  3. data: 
  4.   ca.crt: <ca.crt> 
  5.   tls.crt: <tls.crt> 
  6.   tls.key: <tls.key
  7. kind: Secret 
  8. metadata: 
  9.   ...... 
  10.   name: harbor-harbor-ingress 
  11.   namespace: kube-ops 
  12.   resourceVersion: "450460" 
  13.   selfLink: /api/v1/namespaces/kube-ops/secrets/harbor-harbor-ingress 
  14.   uid: 0c44425c-8258-407a-a0a7-1c7e50d29404 
  15. type: kubernetes.io/tls 

其中 data 區域中 ca.crt 對應的值就是我們需要證書,不過需要注意還需要做一個 base64 的解碼,這樣證書配置上以后就可以正常訪問了。

不過由于上面的方法較為繁瑣,所以一般情況下面我們在使用 docker cli 的時候是在 docker 啟動參數后面添加一個 --insecure-registry 參數來忽略證書的校驗的,在 docker 啟動配置文件 /usr/lib/systemd/system/docker.service 中修改ExecStart的啟動參數:

  1. ExecStart=/usr/bin/dockerd --insecure-registry harbor.k8s.local 

或者在 Docker Daemon 的配置文件中添加:

  1. $ cat /etc/docker/daemon.json 
  2.   "insecure-registries" : [ 
  3.     "harbor.k8s.local" 
  4.   ], 
  5.   "registry-mirrors" : [ 
  6.     "https://ot2k4d59.mirror.aliyuncs.com/" 
  7.   ] 

然后保存重啟 docker,再使用 docker cli 就沒有任何問題了:

  1. $ docker login harbor.k8s.local 
  2. Username: admin 
  3. Password
  4. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. 
  5. Configure a credential helper to remove this warning. See 
  6. https://docs.docker.com/engine/reference/commandline/login/#credentials-store 
  7.  
  8. Login Succeeded 

比如我們本地現在有一個名為 busybox:1.28.4 的鏡像,現在我們想要將該鏡像推送到我們的私有倉庫中去,應該怎樣操作呢?首先我們需要給該鏡像重新打一個具有 harbor.k8s.local 前綴的鏡像,然后推送的時候就可以識別到推送到哪個鏡像倉庫:

  1. $ docker tag busybox:1.28.4 harbor.k8s.local/library/busybox:1.28.4 
  2. $ docker push harbor.k8s.local/library/busybox:1.28.4 
  3. The push refers to repository [harbor.k8s.local/library/busybox] 
  4. 432b65032b94: Pushed 
  5. 1.28.4: digest: sha256:74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335 size: 527 

推送完成后,我們就可以在 Portal 頁面上看到這個鏡像的信息了:

鏡像 push 成功,同樣可以測試下 pull:

  1. $ docker rmi harbor.k8s.local/library/busybox:1.28.4 
  2. Untagged: harbor.k8s.local/library/busybox:1.28.4 
  3. Untagged: harbor.k8s.local/library/busybox@sha256:74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335 
  4. $ docker rmi busybox:1.28.4 
  5. Untagged: busybox:1.28.4 
  6. Untagged: busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47 
  7. Deleted: sha256:8c811b4aec35f259572d0f79207bc0678df4c736eeec50bc9fec37ed936a472a 
  8. Deleted: sha256:432b65032b9466b4dadcc5c7b11701e71d21c18400aae946b101ad16be62333a 
  9. $ docker pull harbor.k8s.local/library/busybox:1.28.4 
  10. 1.28.4: Pulling from library/busybox 
  11. 07a152489297: Pull complete 
  12. Digest: sha256:74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335 
  13. Status: Downloaded newer image for harbor.k8s.local/library/busybox:1.28.4 
  14. harbor.k8s.local/library/busybox:1.28.4 
  15.  
  16. $ docker images |grep busybox 
  17. harbor.k8s.local/library/busybox                       1.28.4     8c811b4aec35   3 years ago     1.15MB 

到這里證明上面我們的私有 docker 倉庫搭建成功了,大家可以嘗試去創建一個私有的項目,然后創建一個新的用戶,使用這個用戶來進行 pull/push 鏡像,Harbor 還具有其他的一些功能,比如鏡像復制,Helm Chart 包托管等等,大家可以自行測試,感受下 Harbor 和官方自帶的 registry 倉庫的差別。

 

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

2023-08-11 08:49:49

2011-04-02 15:26:51

Cacti安裝

2011-03-30 15:05:40

MRTG安裝

2011-11-08 21:55:58

MRTG 配置

2011-03-25 13:40:28

Cacti安裝配置

2011-04-02 15:26:58

Cacti安裝

2011-04-02 15:17:59

2011-04-02 14:21:46

MRTG安裝

2011-04-01 15:00:35

2011-02-23 10:43:17

2011-03-02 10:41:41

Vsftpd安裝

2011-02-25 17:48:52

2010-06-07 11:22:28

2011-03-24 13:00:30

2011-03-25 15:01:44

Cacti安裝

2011-02-25 17:19:09

Pureftpd安裝

2011-03-11 16:42:38

Ubuntu安裝LAMP

2013-11-28 09:44:00

2011-09-02 14:07:59

2011-03-11 12:57:30

CentosLAMP
點贊
收藏

51CTO技術棧公眾號

日本一区视频在线| 亚洲国产日韩精品在线| 亚州欧美一区三区三区在线| 丰满人妻一区二区三区四区| 欧美日韩伦理| 欧美视频一区二区三区| 2025韩国大尺度电影| av老司机久久| 亚洲精品护士| 偷拍欧美精品| 欧美激情在线观看视频免费| 国产精品视频久久久久| 在线看的片片片免费| 日韩欧美另类中文字幕| 亚洲va国产天堂va久久en| 另类视频在线观看+1080p| 亚洲国产av一区二区三区| 98精品久久久久久久| 日韩三级视频中文字幕| 国产免费黄色av| 在线观看av黄网站永久| 国产高清精品久久久久| 81精品国产乱码久久久久久| 免费成人深夜蜜桃视频| 日韩中文不卡| 亚洲无码久久久久久久| 欧美1区2区3区| 亚洲欧美制服中文字幕| aaaaa黄色片| 欧美男女交配| 中文字幕在线观看不卡视频| 黄色小网站91| 国产精品嫩草影院精东| 男女精品视频| 欧美美女18p| a级在线免费观看| 精品一区二区三区四区五区| 日韩欧美有码在线| 日产精品久久久久久久蜜臀| 91高清在线视频| 99国产麻豆精品| 91亚洲午夜在线| 秋霞av一区二区三区| 狠狠综合久久av一区二区老牛| 亚洲一区二区福利| 999精品免费视频| 精品国产第一国产综合精品| 欧美在线看片a免费观看| 日本免费a视频| 黄网站在线免费| 久久久久9999亚洲精品| 国产精品swag| 国产区精品在线| 男男视频亚洲欧美| 国产97在线播放| 天堂中文字幕在线观看| 亚洲网址在线| 欧美另类高清videos| 青青青视频在线播放| 自拍偷拍一区| 国产午夜精品麻豆| 性久久久久久久久久久| 91亚洲无吗| 制服丝袜亚洲网站| 日本激情综合网| 日韩欧美少妇| 日本电影亚洲天堂一区| 国产主播在线看| 国产在线天堂www网在线观看| 洋洋av久久久久久久一区| 99热这里只有精品7| 国产精品久久久一区二区三区| 亚洲精品国产91| 综合亚洲自拍| 日韩国产高清污视频在线观看| 亚洲av无码专区在线播放中文| 久久av网站| 9191国产精品| 性鲍视频在线观看| 国产在线一区不卡| 91精选在线观看| 91热视频在线观看| 中文久久电影小说| 精品动漫一区二区三区在线观看| 亚洲av午夜精品一区二区三区| 久久国产精品美女| 日韩视频在线永久播放| 韩国三级hd中文字幕有哪些| 视频精品一区二区三区| 精品捆绑美女sm三区| 捆绑裸体绳奴bdsm亚洲| 福利电影一区| 精品偷拍一区二区三区在线看| 中文字幕5566| 日韩理论电影大全| 久久久精品国产亚洲| 久久久久久久久久一区二区三区 | 亚洲一区美女视频在线观看免费| 国产视频在线观看免费| 丁香婷婷综合网| 精品日产一区2区三区黄免费| 免费成人av电影| 国产精品久久影院| 国产天堂视频在线观看| 色偷偷色偷偷色偷偷在线视频| 日本久久一区二区| 伊人色在线视频| 伦理一区二区三区| 色偷偷综合社区| 免费中文字幕在线观看| 亚洲一区中文| 成人黄色影片在线| 欧美一级淫片免费视频魅影视频| 国产丝袜美腿一区二区三区| 国产成人免费高清视频| 亚洲精华液一区二区三区| 欧美日韩国产区一| 欧美熟妇精品一区二区蜜桃视频| 欧美精品系列| 久久久久这里只有精品| 中文字幕av网站| 成人国产电影网| 亚洲精品自在在线观看| av老司机免费在线| 欧美日韩三级一区| 在线免费观看a级片| 天天综合一区| 日韩av观看网址| av在线免费在线观看| 久久久久久久久蜜桃| 欧美成人精品免费| 国产精品一区二区三区av| 亚洲精品久久久久久久久| 黄色裸体一级片| 国产精品外国| 亚洲综合国产精品| 伊人免费在线| 日本久久一区二区| 国产一卡二卡三卡四卡| 午夜精品毛片| 国产精品激情av电影在线观看| 欧美熟妇另类久久久久久不卡| 亚洲欧美日韩一区| 激情视频免费网站| 国产一区二区三区四区大秀| 午夜精品在线视频| 亚洲精品一区二区三区不卡| 亚洲免费观看高清完整版在线| 91激情视频在线| 日韩aaa久久蜜桃av| 欧美黑人极品猛少妇色xxxxx| 中文字幕在线一| 久久久久久久电影| 国产欧美高清在线| 欧美电影在线观看免费| 欧美激情伊人电影| 国产成人精品一区二区无码呦| 国产精品视频一区二区三区不卡| 999香蕉视频| 在线日韩网站| 日本不卡视频在线播放| 四虎影视精品成人| 精品国产999| www国产视频| 91久久视频| 狠狠色噜噜狠狠狠狠色吗综合| av在线加勒比| 亚洲成人黄色在线观看| 日本五十熟hd丰满| 91在线小视频| 色婷婷综合久久久久中文字幕| 中文字幕在线看视频国产欧美在线看完整 | 欧美伊人久久久久久午夜久久久久| 中文字幕在线永久| 影音国产精品| 国产亚洲精品美女久久久m| 91白丝在线| 亚洲精品456在线播放狼人| 91av在线免费视频| 久久久久久电影| 免费黄色特级片| 日本电影一区二区| 成人免费高清完整版在线观看| 在线xxxx| 亚洲精品在线观看视频| 天天综合网久久综合网| 91在线云播放| 一区二区三区韩国| 99国产精品免费视频观看| 亚洲一区二区三区xxx视频| 在线三级中文| 亚洲精品99久久久久中文字幕| 依依成人综合网| 欧美国产日韩在线观看| 亚洲综合20p| 亚洲大胆视频| 日韩啊v在线| 久久9999免费视频| 青草热久免费精品视频 | 三级在线观看视频| 一道本无吗dⅴd在线播放一区 | 国产在线观看免费播放| 一区二区久久| 亚洲精品国产一区| 亚洲一区二区三区日本久久九| 97视频免费在线观看| 在线看av的网址| 精品欧美一区二区久久| 91午夜精品亚洲一区二区三区| 国产精品久久久久久久裸模| 亚洲少妇中文字幕| 日韩成人午夜电影| 青草网在线观看| 国内精品久久久久久久久电影网| 成人两性免费视频| 性国裸体高清亚洲| 欧美成年人网站| 牛牛澡牛牛爽一区二区| 91精品国产综合久久精品麻豆| 国产小视频在线免费观看| 国产精品传媒视频| 在线 丝袜 欧美 日韩 制服| 韩国毛片一区二区三区| 狠狠爱免费视频| 欧美一区不卡| 日本精品视频一区| 国产乱人伦丫前精品视频| 国产精品视频网| 精品极品在线| 欧美成人一区二区三区电影| 国产精品一级伦理| 日韩电影中文字幕在线观看| av中文字幕免费在线观看| 欧美中文字幕一区二区三区亚洲| 精品少妇久久久| 中文字幕一区日韩精品欧美| 成年人网站免费在线观看| 国产69精品久久久久777| 色综合色综合色综合色综合| 亚洲女人av| 韩日视频在线观看| 综合五月婷婷| 亚洲欧美精品| 欧美日韩中文字幕一区二区三区| 精品一区二区三区自拍图片区 | 福利视频一区二区三区| www.成人在线.com| 国产精品私拍pans大尺度在线 | 成人免费播放器| 1024精品久久久久久久久| 视频一区二区三| 久久不见久久见国语| 久久99精品久久久久久久久久| 欧美视频精品全部免费观看| 成人www视频在线观看| 色猫猫成人app| 日韩av色综合| 欧美成人精品三级网站| 日韩美女写真福利在线观看| 91精品论坛| 97精品国产97久久久久久免费 | 一级做a爰片久久毛片| 午夜精品福利一区二区蜜股av| 国产性一乱一性一伧一色| 亚洲黄色小视频| 久久高清无码视频| 亚洲一卡二卡三卡四卡五卡| 久久中文字幕无码| 亚洲图片欧美一区| 国产污视频在线看| 天涯成人国产亚洲精品一区av| 国产无遮挡aaa片爽爽| 性久久久久久久久| 亚洲精品中文字幕有码专区| 91精品国产高清91久久久久久 | 成人自拍视频网| 国产成人jvid在线播放| 欧美动物xxx| 国产精品影片在线观看| 9999精品免费视频| 99热在线播放| 日韩欧美四区| 日韩欧美一区二区三区四区| 欧美r级电影| 亚洲高潮无码久久| 亚洲精选91| 宅男噜噜噜66国产免费观看| 久久精品国产亚洲一区二区三区| 伊人色在线视频| 成人网男人的天堂| 欧美特级黄色录像| 中文字幕一区视频| 国产女人水真多18毛片18精品 | a级片一区二区| 亚洲午夜极品| 999香蕉视频| 国产在线视频不卡二| 国产性猛交96| 久久婷婷成人综合色| 一本一本久久a久久| 一区二区三区欧美视频| 国产性猛交╳xxx乱大交| 欧美午夜不卡视频| 国产成人久久精品77777综合| 亚洲国产成人精品女人久久久| 精品av中文字幕在线毛片| 久久精品国产清自在天天线| 99re6在线精品视频免费播放| 国产精品电影网站| 99精品在免费线中文字幕网站一区 | 国产黄在线免费观看| 欧美日韩国产一区在线| 91麻豆视频在线观看| 日韩女优视频免费观看| 国产在线观看免费网站| 九九九久久国产免费| 日韩高清成人| av日韩中文字幕| 国产不卡一二三区| 欧美久久久久久久久久久久久久| 日韩精品一卡二卡三卡四卡无卡| 一个人看的视频www| 国产偷国产偷亚洲高清人白洁| 波多野结衣爱爱视频| 91国偷自产一区二区使用方法| 亚洲黄色在线免费观看| 色哟哟网站入口亚洲精品| 免费高潮视频95在线观看网站| 热99在线视频| 成人看片黄a免费看视频| 国产欧美一区二区三区另类精品 | 日本一级淫片色费放| 欧美日本在线观看| 欧美在线一卡| 国内精品免费午夜毛片| 国产一区二区久久久久| 图片区小说区区亚洲五月| 99日韩精品| 欧美午夜精品一区二区| 中文字幕一区在线观看| 最近中文在线观看| 亚洲品质视频自拍网| 91九色porn在线资源| 91精品久久香蕉国产线看观看| 99精品在线| 91日韩视频在线观看| 国产视频一区二区三区在线观看| 五月婷婷中文字幕| 亚洲国产精品久久久久久| 制服丝袜在线播放| 91色p视频在线| 91亚洲国产高清| av观看免费在线| 91在线国产福利| 精品少妇theporn| 日韩三级视频中文字幕| 成年人网站在线| 成人动漫网站在线观看| 91嫩草亚洲精品| 第四色婷婷基地| 中文字幕欧美区| 制服丝袜在线一区| 中文字幕日韩欧美| 国产三级一区| 少妇精品久久久久久久久久| 日韩va亚洲va欧美va久久| 51妺嘿嘿午夜福利| 欧美三级中文字幕| 日本视频在线免费观看| 国产在线视频2019最新视频| 国产精品久久天天影视| www.污污视频| 亚洲欧美日韩在线| 亚洲AV无码乱码国产精品牛牛| 欧美大片在线看免费观看| 91免费精品国偷自产在线在线| 国产免费内射又粗又爽密桃视频| 国产精品一区二区在线播放| 九九视频在线观看| 亚洲福利在线播放| 在线观看网站免费入口在线观看国内 | 成人精品在线看| 亚洲精品一区二三区不卡| 香蕉成人av| 中文字幕人成一区| 国产成人一区在线| 久久夜色精品亚洲| 亚洲区中文字幕| 少妇高潮一区二区三区99| 激情五月五月婷婷| fc2成人免费人成在线观看播放| 亚洲男人的天堂在线视频| 亚洲欧洲在线视频| 亚洲欧美久久精品| bt天堂新版中文在线地址| 久久先锋影音av| 国产免费黄色大片| 2019亚洲男人天堂| 色乱码一区二区三区网站| 亚洲欧洲日韩综合|