2019独角兽企业重金招聘Python工程师标准>>>

Harbor(https://goharbor.io)是一个功能强大的容器镜像管理和服务系统,用于提供专有容器镜像服务。随着云原生架构的广泛使用,原来由VMWare开发的Harbor也加入了云原生基金会(参考《Harbor最新进展,将由CNCF管理 》,项目地址已经变为 https://github.com/goharbor),成为云原生的生态系统的重要组成部分。

1、快速安装

Harbor可以支持容器部署和Kubernetes部署。从Harbor 1.6开始,项目提供了Kubernetes的集群化部署方法,可以使用Helm(https://github.com/goharbor/harbor-helm)快速进行部署,基于Kubernetes集群管理机制进行动态调度。如下:

git clone https://github.com/goharbor/harbor-helm
cd harbor-helm
git checkout masterhelm install --namespace harbor --name harbor .

2、部署技巧

但是,对于多节点的Kubernetes集群来说,还需要解决几个问题:

  • 镜像下载。因为Harbor使用的容器镜像多达10个(其中registry会用到多个容器镜像),会被集群分别调度到多个节点上运行,需要保证所有的节点都有需要的容器镜像,会带来大量的下载流量,完整运行起来的时间比较长。最好是在一个节点上下载,然后上传到所有节点。
  • 网络存储。在Kubernetes集群中pod是可以漂移的,需要保证漂移后的容器仍然能够连续访问存储。
  • 登陆问题。Kubernetes提供了多种服务暴露方法,但目前NodePort等的授权与后台服务会不一致,从而登录失败,提示“ 不正确的用户名或密码”。

2.1 镜像下载

使用下面的脚本预先下载镜像:

echo "Pull images for Harbor:dev"
echo ""docker pull goharbor/harbor-core:dev #
docker pull goharbor/harbor-portal:dev #
docker pull goharbor/harbor-jobservice:dev #docker pull goharbor/clair-photon:dev  #
docker pull goharbor/notary-server-photon:dev #
docker pull goharbor/notary-signer-photon:dev #docker pull goharbor/registry-photon:dev #
docker pull goharbor/harbor-registryctl:dev #
docker pull goharbor/chartmuseum-photon:dev #docker pull goharbor/harbor-db:dev #
docker pull goharbor/redis-photon:dev #echo "Finished."

运行 Helm的安装命令(命名空间为harbor):

helm install --namespace harbor --name harbor .

查看安装后的pod,运行:

kubectl get pod -n harbor

运行的pod实例如下:

NAME                                           READY   STATUS    RESTARTS   AGE
harbor-harbor-chartmuseum-5d8895d9dc-c76mx     1/1     Running   1          9h
harbor-harbor-clair-7995586c44-8p98g           1/1     Running   1          9h
harbor-harbor-core-9999c79ff-db2fl             1/1     Running   0          9h
harbor-harbor-database-0                       1/1     Running   0          9h
harbor-harbor-jobservice-65f6dbdc78-h82nb      1/1     Running   1          9h
harbor-harbor-notary-server-77774bb46f-jzsgx   1/1     Running   2          9h
harbor-harbor-notary-signer-5c94f5844c-8gpp8   1/1     Running   2          9h
harbor-harbor-portal-85dbb47c4f-xbnzz          1/1     Running   0          9h
harbor-harbor-redis-0                          1/1     Running   0          9h
harbor-harbor-registry-b8bd76fc7-744fs         2/2     Running   0          9h

但是,刚安装完的时候,由于存储和登陆问题存在,上面的pod有很多是出于失败状态的,我这里显示的是解决完这些问题以后的pod运行情况。

2.2 网络存储

Harbor可以使用本地存储、外置存储或者网络存储。

本地存储

如果使用本地存储,需要指定Harbor服务pod运行在存储所在的节点上(或者是单节点的Kubernetes集群)。

具体配置文件的参考 https://github.com/openthings/kubernetes-tools/harbor/hostpath,下面给出redis的例子:

  • 创建Redis的存储pv配置文件:
apiVersion: v1
kind: PersistentVolume
metadata:name: data-harbor-harbor-redis-0namespace: harbor
spec:capacity:storage: 8GiaccessModes:- ReadWriteManyhostPath:path: /home/supermap/harbor/data-harbor-harbor-redis-0
  • 创建Redis的存储pvc配置文件:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: data-harbor-harbor-redis-0namespace: harbor
spec:accessModes:- ReadWriteManyresources:requests:storage: 8Gi

网络存储

我这里是直接从GlusterFS创建的pvc,也可以使用NFS或Ceph之类的网络可访问存储,包括性能比较好的NAS/iSCSI/IPSAN等系统。

  • 首先创建endpoint,然后创建pv和pvc。
  • 与本地存储类似,但是可以提供pod在网络范围内的可迁移访问。
  • 具体配置文件参考 https://github.com/openthings/kubernetes-tools/harbor/zettariver。

按照推荐的方法,可以通过helm install来指定存储设备的参数,或者修改value.yaml文件来指定存储的使用方式。我这里没有修改原始参数,等创建pod结束后,将所有的pvc删除,重新创建,然后等待pod重启后运行成功。脚本如下:

echo "Delete pvc..."
kubectl delete -n harbor pvc/data-harbor-harbor-redis-0
kubectl delete -n harbor pvc/database-data-harbor-harbor-database-0
kubectl delete -n harbor pvc/harbor-harbor-chartmuseum
kubectl delete -n harbor pvc/harbor-harbor-jobservice
kubectl delete -n harbor pvc/harbor-harbor-registry
echo ""echo "Create pvc..."
kubectl apply -f 0a-glusterfs-gvzr00-endpoint.yaml
kubectl apply -f 0b-glusterfs-gvzr00-service.yamlkubectl apply -f 1a-pv-data-harbor-harbor-redis-0.yaml
kubectl apply -f 1b-pvc-data-harbor-harbor-redis-0.yamlkubectl apply -f 2a-pv-database-data-harbor-harbor-database-0.yaml
kubectl apply -f 2b-pvc-database-data-harbor-harbor-database-0.yamlkubectl apply -f 3a-pv-harbor-harbor-chartmuseum.yaml
kubectl apply -f 3b-pvc-harbor-harbor-chartmuseum.yamlkubectl apply -f 4a-pv-harbor-harbor-jobservice.yaml
kubectl apply -f 4b-pvc-harbor-harbor-jobservice.yamlkubectl apply -f 5a-pv-harbor-harbor-registry.yaml
kubectl apply -f 5b-pvc-harbor-harbor-registry.yamlecho "Finished."

几个问题的记录:

  • 使用endpoint方法访问glusterfs,其中一些pod总是运行不成功。

    • 参考:Kubernetes中挂载GlusterFS的volume
  • 采用mount glusterfs卷为本地卷,再创建pvc给harbor使用,就可以了(需要设定nodeSelector为固定节点)。
    • 参考:分布式存储系统GlusterFS最新版本安装
    • 但是,容器harbor-harbor-database-0除外,必须存储在非GlusterFS的存储设备上。原因如下。
  • 经试验,容器harbor-harbor-database-0不能部署在GlusterFS卷上,数据pvc为database-data-harbor-harbor-database-0。
    • 因为GlusterFS不支持PostgreSQL的结构化数据:
      • PostgreSQL错误,https://stackoverflow.com/questions/46852123/error-in-performance-test-postgresql-and-glusterfs
      • GlusterFS不支持结构化数据,https://docs.gluster.org/en/latest/Install-Guide/Overview/#is-gluster-going-to-work-for-me-and-what-i-need-it-to-do
    • 临时解决办法:将database-data-harbor-harbor-database-0卷放在物理磁盘上,容器harbor-harbor-database-0部署在同一个节点上。
  • 采用heketi部署glusterfs方法,暂未测试。
    • 参考:GlusterFS-动态卷快速应用
  • 采用NFS访问部署haorbor,或者glusterfs的NFS服务接口部署harbor,暂未测试。
    • 参考:GlusterFS的客户端访问和NFS设置

下面列出正常运行后,Harbor对于存储的使用情况,目前用到了5个pvc虚拟存储卷:

kubectl get pvc -n harborNAME                                     STATUS   VOLUME                                   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data-harbor-harbor-redis-0               Bound    data-harbor-harbor-redis-0               8Gi        RWX                           9h
database-data-harbor-harbor-database-0   Bound    database-data-harbor-harbor-database-0   16Gi       RWX                           9h
harbor-harbor-chartmuseum                Bound    harbor-harbor-chartmuseum                8Gi        RWX                           9h
harbor-harbor-jobservice                 Bound    harbor-harbor-jobservice                 8Gi        RWX                           9h
harbor-harbor-registry                   Bound    harbor-harbor-registry                   8Gi        RWX                           9h

如果在Kubernetes中pv/pvc运行失败,则需要检查存储的容量和路径是否设置正确,请修改之,确保存储完全可用。

2.3 登陆问题

系统默认安装参数是使用Ingress提供服务入口的。虽然文档中说明可以使用nodePort和LoadBalancer来设置服务harbor-harbor-portal的类型,但实际操作中发现,输入账号 admin和密码Harbor12345后,始终会提示 “账号会密码不正确”,导致无法正常登陆到系统。

  • 问题报告和解决办法参见:

    • Invalid user name or password,https://github.com/goharbor/harbor-helm/issues/75

我使用Ingress(需要提前安装)来提供服务,还需要修改Ingress的规则。

安装Ingress,执行:

  • 脚本和配置参见:github.com/openthings/kubernetes-tools/ingress
helm install ./nginx-ingress --name nginx-ingress \--namespace ingress \--set controller.stats.enabled=true

在Kubernetes的Dashboard中,选择“服务发现与负载均衡”,选中“访问权”里的Ingress规则,点击“编辑”。

将其中的host修改为自己的主机域名,如下:

"rules": [{"host": "localhost","http": {"paths": [{"path": "/","backend": {"serviceName": "harbor-harbor-portal","servicePort": 80}},{"path": "/api/","backend": {"serviceName": "harbor-harbor-core","servicePort": 80}},{"path": "/service/","backend": {"serviceName": "harbor-harbor-core","servicePort": 80}},{"path": "/v2/","backend": {"serviceName": "harbor-harbor-core","servicePort": 80}},{"path": "/chartrepo/","backend": {"serviceName": "harbor-harbor-core","servicePort": 80}},{"path": "/c/","backend": {"serviceName": "harbor-harbor-core","servicePort": 80}}]}},

注意:

  • 我上面的host设为了localhost,只能允许本地访问,其它机器连接进来是无法访问的。
  • 可以设为外部域名或者将其它机器名称加入/etc/hosts,或者IP地址,就可以提供外部访问了。
    • The IP is ingress node.

3、Docker客户端访问

首先从Harbor的管理界面“系统管理”-“配置管理”-“系统设置”,选择“镜像库根证书”-“下载”,将下载后的文件保存到需要访问Harbor服务的客户端。然后,需要完成Docker的证书配置,登陆到Harbor服务器,就可以推送/下载自己的镜像了。

在客户端:

  • 将ca.crt 复制到 docker 客户端的 /etc/docker/certs.d/yourdomain.com(registry服务器的IP)。例如:
#获取ca.crt文件,如果目录不存在,则需要预先手动创建之。
sudo scp user@192.168.1.8:~/docker/ca.crt /etc/docker/certs.d/192.168.1.8/
  • 重新启动Docker。
sudo systemctl restart docker
  • 使用docker tag重新命名容器镜像。如:
docker tag goharbor/harbor-portal:dev core.harbor.domain/library/harbor-portal:dev
  • 从命令行登陆到Harbro服务器(输入账号:admin/Harbor12345,或者自建的账号):
docker login core.harbor.domain
  • 推送镜像到Harbor服务器:
docker push core.harbor.domain/library/harbor-portal:dev
  • HTTPS服务和客户端的详细配置,请参考:https://my.oschina.net/u/2306127/blog/785281

更多参考:

  • 在Kubernetes集群上部署高可用Harbor镜像仓库
  • Ubuntu安装私有Docker Hub服务Harbor
  • Kubernetes镜像仓库-Harbor的Helm部署
  • 配置Harbor私有Docker镜像服务使用HTTPS
  • Harbor的Docker镜像存储路径修改
  • Docker镜像仓库服务-Nexus
  • 基于Kubernetes的持续交付平台
  • Helm 容器应用包管理工具安装记录
  • 构建功能强大的微数据中心(Micro Data Center)

转载于:https://my.oschina.net/u/2306127/blog/3013861

Harbor快速部署到Kubernetes集群及登录问题解决相关推荐

  1. 如何部署一个Kubernetes集群

    来源 | 无敌码农 责编 | 寇雪芹 头图 | 下载于视觉中国 在上一篇文章<Kubernetes和Docker的关系是什么?>中,和大家分享了关于Kubernetes的基本系统架构以及关 ...

  2. 吊炸天!一行命令快速部署大规模K8S集群!!!

    吊炸天!一行命令快速部署大规模K8S集群!!! 先决条件 请事先准备好几台服务器(测试环境虚拟机即可) 请事先设置好相同的root密码(方便同时操作多服务器) 请事先在Linux安装好docker 请 ...

  3. 想提高运维效率,那就把MySQL数据库部署到Kubernetes 集群中

    摘要:Kubernetes 很多看起来比较"繁琐"的设计的主要目的,都是希望为开发者提供更多的"可扩展性",给使用者带来更多的"稳定性"和& ...

  4. 使用Minikube部署本地Kubernetes集群(二十九)

    前言 使用Minikube部署本地k8s集群相对比较简单,非常推荐将其用于本地k8s开发环境,唯一麻烦点的仅仅是网络问题. 在本篇教程中,我们使用了国内的镜像来完成本地k8s集群的搭建.如果搭建过程中 ...

  5. 如何轻松地将可访问LAN的Pod部署到Kubernetes集群上

    撰者 | Jack Wallen 译者 | Katie,责编 | Jerry 来源 | CSDN云计算 封图 | CSDN 下载自视觉中国 想要在Kubernetes集群上部署可访问LAN的Pod来达 ...

  6. 二进制安装部署 4 kubernetes集群---超详细教程

    二进制安装部署kubernetes集群---超详细教程 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建完成后整理的个人心得,分享给大家~~~ 本文所需的安装包,都上传在我的网盘中,需要的可以 ...

  7. 使用kubeadm快速部署一个K8s集群

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 $ kubeadm i ...

  8. 巧用 K3s 和 Traefik 快速搭建本地 Kubernetes 集群

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 完整的 Kubernetes 集群往往非常复杂,需要较高的资源,往往我们在开发期间需要一个完整的 Kubernet ...

  9. 如何快速部署一个Elasticsearch集群?

    作者:无敌码农 来源:无敌码农 今天的文章给大家介绍下Elasticsearch这一目前在"搜索"和"分析"领域使用十分广泛的技术组件.并演示如何快速构建一个E ...

最新文章

  1. 解决Mask RCNN训练时GPU内存溢出问题
  2. java ssh连接 如何不使用密码_如何在java中为ssh连接设置密码
  3. 剑指offer-二叉搜索树的后序遍历序列
  4. 数据库两个表有一个字段互相关联,根据这个关联字段更新一张表
  5. detected idea启动 web_IDEA使用Tomcat服务器出现乱码问题排查过程
  6. 如何在 Mac 上的“磁盘工具”中使用密码加密和保护储存设备?
  7. SQLite.dll混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
  8. bsp 总结正规流程
  9. 二十五.决策树之CART决策树的原理和sklearn实现
  10. python轮胎缺陷检测_基于深度学习的轮胎缺陷无损检测与分类技术研究
  11. 系统管理Lesson 14. Performing Database Backups
  12. 20.Vaild-Parentheses
  13. sudo进入root权限时,sudo :unable to resolve host me(此为你的Linux登录用户名): Connection timed out.
  14. 使用python中TsTables 软件包追加写入数据出现“pandas.tseries has no attribute‘index‘”的问题
  15. TCP/IP三次握手和四次分手
  16. 转载ubuntu下codeblocks安装及汉化教程
  17. 解决DVWA“reCAPTCHA key: Missing”
  18. 基于html+css+js+jquery的购物页面设计
  19. 串联滞后校正网络的作用_串联滞后校正利用滞后网络的高频幅值
  20. 深度学习中的embedding

热门文章

  1. MVC源码分析 - 路由匹配
  2. 将一个数的字节顺序逆置
  3. 设计模式之MVC设计模式初阶
  4. 解决安卓TextView高度和textSize大小不一致问题
  5. 软考信息系统项目管理师_项目整体管理---软考高级之信息系统项目管理师010
  6. ARM裸机工作笔记0001---ARM那些事
  7. c++ xml 解析“后直接跟值问题
  8. 排列组合算法之三: 递归法
  9. 随想录(关于aarch64)
  10. 一步一步写算法(之链表重合)