• Kubernetes实战(四)-部署docker harbor私有仓库


    1 Docker原生私有仓库Registry

    1.1 原生私有仓库Registry概述

    Docker的仓库主要分两类:

    • 私有仓库
    • 公有仓库

    共有仓库只要在官方注册用户,登录即可使用。但对于仓库的使用,企业还是会有自己的专属镜像,所以私有库的搭建也是很有必要的存在。

    对于原生的仓库,Docker提供了Registry,它能帮助我们组建属于自己的私有库,但是缺点也比较明显,就是难管理,无法进行复杂的操作

    1.2 原生私有仓库Registry部署

    1)拉取相关的镜像

    1. $ docker pull registry:2.7.1
    2. $ docker pull joxit/docker-registry-ui:latest   # 非必须,简单的界面

    2)进行 Registry的相关yml文件配置(docker-compose
    其中有两个文件需要进行配置,一个为config.yml,另一个为docker-compose.yml

    1. $ mkdir -p /etc/docker/registry
    2. $ cat > /etc/docker/registry/config.yml <<EOF
    3. version: 0.1
    4. log:
    5. accesslog:
    6. disabled: true
    7. level: debug
    8. formatter: text
    9. fields:
    10. service: registry
    11. environment: staging
    12. storage:
    13. delete:
    14. enabled: true
    15. cache:
    16. blobdescriptor: inmemory
    17. filesystem:
    18. rootdirectory: /var/lib/registry
    19. http:
    20. addr: :5000
    21. headers:
    22. X-Content-Type-Options: [nosniff]
    23. Access-Control-Allow-Origin: ['http://192.168.80.200']
    24. Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']
    25. Access-Control-Allow-Headers: ['Authorization', 'Accept']
    26. Access-Control-Max-Age: [1728000]
    27. Access-Control-Allow-Credentials: [true]
    28. Access-Control-Expose-Headers: ['Docker-Content-Digest']
    29. http2:
    30. disabled: false
    31. health:
    32. storagedriver:
    33. enabled: true
    34. interval: 10s
    35. threshold: 3
    36. EOF
    37. $ cat > docker-compose.yaml <<EOF
    38. version: '2.0'
    39. services:
    40. registry:
    41. image: registry:2.7.1
    42. ports:
    43. - 5000:5000
    44. volumes:
    45. - /opt/registry:/var/lib/registry
    46. - /etc/docker/registry/config.yml:/etc/docker/registry/config.yml
    47. ui:
    48. image: joxit/docker-registry-ui:latest
    49. ports:
    50. - 80:80
    51. environment:
    52. - REGISTRY_TITLE=My Private Docker Registry
    53. - REGISTRY_URL=http://192.168.80.200:5000
    54. - SINGLE_REGISTRY=true
    55. depends_on:
    56. - registry
    57. EOF
    58. $ docker-compose up -d

    3)镜像推送 

    1. $ docker tag nginx 192.168.73.105:5000/nginx:latest
    2. $ docker push 192.168.73.105:5000/nginx:latest
    3. The push refers to repository [192.168.80.200:5000/nginx]
    4. Get "https://192.168.73.105:5000/v2/": http: server gave HTTP response to HTTPS client

    # 开启非安全认证

    1.  vim /etc/docker/daemon.json
    2. {
    3.   "insecure-registries" : [ "192.168.73.105:5000" ]
    4. }
    $ systemctl restart docker

    #通web进入http://192.168.73.105。

    2 Docker Habor

    2.1 Harbor介绍

    Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。

    Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理 UI 、基于角色的访问控制(Role Based AccessControl) 、AD/LDAP 集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。

    Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 docker-compose 来对它进行部署。用于部署 Harbor 的 docker-compose 模板位于 harbor/docker-compose.yml。

    2.2 Habor的特性

    • 基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限。
    • 基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步)。
    • 支持 LDAP/AD:Harbor 可以集成企业内部已有的 AD/LDAP(类似数据库的一张表),用于对已经存在的用户认证和管理。
    • 镜像删除和垃圾回收:镜像可以被删除,也可以回收镜像占用的空间。
    • 图形化用户界面:用户可以通过浏览器来浏览,搜索镜像仓库以及对项目进行管理。
    • 审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
    • 支持 RESTful API:RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。
    • Harbor和docker registry的关系:Harbor实质上是对docker registry做了封装,扩展了自己的业务模板。

    2.3 Habor的构成

    Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六个组件。

    • Proxy: 是一个 nginx 的前端代理,Harbor 的 Registry、UI、Token 服务等组件,都处在 nginx 反向代理后边。 该代理将来自浏览器、docker clients 的请求转发到后端不同的服务上。
    • Registry: 负责储存 Docker 镜像,并处理 Docker push/pull 命令。由于要对用户进行访问控制,即不同用户对 Docker 镜像 有不同的读写权限,Registry 会指向一个 Token 服务,强制用户的每次 Docker pull/push 请求都要携带一个合法的 Token, Registry 会通过公钥对 Token 进行解密验证。
    • Core services: Harbor的核心功能,主要提供以下3个服务:
      • UI(harbor-ui): 提供图形化界面,帮助用户管理 Registry 上的镜像(image), 并对用户进行授权。
      • WebHook:为了及时获取Registry 上image 状态变化的情况,在Registry 上配置 Webhook,把状态变化传递给 UI 模块。
      • Token 服务:负责根据用户权限给每个 Docker push/pull 命令签发 Token。Docker 客户端向 Registry 服务发起的请求, 如果不包含 Token,会被重定向到 Token 服务,获得 Token 后再重新向 Registry 进行请求。
    • Database(harbor-db):为core services提供数据库服务,负责储存用户权限、审计日志、Docker 镜像分组信息等数据。
    • Job services: 主要用于镜像复制,本地镜像可以被同步到远程 Harbor 实例上。
    • Log collector(harbor-log): 负责收集其他组件的日志到一个地方。


    Harbor 的每个组件都是以 Docker 容器的形式构建的,因此,使用 Docker Compose 来对它进行部署。
    总共分为7个容器运行,通过在docker-compose.yml所在目录中执行 docker-compose ps 命令来查看, 名称分别为:

    • nginx
    • harbor-jobservice
    • harbor-ui
    • harbor-db
    • harbor-adminserver
    • registry
    • harbor-log

    其中 harbor-adminserver 主要是作为一个后端的配置数据管理,并没有太多的其他功能。harbor-ui 所要操作的所有数据都通过 harbor-adminserver 这样一个数据配置管理中心来完成。

    2.4 Harbor部署

    2.4.1 环境/软件准备

    本次演示环境,我是在虚拟机 Linux RedHat 7.2 上操作,以下是安装的软件及版本:

    • Docker:version 18.03.1-ce
    • Docker-compose: version v2.8.0
    • Harbor: version 1.9.4

    2.4.1 部署 Docker-Compose 服务

    1. //下载或者上传 Docker-Compose
    2. $ curl -L https://github.com/docker/compose/releases/download/2.8.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    3. $ chmod +x /usr/local/bin/docker-compose
    4. $ docker-compose -v

    2.4.2 部署 Harbor 服务 

    1. #下载或上传 Harbor 安装程序
    2. Harbor的压缩包下载地址:https://github.com/goharbor/harbor/releases
    3. $ wget http://harbor.orientsoft.cn/harbor-1.9.4/harbor-offline-installer-v1.2.2.tgz
    4. $ tar zxvf harbor-offline-installer-v1.9.4.tgz -C /usr/local/
    5. #修改harbor安装的配置文件
    6. $ vim /usr/local/harbor/harbor.cfg
    7. --5行--修改,设置为Harbor服务器的IP地址或者域名
    8. $ hostname = 192.168.73.107
    9. --59行--指定管理员的初始密码,默认的用户名/密码是admin/Harbor12345
    10. $ harbor_admin_password = Harbor12345

    2.4.3 启动 Harbor

    1. $ cd /usr/local/harbor/
    2. 在配置好了 harbor.cfg 之后,执行
    3. $ ./prepare #为 harbor 启动的容器生成一些必要的文件(环境)
    4. $ ./install.sh # 以 pull 镜像并启动容器

    2.4.4 查看 Harbor 启动镜像 

    1. $ cd /usr/local/harbor/
    2. $ docker-compose ps

    harbor启动的容器如下:

    1. $ docker ps -a
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. 7e0a81e4f771 hello-world "/hello" 5 days ago Exited (0) 5 days ago optimistic_turing
    4. 1503c467884b goharbor/nginx-photon:v1.9.4 "nginx -g 'daemon of…" 5 days ago Up 4 days (healthy) 0.0.0.0:80->8080/tcp nginx
    5. fa7e63632d4b goharbor/harbor-jobservice:v1.9.4 "/harbor/harbor_jobs…" 5 days ago Up 4 days (healthy) harbor-jobservice
    6. bcf82d24539a goharbor/harbor-core:v1.9.4 "/harbor/harbor_core" 5 days ago Up 4 days (healthy) harbor-core
    7. 06d5fffe7f3a goharbor/harbor-db:v1.9.4 "/docker-entrypoint.…" 5 days ago Up 4 days (healthy) 5432/tcp harbor-db
    8. e976d7cff566 goharbor/harbor-registryctl:v1.9.4 "/harbor/start.sh" 5 days ago Up 4 days (healthy) registryctl
    9. 667d6e93ba8d goharbor/registry-photon:v2.7.1-patch-2819-2553-v1.9.4 "/entrypoint.sh /etc…" 5 days ago Up 4 days (healthy) 5000/tcp registry
    10. 9ae54d9ce227 goharbor/redis-photon:v1.9.4 "redis-server /etc/r…" 5 days ago Up 4 days (healthy) 6379/tcp redis
    11. ba1edf954ecd goharbor/harbor-portal:v1.9.4 "nginx -g 'daemon of…" 5 days ago Up 4 days (healthy) 8080/tcp harbor-portal
    12. dce6228055c2 goharbor/harbor-log:v1.9.4 "/bin/sh -c /usr/loc…" 5 days ago Up 4 days (healthy) 127.0.0.1:1514->10514/tcp harbor-log

    浏览器访问:http://192.168.73.107 登录 Harbor WEB UI 界面 

    2.4.5 参数详解

    关于 Harbor.cfg 配置文件中有两类参数:

    • 所需参数
    • 可选参数
    2.4.5.1 所需参数

    这些参数需要在配置文件 Harbor.cfg 中设置。如果用户更新它们并运行 install.sh 脚本重新安装 Harbor, 参数将生效。具体参数如下:

    • hostname:用于访问用户界面和 register 服务。它应该是目标机器的 IP 地址或完全限定的域名(FQDN),例如 192.168.73.107 或 hub.kgc.cn。不要使用 localhost 或 127.0.0.1 为主机名。
    • ui_url_protocol:(http 或 https,默认为 http)用于访问 UI 和令牌/通知服务的协议。如果公证处于启用状态,则此参数必须为 https。
    • max_job_workers:镜像复制作业线程。
    • db_password:用于db_auth 的MySQL数据库root 用户的密码。
    • customize_crt:该属性可设置为打开或关闭,默认打开。打开此属性时,准备脚本创建私钥和根证书,用于生成/验证注册表令牌。当由外部来源提供密钥和根证书时,将此属性设置为 off。
    • ssl_cert:SSL 证书的路径,仅当协议设置为 https 时才应用。
    • secretkey_path:用于在复制策略中加密或解密远程 register 密码的密钥路径。
       
    2.4.5.2 可选参数

    这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动 Harbor 后在 Web UI 上进行更新。如果进入 Harbor.cfg,只会在第一次启动 Harbor 时生效,随后对这些参数的更新,Harbor.cfg 将被忽略。

    注意:如果选择通过 UI 设置这些参数,请确保在启动 Harbor 后立即执行此操作。具体来说,必须在注册或在 Harbor 中创建任何新用户之前设置所需的 auth_mode。当系统中有用户时(除了默认的 admin 用户), auth_mode 不能被修改。

    具体参数如下:

    • Email:Harbor 需要该参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能时才启用。请注意,在默认情况下 SSL 连接时没有启用。如果 SMTP 服务器需要 SSL,但不支持 STARTTLS,那么应该通过设置启用 SSL email_ssl = TRUE。
    • harbor_admin_password:管理员的初始密码,只在 Harbor 第一次启动时生效。之后, 此设置将被忽略,并且应在 UI 中设置管理员的密码。请注意,默认的用户名/密码是admin/Harbor12345。
    • auth_mode:使用的认证类型,默认情况下,它是 db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为 ldap_auth。
    • self_registration:启用/禁用用户注册功能。禁用时,新用户只能由 Admin 用户创建,只有管理员用户可以在 Harbor 中创建新用户。注意:当 auth_mode 设置为 ldap_auth 时,自注册功能将始终处于禁用状态,并且该标志被忽略
    • Token_expiration:由令牌服务创建的令牌的到期时间(分钟),默认为 30 分钟。 
    • project_creation_restriction:用于控制哪些用户有权创建项目的标志。默认情况下,每个人都可以创建一个项目。 如果将其值设置为“adminonly”,那么只有 admin 可以创建项目。 
    • verify_remote_cert:打开或关闭,默认打开。此标志决定了当Harbor与远程 register 实例通信时是否验证 SSL/TLS 证书。 将此属性设置为 off 将绕过 SSL/TLS 验证,这在远程实例具有自签名或不可信证书时经常使用。

     
    默认情况下,Harbor 将镜像存储在本地文件系统上。在生产环境中,可以考虑 使用其他存储后端而不是本地文件系统,如 S3、Openstack Swif、Ceph 等对象存储。但需要更新 common/templates/registry/config.yml 文件。

    Harbor的默认镜像存储路径在 /data/registry 目录下,映射到docker容器里面的 /storage 目录下。
    这个参数是在 docker-compose.yml 中指定的,在 docker-compose up -d 运行之前修改。
    如果希望将 Docker 镜像存储到其他的磁盘路径,可以修改这个参数。

    2.4.6 harbor服务管理

    1. ##以下命令均在在habor的配置目录下运行
    2. $ docker-compose up -d      #启动
    3. $ docker-compose stop       #停止
    4. $ docker-compose restart    #重新启动

    2.4.7 harbor配置修改过程

    1)停服;

    1. $ cd /usr/local/harbor
    2. $ docker-compose down -v

    2)修改配置;

    $ vim harbor.cfg        

    3)配置加载

    $ ./prepare

    4)启动;

    $ docker-compose up -d
    1. 使用 docker-compose 管理 Harbor 时,必须在与 docker-compose.yml 相同的目录中运行。
    2. cd /usr/local/harbor
    3. docker-compose down -v
    4. vim harbor.cfg #只能修改可选参数
    5. ./prepare
    6. docker-compose up -d
    7. //如果有以下报错,需要开启防火墙 firewalld 服务解决
    8. Creating network "harbor_harbor" with the default driver
    9. ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b53c314f45e8 -j RETURN: iptables: No chain/target/match by that name.
    10. (exit status 1))
    11. systemctl restart firewalld.service
    12. docker-compose up -d

    2.5 harbor使用

    2.5.1 登录

    访问http://10.12.5.60,登录harbor。

    默认的管理员用户名和密码是 admin/Harbor12345。

    2.5.2 新建项目

    项目名称:小写字符、数字和._-组成,且至少一个字符,并以数字或字符开头。

    访问级别:默认不选择,选择则表示当前项目公开后,任何人都有此项目下镜像的读权限,命令行用户不需要执行"docker login"就可以拉取此项目下的镜像。

    存储数量:-1表示不设上限。

    存储容量:-1表示无上限。

    2.5.3 命令行方式登录镜像仓库

    1. # docker login 10.12.5.60
    2. Username: admin
    3. Password:
    4. Error response from daemon: Get https://10.12.5.60/v2/: dial tcp 10.12.5.60:443: getsockopt: connection refused

    因为 docker1.3.2 版本开始默认 docker registry 使用的是 https,我们设置 Harbor 默认 http 方式,所以当执行用 docker login、pull、push 等命令操作非 https 的 docker regsitry 的时就会报错。解决办法:

    1. $ vim /etc/docker/daemon.json
    2. {
    3. "insecure-registries": ["10.12.5.60"] #如果要与别的仓库配置共用,中间要用“,”隔开
    4. }
    5. $ systemctl daemon-reload
    6. $ systemctl restart docker
    1. # docker login 10.12.5.60
    2. Username: admin
    3. Password:
    4. Login Succeeded

    2.5.4 推送镜像

    1. $ docker login 10.12.5.60
    2. Username: admin
    3. Password:
    4. Login Succeeded
    5. $ docker pull nginx
    6. Using default tag: latest
    7. latest: Pulling from library/nginx
    8. 578acb154839: Pull complete
    9. e398db710407: Pull complete
    10. 85c41ebe6d66: Pull complete
    11. 7170a263b582: Pull complete
    12. 8f28d06e2e2e: Pull complete
    13. 6f837de2f887: Pull complete
    14. c1dfc7e1671e: Pull complete
    15. Digest: sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
    16. Status: Downloaded newer image for nginx:latest
    17. $ docker tag nginx:latest 10.12.5.60/sre/nginx:v1
    18. $ docker push 10.12.5.60/sre/nginx:v1
    19. The push refers to repository [10.12.5.60/sre/nginx]
    20. 505f49f13fbe: Pushed
    21. 9920f1ebf52b: Pushed
    22. 768e28a222fd: Pushed
    23. 715b32fa0f12: Pushed
    24. e503754c9a26: Pushed
    25. 609f2a18d224: Pushed
    26. ec983b166360: Pushed
    27. v1: digest: sha256:d2e65182b5fd330470eca9b8e23e8a1a0d87cc9b820eb1fb3f034bf8248d37ee size: 1778

    2.5.5 推送同一镜像不同版本 

    1. $ docker tag nginx:latest 10.12.5.60/sre/nginx:v2
    2. $ docker push 10.12.5.60/sre/nginx:v2
    3. The push refers to repository [10.12.5.60/sre/nginx]
    4. 505f49f13fbe: Layer already exists
    5. 9920f1ebf52b: Layer already exists
    6. 768e28a222fd: Layer already exists
    7. 715b32fa0f12: Layer already exists
    8. e503754c9a26: Layer already exists
    9. 609f2a18d224: Layer already exists
    10. ec983b166360: Layer already exists
    11. v2: digest: sha256:d2e65182b5fd330470eca9b8e23e8a1a0d87cc9b820eb1fb3f034bf8248d37ee size: 1778

    2.5.6 操作日志

    日志会记录各个用户的操作。可用于harbor的操作审计。

    2.5.7 用户管理 

    2.5.7.1 用户列表

    2.5.7.2 创建用户

     2.5.7.3 将用户设置为管理员

    将sre1用户设置为harbor仓库的管理员。

    2.5.7.4 重置密码

     提交即可。

    2.5.8 项目成员管理

    2.5.8.1 角色介绍
    角色权限说明
    访客对于指定项目拥有只读权限
    开发人员 对于指定项目拥有读写权限,但没用删除权限
    维护人员对于指定项目拥有读写权限,也能对修改其它配置,比如创建 Webhooks
    项目管理员

     除了读写权限,同时拥有用户管理/镜像扫描等管理权限

    2.5.8.2  添加项目成员

    2.5.8.3 普通用户测试上传/下载镜像
    1. $ docker login 10.12.5.60
    2. Username: sre1
    3. Password:
    4. Login Succeeded
    5. $ docker tag goharbor/harbor-db:v1.9.4 10.12.5.60/sre/harbor-db:v1.9.4
    6. $ docker push 10.12.5.60/sre/harbor-db:v1.9.4
    7. The push refers to repository [10.12.5.60/sre/harbor-db]
    8. 69fab71b0bc5: Pushed
    9. 9dd11aa8e16a: Pushed
    10. ea3d1b630734: Pushed
    11. aa04ed1247cb: Pushed
    12. c91b8f37358e: Pushed
    13. 013a04104e87: Pushed
    14. 7108c9c351ce: Pushed
    15. b94d1cd23704: Pushed
    16. 62b223a46a15: Pushed
    17. v1.9.4: digest: sha256:e6056d0effd4dab7bd54d525e65127c84d07305934afbb769a077172dd7d33eb size: 2197
    18. $ docker pull 10.12.5.60/sre/nginx:v1
    19. v1: Pulling from sre/nginx
    20. Digest: sha256:d2e65182b5fd330470eca9b8e23e8a1a0d87cc9b820eb1fb3f034bf8248d37ee
    21. Status: Image is up to date for 10.12.5.60/sre/nginx:v1

    2.5.9 harbor迁移 

    源节点目标节点
    10.12.5.6010.12.5.62
    2.5.9.1 在目标节点部署harbor

    详细部署过程与源节点一致,部署完成后,访问目标节点web ui。

    目标节点没有镜像。

    2.5.9.2 数据迁移
    2.5.9.2.1 登录源节点,查看数据存储位置(源harbor操作)
    1. $ cat docker-compose.yml
    2. version: '2.3'
    3. services:
    4. .......
    5. registry:
    6. image: goharbor/registry-photon:v2.7.1-patch-2819-2553-v1.9.4
    7. container_name: registry
    8. restart: always
    9. cap_drop:
    10. - ALL
    11. cap_add:
    12. - CHOWN
    13. - SETGID
    14. - SETUID
    15. volumes:
    16. - /data/registry:/storage:z #镜像存储位置
    17. - ./common/config/registry/:/etc/registry/:z
    18. - type: bind
    19. source: /data/secret/registry/root.crt
    20. target: /etc/registry/root.crt
    21. networks:
    22. - harbor
    23. dns_search: .
    24. depends_on:
    25. - log
    26. logging:
    27. driver: "syslog"
    28. options:
    29. syslog-address: "tcp://127.0.0.1:1514"
    30. tag: "registry"
    31. ......
    32. postgresql:
    33. image: goharbor/harbor-db:v1.9.4
    34. container_name: harbor-db
    35. restart: always
    36. cap_drop:
    37. - ALL
    38. cap_add:
    39. - CHOWN
    40. - DAC_OVERRIDE
    41. - SETGID
    42. - SETUID
    43. volumes:
    44. - /data/database:/var/lib/postgresql/data:z #数据存储位置
    45. networks:
    46. harbor:
    47. dns_search: .
    48. env_file:
    49. - ./common/config/db/env
    50. depends_on:
    51. - log
    52. logging:
    53. driver: "syslog"
    54. options:
    55. syslog-address: "tcp://127.0.0.1:1514"
    56. tag: "postgresql"
    57. ......
    2.5.9.2.2 进入两个目录中打包所有的资源 
    1. $ cd /data/registry/
    2. $ tar -cf new.tar.gz ./*
    3. $ cd /data/database/
    4. $ tar -cf new1.tar.gz ./*
    2.5.9.2.3 将打包的镜像和日志移到新的harbor上
    1. $ cd /data/registry/
    2. $ scp new.tar.gz 10.12.5.62:/data/registry/
    3. $ cd /data/database/
    4. $ scp new1.tar.gz 10.12.5.62:/data/database/
    2.5.9.2.4 目标harbor解压数据
    1. $ cd /data/registry/
    2. $ tar -xvf new.tar.gz
    3. $ cd /data/database/
    4. $ tar -xvf new1.tar.gz
    2.5.9.2.5 验证是否迁移成功

    登录目标harbor web ui,刷新镜像仓库。

     

     目标harbor上已存在镜像和数据。

    2.5.9.3 客户端验证

    客户端登录目标harbor。

    1. $ docker login -u admin -p Harbor12345 http://10.12.5.62
    2. WARNING! Using --password via the CLI is insecure. Use --password-stdin.
    3. Login Succeeded
    4. $ docker pull 10.12.5.62/sre/nginx:v1
    5. v1: Pulling from sre/nginx
    6. 578acb154839: Pull complete
    7. e398db710407: Pull complete
    8. 85c41ebe6d66: Pull complete
    9. 7170a263b582: Pull complete
    10. 8f28d06e2e2e: Pull complete
    11. 6f837de2f887: Pull complete
    12. c1dfc7e1671e: Pull complete
    13. Digest: sha256:d2e65182b5fd330470eca9b8e23e8a1a0d87cc9b820eb1fb3f034bf8248d37ee
    14. Status: Downloaded newer image for 10.12.5.62/sre/nginx:v1
    15. $ docker tag 10.12.5.62/sre/nginx:v1 10.12.5.62/sre/nginx:v2
    16. $ docker push 10.12.5.62/sre/nginx:v2
    17. The push refers to repository [10.12.5.62/sre/nginx]
    18. 505f49f13fbe: Layer already exists
    19. 9920f1ebf52b: Layer already exists
    20. 768e28a222fd: Layer already exists
    21. 715b32fa0f12: Layer already exists
    22. e503754c9a26: Layer already exists
    23. 609f2a18d224: Layer already exists
    24. ec983b166360: Layer already exists
    25. v2: digest: sha256:d2e65182b5fd330470eca9b8e23e8a1a0d87cc9b820eb1fb3f034bf8248d37ee size: 1778
    26. $ docker images
    27. REPOSITORY TAG IMAGE ID CREATED SIZE
    28. 10.12.5.62/sre/nginx v1 c20060033e06 13 days ago 187MB
    29. 10.12.5.62/sre/nginx v2 c20060033e06 13 days ago 187MB
    30. goharbor/redis-photon v1.9.4 48c941077683 3 years ago 113MB
    31. goharbor/harbor-registryctl v1.9.4 7259026fb1bb 3 years ago 103MB
    32. goharbor/registry-photon v2.7.1-patch-2819-2553-v1.9.4 cf6269830837 3 years ago 85.7MB
    33. goharbor/nginx-photon v1.9.4 364c17f09df9 3 years ago 44MB
    34. goharbor/harbor-log v1.9.4 e0188c234aa2 3 years ago 82.3MB
    35. goharbor/harbor-jobservice v1.9.4 207acbcff6f5 3 years ago 141MB
    36. goharbor/harbor-core v1.9.4 a805deab5833 3 years ago 156MB
    37. goharbor/harbor-portal v1.9.4 cfd272546394 3 years ago 51.4MB
    38. goharbor/harbor-db v1.9.4 265c8c83954e 3 years ago 150MB
    39. goharbor/prepare v1.9.4 b2cded69458d 3 years ago 151MB

    2.5.10 harbor同步复制

    harbor同步功能主要应用于存储备份,以预防镜像存储异常时,可快速恢复。

    节点1节点2
    10.12.5.6010.12.5.62
    2.5.10.1 源节点配置
    2.5.10.1.1 新建远程仓库

    如果远程仓库开启了登录认证功能,那么就需要配置账号密码。

    状态检测Healthy。

    2.5.10.1.2 新建同步策略

    策略是2分钟同步一次。

    同步历史:

    2.5.10.1.3 验证同步效果
    1. $ docker tag goharbor/redis-photon:v1.9.4 10.12.5.62/sre/redis:v1
    2. $ docker push 10.12.5.62/sre/redis:v1
    3. The push refers to repository [10.12.5.62/sre/redis]
    4. 27609e3dd221: Pushed
    5. 694b3e7869d5: Pushed
    6. 5e76c79bec2e: Pushed
    7. 12f86854bc80: Pushed
    8. 62b223a46a15: Pushed
    9. v1: digest: sha256:0e4ef534b5ee2026237e75992a2f73a6169c11c1362333ee50f8e3e885e07104 size: 1366

    源端仓库:

    目标仓库:

    Todo:

    2.5.11 harbor仓库升级

    参考文档:如何通过开源项目搭建私有云平台--第三步补充,harbor升级-CSDN博客

    2.5.12 高可用部署

    2.5.12.1 高可用架构

    2.5.12.2 实现原理
    • 数据高可用:Redis缓存组件、PostgreSQL数据库组件独立集群化部署,实现高可用。
    • 存储共享:使用外部共享存储实现多个Harbor实例的数据共享,Harbor实例可横向扩展。

    参考文档:Harbor高可用集群设计及部署(基于离线安装方式)_harbor高可用部署_太阳神LoveU的博客-CSDN博客

    2.6 常见问题

    2.6.1 harbor启动失败

    2.6.1.1 现象
    1. $ docker-compose up -d
    2. //如果有以下报错,需要开启防火墙 firewalld 服务解决
    3. Creating network "harbor_harbor" with the default driver
    4. ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b53c314f45e8 -j RETURN: iptables: No chain/target/match by that name.
    5. (exit status 1))
    2.6.1.2 解决方案
    1. $ systemctl restart firewalld.service
    2. $ docker-compose up -d

    2.6.2 k8s下载镜像认证失败

    2.6.2.1 现象

    k8s pull镜像提示:

    unauthorized: unauthorized to access repository 
    2.6.2.2 解决方案

    1)创建secret

    kubectl create secret docker-registry harbor-login-registry --docker-username=admin --docker-password=Harbor12345 --docker-server=10.12.5.60:80   

    2)k8s yaml增加配置

    1. imagePullSecrets: # 使用密码登录
    2.       - name: harbor-login-registry

    2.6.3 docker login失败

    2.6.3.1 现象

    docker login 10.12.5.60出现以下报错:

    Error response from daemon: Get https://: http: server gave HTTP response to HTTPS client
    2.6.3.2 解决方案

    编辑daemon.json文件,添加如下内容(连接harbor拉取镜像的docker服务器都需要配置)

    1. $ vi /etc/docker/daemon.json
    2. {
    3.   "insecure-registries": ["10.12.5.60"]
    4. }

    重新加载、启动docker

    1. $ systemctl daemon-reload
    2. $ systemctl restart docker

  • 相关阅读:
    0079 单链表
    基于redisson实现tomcat集群session共享
    Git 不要只会 pull 和 push,学学这 5 条提高效率的命令(下)
    python+requests实现接口自动化测试
    JMeter—(三)如何做接口测试进阶篇
    JVM性能调优篇02-JVM内存模型深度剖析与优化
    【MM32F5270】RT-Thread SPI 驱动适配指南
    排序算法的总结
    JS 中的各种距离 scrollTop?clientHeight?
    Linux开发工具使用
  • 原文地址:https://blog.csdn.net/ygq13572549874/article/details/134295591