精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

在线免费观看日本欧美爱情大片| 91在线播放网站| 日韩一级不卡| 国产一区二区三区久久精品 | 久久久999| 色偷偷噜噜噜亚洲男人| 亚洲性图第一页| 日韩国产激情| 亚洲综合激情另类小说区| 久久精品日韩精品| 一级黄在线观看| 亚洲少妇在线| 久久91精品国产91久久久| 97人妻精品一区二区三区免| 四虎地址8848精品| 欧美三级免费观看| 公共露出暴露狂另类av| 欧美精品a∨在线观看不卡| 国产一区在线观看麻豆| 热99精品只有里视频精品| 午夜爽爽爽男女免费观看| 日韩动漫一区| 日韩免费性生活视频播放| www.色就是色| 中文字幕在线视频久| 亚洲精品成人悠悠色影视| 亚洲欧洲成视频免费观看| 国产成人美女视频| 伊人久久精品一区二区三区| 亚洲一区二区欧美日韩| 中文字幕一区二区三区有限公司 | 亚洲男女一区二区三区| 欧美午夜精品久久久久免费视 | 国产.精品.日韩.另类.中文.在线.播放| 最新国产精品亚洲| 波多野结衣 在线| 4438五月综合| 欧美日韩一级二级三级| 亚洲日本精品| 免费99精品国产自在在线| 一本色道久久88精品综合| 美女日批在线观看| 日韩免费在线电影| 欧美亚洲综合在线| 妞干网在线免费视频| av成人福利| 一区二区三区在线播| 中文字幕av日韩精品| 99青草视频在线播放视| 久久久91精品国产一区二区精品 | 亚洲h动漫在线| 亚洲r级在线观看| a片在线免费观看| 日韩精品91亚洲二区在线观看| 97视频免费看| 在线观看亚洲欧美| 蘑菇福利视频一区播放| 久久久久久久久一| 欧美肥老妇视频| 欧美日韩黄色网| 欧美在线免费| 久久精品一二三| 97久久精品午夜一区二区| 国产日韩在线观看一区| 国产在线国偷精品产拍免费yy| 成人亚洲激情网| 国产av一区二区三区精品| 国产黑丝在线一区二区三区| 成人av男人的天堂| 午夜性色福利影院| 久久综合国产精品| 日韩动漫在线观看| 午夜免费视频在线国产| 亚洲精选视频在线| 成人精品视频在线播放| 天堂资源在线| 欧美色综合影院| 国产精品探花在线播放| 91麻豆精品国产91久久久久推荐资源| 亚洲国内精品视频| 国产精品天天干| 欧美黑人一区| 欧美性受xxxx| 伊人av在线播放| 任你躁在线精品免费| 国产一区二区三区网站| 在线视频这里只有精品| 午夜精品福利影院| 在线电影中文日韩| 欧美人与禽zozzo禽性配| 91久久综合| 国产精品麻豆va在线播放| 日韩精品久久一区| 麻豆app在线观看| 国产精品萝li| 久久久久久久香蕉| 美女18一级毛片一品久道久久综合| 在线观看视频一区二区欧美日韩| 冲田杏梨av在线| 中文字幕久久精品一区二区| 亚洲综合色婷婷| 国语对白做受xxxxx在线中国| 亚洲精品一区二区在线播放∴| 精品国产网站在线观看| 一级黄色片网址| 韩国亚洲精品| 国产精品日韩专区| 色窝窝无码一区二区三区| 中文字幕欧美日韩一区| 国产真人做爰毛片视频直播| 91成人抖音| 色欧美片视频在线观看在线视频| 午夜啪啪小视频| 中文字幕精品影院| 久久99久久亚洲国产| 中文字幕免费高清网站| 国产精品66部| 色视频一区二区三区| 成人高潮aa毛片免费| 欧美美女喷水视频| 奇米影视四色在线| 久一视频在线观看| 亚州国产精品| 欧美成人午夜视频| 在线观看毛片网站| 久久嫩草精品久久久精品| 青青青在线观看视频| 先锋影音一区二区| 在线免费看av不卡| 成人video亚洲精品| 免费观看久久久4p| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 国产伦精品一区二区三区免费 | 国产精品久久久久久久久久久久午夜片 | 国产成人av资源| 天天爱天天做天天操| 免费在线观看av片| 日本乱人伦aⅴ精品| 大地资源二中文在线影视观看 | 最好看的中文字幕久久| 性刺激的欧美三级视频| 久久综合亚洲| 日产日韩在线亚洲欧美| 在线观看xxx| 岛国av一区二区在线在线观看| 最新版天堂资源在线| 偷拍精品福利视频导航| 久久久久久久久久久免费| 精品人妻少妇嫩草av无码专区| 成人免费一区二区三区视频| 亚洲一区二区三区观看| 91亚洲自偷观看高清| 国产精品永久在线| 精品视频在线一区二区| 69久久99精品久久久久婷婷| aaaaa黄色片| 午夜日韩福利| 国产精品二区在线观看| 欧洲性视频在线播放| 精品国产欧美一区二区| 色婷婷在线观看视频| 美国欧美日韩国产在线播放| 国产精品区一区| 啊啊啊久久久| 亚洲欧美激情视频| 久久这里只有精品9| 国产在线更新| 国产喷白浆一区二区三区| 在线视频91| 精品91福利视频| 高清一区二区三区四区五区| 日韩欧美在线番号| 欧美亚一区二区| 午夜精品一区二区三区视频| 国产成人精品免费| 日本www在线视频| 精品国产午夜| 亚洲最大的av网站| 黄色激情在线播放| 在线观看日韩av| www.成人在线观看| 一本一道久久a久久精品综合蜜臀| 微拍福利一区二区| 国产又粗又猛又爽又黄91精品| heyzo亚洲| 天天综合一区| 九九热久久66| www欧美在线观看| 欧美一区二区影院| 成人日韩欧美| 亚洲男人7777| 国产jzjzjz丝袜老师水多| 天天综合网天天综合色 | 中文字幕一区二区三区乱码在线 | 亚欧在线免费观看| 在线精品小视频| 欧美精品欧美精品系列c| 亚洲美免无码中文字幕在线| 日韩高清在线观看一区二区| 亚洲乱码一区二区| 91丨porny丨在线中文| 婷婷夜色潮精品综合在线| 青青草原亚洲| 国产女人18毛片18精品| 高潮白浆女日韩av免费看| 老熟妇高潮一区二区三区| 99久久国产综合精品女不卡| 国产成人美女视频| 久久精品官网| 久久久久久久香蕉| 91久久电影| 日本精品一区二区三区高清 久久| 亚洲成人黄色| 国产美女精品免费电影| 成人性生活视频| 欧美日本精品在线| 免费黄色在线观看| 亚洲人成电影在线播放| 日批视频免费播放| 欧美一区二区三区日韩| 中文无码av一区二区三区| 亚洲国产日韩精品| 亚洲欧美日韩网站| 丝袜亚洲精品中文字幕一区| 分分操这里只有精品| 91精品啪在线观看国产81旧版| 欧美国产视频在线观看| 久久精品国产亚洲5555| 7777精品久久久大香线蕉小说| 成人精品动漫| 国产精品久久久久久久av大片| 亚洲欧美小说色综合小说一区| 久久久久久尹人网香蕉| 亚洲色图美国十次| 欧美久久精品一级黑人c片| 91在线品视觉盛宴免费| 国产午夜精品免费一区二区三区| 欧美偷拍视频| 亚洲男子天堂网| 三级理论午夜在线观看| 日韩精品视频在线观看免费| 亚洲 国产 欧美 日韩| 精品成人一区二区三区| 刘亦菲毛片一区二区三区| 日韩欧美一二区| 国内毛片毛片毛片毛片| 日韩美女视频在线| 亚洲精品综合久久| 亚洲韩国青草视频| 美国一级片在线免费观看视频 | 色综合久久综合中文综合网| 天天爽夜夜爽人人爽| 色婷婷精品大在线视频| 国产一区免费看| 欧美日韩激情一区二区三区| 精国产品一区二区三区a片| 亚洲视频 欧洲视频| 日本欧美色综合网站免费| 国产精品毛片久久久久久久av| 欧美午夜一区二区三区免费大片| 中日韩av在线| 日韩一级大片在线观看| 日本韩国免费观看| 亚洲免费视频在线观看| yiren22综合网成人| www.xxxx欧美| 欧美日韩影视| 在线观看国产精品淫| 欧美极品另类| 久久久久久久久中文字幕| 免费在线观看日韩视频| 亚洲伊人网站| 国产喷水theporn| 国产一区二区三区蝌蚪| 久久国产劲爆∧v内射| 99久久精品国产毛片| 91资源在线播放| 亚洲免费三区一区二区| 日韩欧美亚洲视频| 在线日韩av片| 国产国语亲子伦亲子| 亚洲精品视频在线播放| 日本电影在线观看网站| 久久久久久久网站| 日韩欧美一区二区三区在线观看| 91亚洲永久免费精品| 日韩av三区| 一区二区免费在线观看| 樱桃成人精品视频在线播放| caoporn超碰97| 国产91精品精华液一区二区三区 | 91麻豆福利精品推荐| 欧美性生给视频| 五月婷婷激情综合网| 影音先锋黄色网址| 亚洲国产日韩欧美在线动漫| 永久免费av在线| 97精品视频在线播放| 国产精品久久乐| 韩国成人一区| 在线免费观看日本欧美爱情大片| 日本精品久久久久中文字幕| 国产精品综合在线视频| 免费看黄色的视频| 亚洲图片欧美一区| 最近中文字幕免费在线观看| 亚洲国产成人av在线| 久操视频在线播放| 日韩av免费看| 久草在线综合| 色哺乳xxxxhd奶水米仓惠香| 日韩vs国产vs欧美| 久久人人妻人人人人妻性色av| 亚洲乱码精品一二三四区日韩在线| 国产成人a v| 日韩av一区二区在线| 在线观看三级视频| 国产精品尤物福利片在线观看| 色综合中文网| 欧美三级一级片| 成人av综合一区| 少妇影院在线观看| 欧美日本在线一区| 成人jjav| 国产精品久久久久久av福利软件| 婷婷亚洲精品| 国内外成人激情视频| 成人午夜免费视频| 欧美精品色哟哟| 日韩欧美你懂的| 91福利国产在线观看菠萝蜜| 91丝袜美腿美女视频网站| 欧洲三级视频| 香蕉视频网站入口| 久久精品综合网| 国产一级淫片a视频免费观看| 日韩成人中文电影| sm在线播放| 久久国产精品久久精品国产| 亚洲精品激情| 亚洲av网址在线| 色综合网色综合| 国产高清视频在线观看| 国产精品九九九| 久久一区二区中文字幕| 国产无色aaa| 亚洲日本一区二区| a级片免费视频| 欧美日韩国产成人| 都市激情亚洲欧美| 国产美女网站在线观看| 91麻豆国产精品久久| 国产又粗又猛又黄视频| 这里只有精品丝袜| **精品中文字幕一区二区三区| 2022中文字幕| 成人aa视频在线观看| 中文字幕在线字幕中文| 亚洲美女自拍视频| 777午夜精品电影免费看| 亚州欧美一区三区三区在线| 九九九久久久精品| 免费在线观看黄色av| 亚洲国产成人精品女人久久久| 亚洲精品一区| 亚洲国产一区二区三区在线播 | 国产亚洲欧洲一区高清在线观看| 波多野结衣在线观看一区| 久久精品久久久久久| 视频一区日韩精品| 成人免费aaa| 国产精品美女久久久久久2018| va视频在线观看| 5278欧美一区二区三区| 欧美丝袜一区| 韩国三级hd中文字幕有哪些| 欧美日韩国产精品一区| av大片在线看| 国产成人精品福利一区二区三区| 美女国产一区| 中文字幕在线有码| 精品偷拍各种wc美女嘘嘘| 成人午夜在线| 男女超爽视频免费播放| 国产精品系列在线| 亚洲男女视频在线观看| 国产成人精品久久| 欧美日日夜夜| 日韩福利视频在线| 亚洲午夜免费电影| 成年人在线观看网站| 成人资源av| 美女视频免费一区| 日本在线小视频| 日韩视频在线免费观看| 欧美大胆视频| 亚洲在线观看网站| 色999日韩国产欧美一区二区| 欧美性猛片xxxxx免费中国 | 欧美丰满少妇人妻精品|