Harbor快速部署到Kubernetes集群及登录问题解决
Harbor(https://goharbor.io)是一个功能强大的容器镜像管理和服务系统,用于提供专有容器镜像服务。随着云原生架构的广泛使用,原来由VMWare开发的Harbor也加入了云原生基金会(参考《Harbor最新进展,将由CNCF管理 》,项目地址已经变为 https://github.com/goharbor),成为云原生的生态系统的重要组成部分。
1、快速安装
Harbor可以支持容器部署和Kubernetes部署。从Harbor 1.6开始,项目提供了Kubernetes的集群化部署方法,可以使用Helm()快速进行部署,基于Kubernetes集群管理机制进行动态调度。如下:
cd harbor-helm
git checkout master
helm 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-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://www.yongshi123.cn 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."
下面列出正常运行后,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运行失败,则需要检查存储的容量和路径是否设置正确,请修改之,确保存储完全可用。
2.3 登陆问题
系统默认安装参数是使用Ingress提供服务入口的。虽然文档中说明可以使用nodePort和LoadBalancer来设置服务harbor-harbor-portal的类型,但实际操作中发现,输入账号 admin和密码Harbor12345后,始终会提示 “账号会密码不正确”,导致无法正常登陆到系统。
问题报告和解决办法参见:
Invalid user name or password,https://dasheng178.com github.com/ www.tiaotiaoylzc.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":www.mytxyl1.com "harbor-harbor-portal",
"servicePort": 80
}
},
{
"path": "/api/",
"backend": {
"serviceName": www.tianchenyul1.com"harbor-harbor-core",
"servicePort": 80
}
},
{
"path": "/service/",
"backend": {
"serviceName":www.xinghaiyule1.com "harbor-harbor-core",
"servicePort": 80
}
},
{
"path": "/v2/",
"backend": {
"serviceName": "harbor-harbor-core",
"servicePort": 80
}
},
{
"path": "/chartrepo/",
"backend": {
"serviceName":www.yongshiyule178.com/ "harbor-harbor-core",
"servicePort": 80
}
},
{
"path": "/c/",
"backend": {
"serviceName":www.fengshen157.com/ "harbor-harbor-core",
"servicePort": 80
}
}
]
}
},
注意:
我上面的host设为了localhost,只能允许本地访问,其它机器连接进来是无法访问的。
可以设为外部域名或者将其它机器名称加入/etc/hosts,或者IP地址,就可以提供外部访问了。
更多参考:
在Kubernetes集群上部署高可用Harbor镜像仓库
Ubuntu安装私有Docker Hub服务Harbor
Kubernetes镜像仓库-Harbor的Helm部署
配置Harbor私有Docker镜像服务使用HTTPS
Harbor的Docker镜像存储路径修改
Docker镜像仓库服务-Nexus
基于Kubernetes的持续交付平台
Helm 容器应用包管理工具安装记录
构建功能强大的微数据中心(Micro Data Center)
Harbor快速部署到Kubernetes集群及登录问题解决的更多相关文章
- 快速部署一个Kubernetes集群
官方提供的三种部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用. 部署地址:https:// ...
- 第3章:快速部署一个Kubernetes集群
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点$ kubeadm in ...
- 使用Minikube部署本地Kubernetes集群(二十八)
前言 使用Minikube部署本地k8s集群相对比较简单,非常推荐将其用于本地k8s开发环境,唯一麻烦点的仅仅是网络问题. 在本篇教程中,我们使用了国内的镜像来完成本地k8s集群的搭建.如果搭建过程中 ...
- 用Docker swarm快速部署Nebula Graph集群
用Docker swarm快速部署Nebula Graph集群 一.前言 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群. 二.nebula集群搭建 2.1 环境准 ...
- ingress-nginx 的使用 =》 部署在 Kubernetes 集群中的应用暴露给外部的用户使用
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247488189&idx=1&sn=8175f067 ...
- Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群
前言 前面用到过的 minikube 只是一个单节点的 k8s 集群,这对于学习而言是不够的.我们需要有一个多节点集群,才能用到各种调度/监控功能.而且单节点只能是一个加引号的"集群&quo ...
- kubeadm部署一个Kubernetes集群
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具.这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 $ kubeadm in ...
- 使用 Kubeadm+Containerd 部署一个 Kubernetes 集群
本文独立博客阅读地址:https://ryan4yin.space/posts/kubernetes-deployemnt-using-kubeadm/ 本文由个人笔记 ryan4yin/knowle ...
- docker swarm快速部署redis分布式集群
环境准备 四台虚拟机 192.168.2.38(管理节点) 192.168.2.81(工作节点) 192.168.2.100(工作节点) 192.168.2.102(工作节点) 时间同步 每台机器都执 ...
随机推荐
- bcd引导Ubuntu
下面步骤就是创建Windows的启动项了. 以管理员身份打开CMD, 然后输入 bcdedit /create /d "ubuntu" /application bootsecto ...
- PropertyGrid中的枚举显示为中文
参考http://www.cnblogs.com/yank/archive/2011/09/17/2179598.html 在上述文档的基础上做了改进.从EnumConverter类派生 显示效果: ...
- 记一次线上gc调优的过程
近期公司运营同学经常表示线上我们一个后台管理系统运行特别慢,而且经常出现504超时的情况.对于这种情况我们本能的认为可能是代码有性能问题,可能有死循环或者是数据库调用次数过多导致接口运行 ...
- 浅谈!DOCTYPE声明的作用?严格模式与混杂模式的区别?
!DOCTYPE的作用: DOCTYPE是Document Type(文档类型)的缩写,<!DOCTYPE>声明必须是html文档的第一行,位于<html>标签之前.<! ...
- 王者荣耀交流协会PSP Daily项目Postmortem结果
王者荣耀交流协会PSP Daily项目Postmortem结果 整理:王超 设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? PSP D ...
- cnblogs.com用户体验
一.是否提供了良好的体验给用户(同时提供价值)? 首先我觉得博客园给我们这些用户提供了良好的用户体验,博客园提供了一个纯净的技术交流空间,在这里我们可以找到几乎所有与IT技术有关的博文,而且可以在这里 ...
- HTTP&HTTPS、GET&POST
1.HTTP&HTTPS: HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure ...
- static作用(修饰函数、局部变量、全局变量)
转自:http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作 ...
- 【OSG】将显示的图形窗口化
窗口化原理 有时为了方便控制场景渲染,需要设置一个合适的图形环境窗口(即窗口化). 创建图形环境的主要步骤如下: (1)通过WindowingSystemInterface类得到系统窗口接口,该系统接 ...
- 0523 Scrum项目6.0
0523 团队项目6.0 一,组员任务完成情况 首页设计初步完成但是需要优化界面,只能简单的输出信息和在首页进行登录.界面极其简单.使用了Javabean的设计模式,进行改进,使得页面的里的代码看起来 ...