计算机系统应用教程网站

网站首页 > 技术文章 正文

开源容器镜像仓库工具-Harbor containerd 镜像仓库

btikc 2024-10-08 01:09:59 技术文章 2 ℃ 0 评论

Harbor 是一个开源的容器镜像仓库管理工具,用于存储、签名和扫描容器镜像。

HarborCNCF 毕业项目,具有合规性、性能和互操作性,可帮助工程师在 Kubernetes 和 Docker 等云原生计算平台上一致、安全地管理容器镜像文件。

Harbor 提供了比标准 Docker Registry 更丰富的功能,特别是在安全性、访问控制和镜像复制方面。

GitHub地址:https://github.com/goharbor/harbor

DockerHub地址:https://hub.docker.com/r/bitnami/harbor-core

官网链接:https://goharbor.io/

主要功能

  1. 镜像存储与管理:Harbor 允许用户存储和管理 Docker 镜像和 Helm chart,支持将镜像和 chart 分组到不同的项目中,每个项目都可以有独立的权限管理。
  2. 安全与漏洞扫描:Harbor 集成了静态分析工具,如 Clair 或 Trivy,可以自动扫描镜像中的已知漏洞。用户可以配置策略以防止包含严重漏洞的镜像被拉取或运行。
  3. 角色基础的访问控制:提供细粒度的访问控制,用户可以为每个项目设定不同的角色和权限,如项目管理员、开发者或访客。
  4. 镜像复制:支持跨多个 Harbor 实例的镜像复制,便于在不同的环境或地理位置之间同步镜像,实现数据灾备和负载均衡。
  5. 高可用性和可伸缩性:Harbor 支持高可用部署模式,可以在多个服务器节点上运行以保证服务的稳定性。通过与 Kubernetes 和 Docker Swarm 等容器编排工具的集成,支持大规模的镜像服务。
  6. 多租户支持:Harbor 允许多个团队共享同一个实例,每个团队可以操作自己的独立仓库空间,实现资源隔离。

核心特性

  1. 云原生兼容性

容器和 Helm 图表管理:Harbor 不仅支持 Docker 容器镜像,还支持 Helm 图表,这使得在统一的平台上管理这两种资源成为可能。这在广泛使用 Helm 部署复杂应用的 Kubernetes 环境中尤其有用。

  1. 基于角色的访问控制(RBAC)

基于项目的管理:用户可以通过项目在 Harbor 中管理和访问仓库,每个项目下的镜像或 Helm 图表可以有不同的权限,增强了安全性和操作的粒度。

  1. 基于策略的镜像复制

跨仓库同步:Harbor 允许根据定义的策略在多个镜像仓库实例之间复制镜像和图表,策略可以包括仓库、标签和标签的过滤器。这一功能可以用来辅助负载均衡,实现高可用性,并促进混合云和多云场景下多数据中心的部署。

  1. 漏洞扫描

定期扫描和策略检查:Harbor 定期扫描镜像以检测已知漏洞,并通过策略检查阻止部署存在漏洞的镜像。

  1. LDAP/AD 支持

用户认证与管理:Harbor 与现有企业的 LDAP/AD 进行集成,用于用户认证和管理,并支持将 LDAP 组导入 Harbor,然后可以为特定项目授权。

  1. OIDC 支持

身份验证和单点登录:Harbor 利用 OpenID Connect (OIDC) 验证由外部授权服务器或身份提供者认证的用户身份。可以启用单点登录以登录 Harbor 门户。

  1. 图像删除与垃圾回收

定期清理:系统管理员可以运行垃圾收集作业,定期删除镜像(悬空的清单和未引用的 blobs),释放空间。

  1. Notary 支持

镜像签名:支持使用 Docker Content Trust(利用 Notary)对容器镜像进行签名,以保证其真实性和来源。此外,还可以激活防止部署未签名镜像的策略。

  1. 图形用户门户

