文档章节

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

openthings
 openthings
发布于 02/23 10:20
字数 2250
阅读 44
收藏 3

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 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等系统。

按照推荐的方法,可以通过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后,始终会提示 “账号会密码不正确”,导致无法正常登陆到系统。

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

安装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

更多参考:

© 著作权归作者所有

共有 人打赏支持
openthings
粉丝 297
博文 1094
码字总数 622933
作品 1
东城
架构师
私信 提问
加载中

评论(2)

openthings
openthings
这个信息是ingress发出来的,检查一下ingress的设置。
h
helloypp
您好,请问我的harbor客户端没有“镜像库根证书”-“下载”tab,该如何获取ca.crt。我在登陆时会报如下错误:
Error response from daemon: Get http://core.harbor.domain:port/v2/: error parsing HTTP 404 response body: invalid character 'd' looking for beginning of value: "default backend - 404"
Kubernetes-通过Rancher从Harbor私有仓库拉取镜像

引言   前一篇文章详细描述了如何使用rancher搭建Kubernetes高可用集群,集群搭建好了后,我们就需要开始部署应用了,那么如何从私有镜像仓库拉取镜像呢? 原理   Harbor使用了基于角色的...

statmoon
2018/09/18
0
0
在Kubernetes集群上部署高可用Harbor镜像仓库

在Kubernetes集群上部署高可用Harbor镜像仓库 Tony Bai2017-12-081 阅读 containerCeph 关于 基于Harbor的高可用私有镜像仓库 ,在我的博客里 曾不止一次提到 ,在 源创会2017沈阳站 上,我还...

Tony Bai
2017/12/08
0
0
kubernetes之helm部署harbor

安装 helm 致力于成为k8s集群的应用包管理工具,希望像linux 系统的 那样成功;确实在k8s上部署复杂一点的应用很麻烦,需要管理很多yaml文件(configmap,controller,service,rbac,pv,pvc等等...

喵来个鱼
01/17
0
0
Harbor最新进展,将由CNCF管理

Harbor(https://goharbor.io)是一个企业级的容器镜像仓库管理系统,用于为企业级用户建立私有的容器镜像库,一方面可以对内部安装的网络传输加速,另一方面提供自己特有的版本更好地保证可...

openthings
2018/09/19
0
0
Kubeflow等镜像部署到集群多节点

为了将Kubeflow(https://github.com/kubeflow/kubeflow)/Kubernetes等镜像放到本地集群部署或者更新,需要一系列的操作。如果集群的多个节点同时访问外部镜像服务,将带来较大的并发网络流...

openthings
2018/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如果让你写一个消息队列,该如何进行架构设计?

面试题 如果让你写一个消息队列,该如何进行架构设计?说一下你的思路。 面试官心理分析 其实聊到这个问题,一般面试官要考察两块: 你有没有对某一个消息队列做过较为深入的原理的了解,或者...

李红欧巴
今天
4
0
错题

无知的小狼
今天
2
0
PowerShell因为在此系统中禁止执行脚本的解决方法

参考:window系统包管理工具--chocolatey 报错提示: & : 无法加载文件 C:\Users\liuzidong\AppData\Local\Temp\chocolatey\chocInstall\tools\chocolateyInstall.ps1,因为在此系统上禁止运...

近在咫尺远在天涯
今天
3
0
TP5 跨域请求处理

https://blog.csdn.net/a593706205/article/details/81774987 https://blog.csdn.net/wyk9916/article/details/82315700...

15834278076
今天
3
0
深入理解java虚拟机-Java内存区域与内存溢出异常

深入理解java虚拟机 Java内存区域与内存溢出异常 运行时数据区域 程序计数器 线程私有,内存小,是当前线程执行的字节码行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行...

须臾之余
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部