Harbor
简介
Harbor 是由 VMware 公司中国团队为企业用户设计的 Registry server 开源项目, 包括了权限管理 (RBAC),LDAP, 审计, 管理界面, 自我注册, HA,RESTful API 等企业必需的功能, 属于 Cloud Native Computing Foundation(CNCF, 云原生计算基金会) 的毕业项目.
我们建议使用 2.0 以后的版本, Harbor 在 2.0 以后的版本使 Harbor 成为第一个符合 OCI(Open Container Initiative, 开放容器倡议)标准的开源 Registry server, 能够存储大量云原生组件, 例如 container images,Helm Chart,OPAs,CNAB,Singularity 等.
目前, Harbor 最新稳定版本为 2.1, 本文使用此版本部署.
部署
1, 我们的需求如下
提供 registey 服务的域名为 registry.myk8s.com
我们需要把域名解析到有外网 ip 的 nginx 上, 然后 nginx 给 Harbor 做代理
我们给 Harbor 单独提供一个分区挂载到了 / data1 目录
2, 现在准备 docker 环境:
- # yum install docker-ce -y
- # yum install docker-compose -y
- # systemctl start docker
3,Harbor 安装配置:
- # wget https://github.com/goharbor/harbor/releases/download/v2.0.1/harbor-online-installer-v2.0.1.tgz
- # tar xf harbor-online-installer-v2.0.1.tgz
- # cd harbor
- # VIM harbor.YAML
- hostname: registry.myk8s.com #服务的域名
- https: # 如下配置域名的证书
- certificate: /opt/registry.myk8s.com.crt
- private_key: /opt/registry.myk8s.com.key
- external_url: https://registry.myk8s.com # 由于要用 nginx 做代理, 故需要配置
- harbor_admin_password: 123546 # 设置 harbor 默认 admin 用户的密码
- data_volume: /data1 # 设置存储卷
- # bash install.sh
最后 install.sh 会执行安装操作, 需要从外网下载镜像, 故需要一定的时间.
4, 公网 nginx 配置给 Harbor 做代理转发:
给 nginx 添加 vhost 如下
- # VIM registry.myk8s.com.conf
- server {
- listen 443;
- access_log /data0/logs/registry.myk8s.com.log main;
- server_name registry.myk8s.com;
- location / {
- proxy_pass https://x.x.x.x:443;
- proxy_set_header Host registry.myk8s.com;
- }
- }
重启 nginx
# systemctl reload nginx
5, 访问 Harbor 界面和配置
访问 url: https://registry.myk8s.com/
登陆界面之后, 可以创建私有项目和不同权限的新用户, 然后给用户绑定到不同的项目. 私有项目需要对应用户的凭证才能访问.
也可以创建公共项目, 公共项目不需要凭证就可以访问
推送 docker image 到 Harbor 的私有 test 项目
说到使用 image 就离不开要理解 image 的 tag, 我们先来理解下 tag 的作用:
1,docker 可以为 image 的每一个 commit ID 创建一个 tag
docker image 将文件等信息的变动抽象为一次次的 commit, 每一次 commit 以后会生成一串无规则的字符串代表此次生成的 image 的 ID, 此时, tag 的作用就是为这个 ID 创建一个友好的 NAME, 方便我们对镜像库的管理.
2,docker 可以为给一个本地存在的 image 创建一个指向远程 registry server 的 tag
3, 一个 image 可以有多个 tag, 不同的 tag 可以用来区分不同的版本
- # docker login registry.myk8s.com # 输入用户名和密码
- # docker tag tutum/dnsutils registry.myk8s.com/test/dnsutils:latest
- # docker push registry.myk8s.com/test/dnsutils:latest
对比 docker registry
docker registry 也提供镜像仓库的功能, 但是 Harbor 功能更为强大. 主要提供了 docker registry 所没有的镜像同步, 用户角色权限控制, Helm Chart 仓库支持等.
Helm Chart
简介
Helm 是一个开源的 k8s 包管理器, 属于 Cloud Native Computing Foundation(CNCF, 云原生计算基金会)的毕业项目. 它能够把创建一个应用所需的所有 Kubernetes API 对象声明文件组合并打包在一起, 并提供了仓库的机制便于存储和分发共享, 还支持模版变量替换, 同时还有版本的概念, 使之能够对一个应用进行版本的管理.
Helm 的主要组件如下:
helm cli:helm 的命令行客户端工具, 主要用于 k8s 应用程序 Chart 的创建, 打包, 发布以及创建和管理本地和远程的 Chart 仓库.
Chart:Helm 的软件包, 采用 tar 格式. 类似于 YUM 的 rpm 包, 其包含了一组定义 k8s 资源相关的 YAML 文件.
Repoistory:Helm 的软件仓库, Repository 本质上是一个 web 服务器, 该服务器保存了一系列的 Chart 软件包以供用户下载, 并且提供了一个该 Repository 的 Chart 包的清单文件以供查询. Helm 可以同时管理多个不同的 Repository.
Release: 使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release.
在 Helm 中, 一个 Chart 可能依赖于任何数量的其他 Chart. 这些依赖关系可以通过 requirements.YAML 文件动态链接或引入 Charts / 目录并手动管理.
helm3 在 2019 年年底发布, 移除了 Tiller, 支持推送 Chart 包到 Harbor registry server. 目前 helm 最新稳定版为 helm 3.2.4, 本位使用此版本部署.
架构
安装
在官方网站 https://github.com/helm/helm/releases 下载 helm3 以上的最新稳定二进制版本:
- # wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz
- # tar xf helm-v3.2.4-Linux-amd64.tar.gz
- # mv Linux-amd64/helm /usr/local/bin/helm
- # helm version
- version.BuildInfo{
- Version:"v3.2.4", GitCommit:"0ad800ef43d3b826f31a5ad8dfbb4fe05d143688", GitTreeState:"clean", GoVersion:"go1.13.12"
- }
使用
公共仓库
helm 有自己的官方公开仓库 https://hub.helm.sh/, 里面有开发者贡献的一些常见应用的 Chart. 如果有使用开源软件的需求可以在上面搜索直接下载使用. 当然, 也可以自己搭建 Harbor registry server 创建公共仓库.
我们以在 k8s 集群部署 cerebro 应用为例子, 需要先添加应用对应的 repo, 然后进行安装:
- # helm repo add stable https://kubernetes-charts.storage.googleapis.com
- # helm repo list
- NAME URL
- stable https://kubernetes-charts.storage.googleapis.com
- # helm install stable/cerebro --version 1.1.4 --generate-name
- # helm list
- NAME NAMESPACE REVISION UPDATED STATUS CHART App VERSION
- cerebro-1591777586 default 1 2020-07-22 16:26:30.419723417 +0800 CST deployed cerebro-1.1.4 0.8.4
- # kubectl get pods|grep cerebro
- cerebro-1591777586-7fd87f7d48-hmlp7 1/1 Running 0 11m
私有仓库
1, 我们把 helm hub 的 cerebro 应用下载到本地, 需要再给 helm 安装 push 插件, 然后给推送到我们自己的 Harbor registry server 上.
- # helm repo add stable https://kubernetes-charts.storage.googleapis.com
- # helm pull stable/cerebro
- # tar xf cerebro-1.9.2.tgz
- # yum install Git -y
- # helm plugin install https://github.com/chartmuseum/helm-push.git
- # export HELM_EXPERIMENTAL_OCI=1
- [root@master2 ~]# helm chart save cerebro registry.myk8s.com/test/cerebro:v1.9.2
- ref: registry.myk8s.com/test/cerebro:v1.9.2
- digest: d32e30e72bb1929b6cf7e46381e7d54f01fc5926c638ef5a47547e0fa24822d5
- size: 5.4 KiB
- name: cerebro
- version: 1.9.2
- v1.9.2: saved
- # helm registry login https://registry.myk8s.com
- Username: username
- Password:
- Login succeeded
- # helm chart push registry.myk8s.com/test/cerebro:v1.9.2
- The push refers to repository [registry.myk8s.com/test/cerebro]
- ref: registry.myk8s.com/test/cerebro:v1.9.2
- digest: d32e30e72bb1929b6cf7e46381e7d54f01fc5926c638ef5a47547e0fa24822d5
- size: 5.4 KiB
- name: cerebro
- version: 1.9.2
- v1.9.2: pushed to remote (1 layer, 5.4 KiB total)
注意:
如果 helm-push 安装失败, 需要通过一些办法把 https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz 文件下载到服务器, 然后通过如下方法安装:
- # tar xf helm-push_0.8.1_linux_amd64.tar.gz
- # mkdir -p /root/.local/share/helm/plugins/helm-push.Git/bin/
- # cp bin/helmpush /root/.local/share/helm/plugins/helm-push.Git/bin/
2, 我们自己初始化一个简单的 Chart, 默认会安装一个 nginx 应用, 然后给推送到 Harbor registry server.
- # helm create helm-test
- # VIM helm-test/values.YAML # 修改相关 Chart 的配置
- # helm package helm-test
- # helm install helm-test-0.1.0.tgz --generate-name # 在本地 k8s 安装应用
- # helm list
- helm-test-0-1595410957 default 1 2020-07-22 17:42:38.051204463 +0800 CST deployed helm-test-0.1.0 1.16.0
- # helm chart save helm-test registry.myk8s.com/test/helm-test:v2
- ref: registry.myk8s.com/test/helm-test:v2
- digest: 7f1f17b1516d9173b3368cb64393ec31ad8b818b722b743b31276f49c1c36cf9
- size: 3.5 KiB
- name: helm-test
- version: 0.1.0
- v2: saved
- # helm chart push registry.myk8s.com/test/helm-test:v2
- The push refers to repository [registry.myk8s.com/test/helm-test]
- ref: registry.myk8s.com/test/helm-test:v2
- digest: 7f1f17b1516d9173b3368cb64393ec31ad8b818b722b743b31276f49c1c36cf9
- size: 3.5 KiB
- name: helm-test
- version: 0.1.0
- v2: pushed to remote (1 layer, 3.5 KiB total)
对比 CNAB 规范
Helm Chart 只能用于 k8s 应用程序的包管理, 而 CNAB 应用更为广泛. Cloud Native Application Bundles (CNAB) 是全新的开源打包格式规范, 通过一个可安装文件就能管理多款, 在不同环境中配置应用程序资源并分布式应用, 在不同环境中配置应用程序资源, 无需多个工具集就能轻松管理应用程序的生命周期. 它兼容 Azure,on-prem OpenStack, Kubernetes, Swarm, Ansible, Terraform 等平台.
总结
目前 Helm Chart 是主流的 k8s 包管理工具, 而 Harbor 也是主流的 registry server, 值的我们研究使用.
参考
- https://goharbor.io/docs/2.0.0/install-config/
- https://goharbor.io/blog/harbor-2.0/
- https://helm.sh/docs/intro/install/
- https://helm.sh/docs/
来源: http://blog.51cto.com/leejia/2512739