这篇文章主要讲解了“Harbor如何快速部署到Kubernetes集群”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Harbor如何快速部署到Kubernetes集群”吧!
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 master helm install --namespace harbor --name harbor .
但是,对于多节点的Kubernetes集群来说,还需要解决几个问题:
镜像下载。因为Harbor使用的容器镜像多达10个(其中registry会用到多个容器镜像),会被集群分别调度到多个节点上运行,需要保证所有的节点都有需要的容器镜像,会带来大量的下载流量,完整运行起来的时间比较长。最好是在一个节点上下载,然后上传到所有节点。
网络存储。在Kubernetes集群中pod是可以漂移的,需要保证漂移后的容器仍然能够连续访问存储。
登陆问题。Kubernetes提供了多种服务暴露方法,但目前NodePort等的授权与后台服务会不一致,从而登录失败,提示“ 不正确的用户名或密码”。
使用下面的脚本预先下载镜像:
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运行情况。
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-0 namespace: harbor spec: capacity: storage: 8Gi accessModes: - ReadWriteMany hostPath: path: /home/supermap/harbor/data-harbor-harbor-redis-0
创建Redis的存储pvc配置文件:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: data-harbor-harbor-redis-0 namespace: harbor spec: accessModes: - ReadWriteMany resources: 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.yaml kubectl apply -f 1a-pv-data-harbor-harbor-redis-0.yaml kubectl apply -f 1b-pvc-data-harbor-harbor-redis-0.yaml kubectl apply -f 2a-pv-database-data-harbor-harbor-database-0.yaml kubectl apply -f 2b-pvc-database-data-harbor-harbor-database-0.yaml kubectl apply -f 3a-pv-harbor-harbor-chartmuseum.yaml kubectl apply -f 3b-pvc-harbor-harbor-chartmuseum.yaml kubectl apply -f 4a-pv-harbor-harbor-jobservice.yaml kubectl apply -f 4b-pvc-harbor-harbor-jobservice.yaml kubectl apply -f 5a-pv-harbor-harbor-registry.yaml kubectl apply -f 5b-pvc-harbor-harbor-registry.yaml echo "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。
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
因为GlusterFS不支持PostgreSQL的结构化数据:
临时解决办法:将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 harbor NAME 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运行失败,则需要检查存储的容量和路径是否设置正确,请修改之,确保存储完全可用。
系统默认安装参数是使用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.
首先从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
感谢各位的阅读,以上就是“Harbor如何快速部署到Kubernetes集群”的内容了,经过本文的学习后,相信大家对Harbor如何快速部署到Kubernetes集群这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。