易于浏览和管理:用户可以轻松浏览、搜索仓库并管理项目。

  1. 审计

操作跟踪:通过日志跟踪对仓库的所有操作。

  1. RESTful API

便于集成:提供 RESTful API 以便于执行管理操作,易于与外部系统集成。内嵌 Swagger UI 可用于探索和测试 API。

  1. 简易部署

Docker compose 和 Helm Chart:Harbor 可通过 Docker compose 或 Helm Chart 部署,最近还添加了 Harbor Operator。

使用场景

  1. 企业级容器管理:适用于需要严格安全和合规要求的企业环境,可以管理和分发容器镜像。
  2. CI/CD 流水线:在持续集成和持续部署的环境中作为镜像仓库使用,支持自动化的镜像构建、测试和部署。
  3. 多云和跨地区部署:通过镜像复制功能,支持跨云和跨数据中心的容器部署,增强业务的灾备能力。

部署和访问

//安装docker-compose:
[root@k8s-master01 harbor]# wget https://github.com/docker/compose/releases/download/v2.19.1/docker-compose-linux-x86_64 ##下载Amd64架构安装包
[root@k8s-master01 harbor]# cp docker-compose-linux-aarch64 /usr/local/bin/docker-compose ##拷贝到/usr/local/bin下并重命名为docker-compose
[root@k8s-master01 harbor]# chmod +x /usr/local/bin/docker-compose ##赋予可执行权限
[root@k8s-master01 harbor]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose ##新建软链
[root@k8s-master01 harbor]# docker-compose version ##安装完成后,查看版本
//安装harbor:
[root@k8s-master01 harbor]# mkdir -p /data/harbor /var/log/harbor ##新建目录
[root@k8s-master01 harbor]# wget -P /opt/ https://github.com/goharbor/harbor/releases/download/v2.8.2/harbor-offline-installer-v2.8.2.tgz ##将下载文件放到/opt/目录下
[root@k8s-master01 harbor]# tar -zxvf /opt/harbor-offline-installer-v2.8.2.tgz ##解压完成后,会生成一个harbor目录,也就是harbor的工作目录
[root@k8s-master01 harbor]# cd /opt/harbor
[root@k8s-master01 harbor]# docker load -i harbor.v2.8.2.tar.gz
[root@k8s-master01 harbor]# cp harbor.yml.tmpl harbor.yml ##改文件名为.yml格式
//按需修改harbor.yaml相关参数:
[root@k8s-master01 harbor]# vim opt/harbor/harbor.yml ##主要参数有hostname、http(s)、port、证书/私钥存放路径、数据存放路径、WebUI登陆所需的账户名/密码等:

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: harbor.cisco.com或192.168.146.133

# http related config
http:
 # port for http, default is 80. If https enabled, this port will redirect to https port
 port: 80

# https related config
https:
 # https port for harbor, default is 443
 port: 443
 # The path of cert and key files for nginx
certificate: /data/cert/server.crt
 private_key: /data/cert/server.key

# # Uncomment following will enable tls communication between all harbor components

# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: Harbor12345

# Harbor DB configuration
database:
 # The password for the root user of Harbor DB. Change this before any production use.
 password: root123

# The default data volume
data_volume: /data/harbor

# Log configurations
log:
 # options are debug, info, warning, error, fatal
 level: info
 # configs for logs in local storage
 local:
 # Log files are rotated log_rotate_count times before being removed. If count is 0, old versions are removed rather than rotated.
 rotate_count: 50
 # Log files are rotated only if they grow bigger than log_rotate_size bytes. If size is followed by k, the size is assumed to be in kilobytes.
 # If the M is used, the size is in megabytes, and if G is used, the size is in gigabytes. So size 100, size 100k, size 100M and size 100G
 # are all valid.
 rotate_size: 200M
 # The directory on your host that store log
 location: /var/log/harbor
[root@k8s-master01 harbor]# ./prepare ##Harbor将nginx实例用作所有服务的反向代理。您可以使用prepare脚本来配置nginx为使用https
[root@k8s-master01 harbor]# sh /root/harbor/install.sh ##初始化服务后,访问http://192.168.146.133:5000(默认密码:admin/Harbor12345)
采用https方式还需要生成相关证书:
[root@k8s-master01 harbor]# mkdir -p /data/cert /etc/docker/certs.d/harbor.cisco.com 或
 mkdir -p /data/cert /etc/docker/certs.d/192.168.146.133:5000 或
 mkdir -p /data/cert /etc/docker/certs.d/harbor.cisco.com:5000 ##把默认的nginx端口443映射到一个不同的端口
[root@k8s-master01 harbor]# cd /etc/docker/certs.d/harbor.cisco.com 或
 cd /etc/docker/certs.d/192.168.146.133:5000 或
 cd /etc/docker/certs.d/harbor.cisco.com:5000
[root@k8s-master01 harbor.cisco.com]# openssl genrsa -out ca.key 4096 ##生成ca证书私钥
[root@k8s-master01 harbor.cisco.com]# openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.cisco.com" -key ca.key -out ca.crt ##生成ca证书
[root@k8s-master01 harbor.cisco.com]# openssl genrsa -out server.key 4096 ##生成harbor服务器证书私钥
[root@k8s-master01 harbor.cisco.com]# openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.cisco.com" -key server.key -out server.csr ##生成harbor服务器证书签发请求文件
[root@k8s-master01 harbor.cisco.com]# vim v3.ext ##新创建v3.ext文件,用于协助签发harbor服务器证书
//域名方式访问:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=harbor.cisco.com
DNS.2=harbor.cisco
DNS.3=cisco
//IP方式访问:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:192.168.1.18

[root@k8s-master01 harbor.cisco.com]# openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt ##生成harbor服务器证书
[root@k8s-master01 harbor.cisco.com]# cp server.crt server.key /data/cert/ ##把server.crt和server.key拷贝到/data/cert/,供harbor.yml指定证书路径使用
[root@k8s-master01 harbor.cisco.com]# openssl x509 -inform PEM -in server.crt -out server.cert ##把.crt转换为.cert供doker的配置文件daemon.json使用
[root@k8s-master01 harbor.cisco.com]# cp server.cert server.key ca.crt /etc/docker/certs.d/harbor.cisco.com ##把这三个文件拷贝到docker的证书目录下

/etc/docker/certs.d/
 └── harbor.cisco.com
 ├── server.cert <-- Server certificate signed by CA
 ├── server.key <-- Server key signed by CA
├── server.crt <-- Server certificate signed by CA
 └── ca.crt <-- Certificate authority that signed the registry certificate

[root@k8s-master01 harbor]# ./prepare #Harbor将nginx实例用作所有服务的反向代理。您可以使用prepare脚本来配置nginx为使用https
[root@k8s-master01 harbor]# sh /root/harbor/install.sh #初始化服务后,访问https://192.168.146.133:5000(默认密码:admin/Harbor12345)
//添加harbor开机自启动服务,需要新建harbor.service服务:
[root@k8s-master01 harbor]# vim /etc/systemd/system/harbor.service

[Unit]
Description=Harbor Container Registry
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/docker-compose -f /opt/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /opt/harbor/docker-compose.yml down
WorkingDirectory=/opt/harbor
Restart=always

[Install]
WantedBy=default.target
//采用http方式使用harbor,需要修改harbor客户端的docker或K8s有关镜像仓库的配置:
//修改docker的daemon.json配置:
[root@k8s-master01 harbor]# vim /etc/docker/daemon.json ##所有安装了docker的节点都需要添加insecure-registries配置,避免docker login的时候报https错误
{
 "insecure-registries": ["192.168.146.133:5000"],
"live-restore": true
}

[root@k8s-master01 harbor]# systemctl daemon-reload
[root@k8s-master01 harbor]# systemctl restart docker
[root@k8s-master01 harbor]# docker-compose restart
或
[root@k8s-master01 harbor]# vim /usr/lib/systemd/system/docker.service ##在Docker server启动的时候,增加启动参数,使其默认使用HTTP访问,避免docker login的时候报https错误
--13行--修改
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.146.133:5000 --containerd=/run/containerd/containerd.sock 或
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.146.133:5000

[root@k8s-master01 harbor]# systemctl daemon-reload
[root@k8s-master01 harbor]# systemctl restart docker
[root@k8s-master01 harbor]# docker-compose restart
//修改k8s的config.toml配置:
[root@k8s-master01 harbor]# vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.146.133:5000"]
endpoint = ["http://192.168.146.133:5000"]

[root@k8s-master01 harbor]# systemctl restart containerd
[root@k8s-master01 harbor]# ctr -n k8s.io image pull 192.168.146.133/kubernetes/harbor-exporter:v2.3.2 --plain-http --user admin:Harbor12345
//采用https方式使用harbor,需要修改harbor客户端的docker或K8s有关镜像仓库的配置:
//修改docker的daemon.json配置:
[root@k8s-master01 ~]# scp -r /etc/docker/certs.d/harbor.cisco.com/ca.crt root@客户机ip:/etc/docker/certs.d/harbor.cisco.com/ ##从harbor服务端,把相关证书文件拷贝到harbor客户端
[root@k8s-master01 ~]# vim /etc/docker/daemon.json ##修改registry-mirrors
{
"registry-mirrors": ["your-harbor-domain.com"],
"debug": true,
"experimental": false,
"tls": true,
"tlscacert": "/etc/docker/certs.d/your-harbor-domain.com/ca.crt",
"tlscert": "/etc/docker/certs.d/your-harbor-domain.com/client.cert",
"tlskey": "/etc/docker/certs.d/your-harbor-domain.com/client.key",
"live-restore": true
}

[root@k8s-master01 ~]# systemctl restart docker.service
//修改K8s的config.toml配置:
[root@k8s-master01 ~]# scp -r /etc/docker/certs.d/harbor.cisco.com/ca.crt root@客户机ip:/etc/docker/certs.d/harbor.cisco.com/ ##从harbor服务端,把相关证书文件拷贝到harbor客户端
[root@k8s-master01 harbor]# vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."your-harbor-domain.com"]
endpoint = ["https://your-harbor-domain.com"]
ca_file = "/root/certs.d/your-harbor-domain.com/ca.crt"
cert_file = "/root/certs.d/your-harbor-domain.com/client.cert"
key_file = "/root/certs.d/your-harbor-domain.com/client.key"

[root@k8s-master01 ~]# systemctl restart containerd
[root@k8s-master01 harbor]# ctr -n k8s.io image pull 192.168.146.133/kubernetes/harbor-exporter:v2.3.2 --plain-http --user admin:Harbor12345 ##测试
//在harbor客户端验证是否能够登陆harbor客户端:
[root@k8s-master01 ~]# docker login harbor.chengonglei.com 或 docker login harbor.chengonglei.com:port ##harbor客户端可以采用这种方式进行验证
[root@k8s-master01 ~]# vim /etc/hosts ##进行测试
192.168.1.18 harbor.cisco.com
//Harbor维护命令:
docker-compose down -v ##关停harbor(数据不会被删除)
docker-compose up -d ##重启harbor
//FAQ:
cat intermediate-certificate.pem >> yourdomain.com.crt ##如果使用证书签发机构的中间证书,请将中间证书与自己的证书合并,创建证书捆绑包。
cp yourdomain.com.crt /etc/pki/ca-trust/source/anchors/yourdomain.com.crt ##当Docker守护进程在某些操作系统上运行时,你可能需要在操作系统层面信任证书。
update-ca-trust

!!!【点赞】、【关注】不走丢^_^

!!!【点赞】、【关注】不走丢^_^

#头条创作挑战赛#

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表