首页 > 其他分享 >Helm部署Harbor,实现高可用的镜像仓库(超详细分享)

Helm部署Harbor,实现高可用的镜像仓库(超详细分享)

时间:2023-12-20 19:45:50浏览次数:36  
标签:NFS name Harbor harbor nfs provisioner Helm 镜像

Helm部署Harbor,实现高可用的镜像仓库(超详细分享)

 

前言:从业务场景看Harbor部署
我在前面的文章中介绍了离线安装、在线安装等Harbor的部署方式,但其缺点都是无法做高可用,在实际的业务场景中一旦Harbor服务器异常,将会造成很大的影响。

对应前面的几种部署方式,官方也并没有给出高可用的支持方案,如果要支持,则需要对Harbor有一定程度上的了解。

      对于Harbor的高可用方案,可将Harbor部署在kubernetes集群中,利用其 特点即可实现Harbor的高可用。

 

1、部署说明
1台NFS服务器(可使用kubernetes集群任一节点做NFS服务端)
1个kubernetes集群(1master,2node组成的3节点集群)
操作系统: CentOS-7.8
Harbor版本:2.4.2
 

2、安装Helm
helm是命令行客户端工具,主要用于 Kubernetes 应用中的 chart 的创建、打包、发布和管理。

在kubernetes集群master节点安装

2.1 下载helm二进制包

$ wget https://get.helm.sh/helm-v3.7.2-linux-amd64.tar.gz
$ tar zxvf helm-v3.7.2-linux-amd64.tar.gz
$ cd linux-amd64/
$ cp  helm  /usr/local/bin/

2.2 查看helm版本

$ helm version
version.BuildInfo{Version:"v3.6.3", GitCommit:"d506314abfb5d21419df8c7e7e68012379db2354", GitTreeState:"clean", GoVersion:"go1.16.5"}

2.4 下载Chart包到本地
     因为需要修改的参数比较多,在命令行直接helm install比较复杂,我就将Chart包下载到本地,再修改一些配置,这样比较直观,也比较符合实际工作中的业务环境

1 $ helm search repo harbor         # 搜索chart包
2 NAME          CHART VERSION APP VERSION DESCRIPTION                                       
3 harbor/harbor 1.8.2         2.4.2       An open source trusted cloud native registry th...
4 $ helm pull harbor/harbor   # 下载Chart包
5 $ tar zxvf harbor-1.8.2.tgz   # 解压包

3、创建命名空间
       创建harbor命名空间,将Harbor相关的服务都部署在该命名空间中。

$ kubectl create namespace harbor

4、创建NFS外部供应商
本处使用NFS为存储,需要提供外部供应商,如果你有该供应商,可跳过本步骤。

 1 $ yum  install -y  nfs-utils 
 2 $ systemctl start nfs && systemctl enable nfs  
 3 $ systemctl status nfs
 4 $ chkconfig nfs on              #设置为开机自启
 5 注意:正在将请求转发到“systemctl enable nfs.service”。
 6 $ mkdir  -p  /data/nfs/harbor        #创建共享目录
 7 $ cat /etc/exports
 8 /data/nfs/harbor   10.0.0.0/24(rw,no_root_squash)
 9 $ exportfs -arv            # 使配置文件生效
10 exporting 10.0.0.0/24:/data/v1
11 $ systemctl restart nfs
12 $ showmount  -e localhost                     #检查共享目录信息
13 Export list for localhost:
14 /data/nfs/harbor     10.0.0.0/24

4.2  安装客户端
本处客户端即为kubernets集群的每一个节点,若Pod调度到的节点没有该服务,则无法使用对应的存储卷。

1 $ yum -y install nfs-utils
2 $ systemctl start nfs-utils &&  systemctl enable nfs-utils 
3 $ systemctl status  nfs-utils

4.3 创建运行的sa账号并做RBAC授权

$ vim nfs-provisioner.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
  namespace: harbor
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nfs-provisioner-cr
rules:
 - apiGroups: [""]
   resources: ["persistentvolumes"]
   verbs: ["get", "list", "watch", "create", "delete"]
 - apiGroups: [""]
   resources: ["persistentvolumeclaims"]
   verbs: ["get", "list", "watch", "update"]
 - apiGroups: ["storage.k8s.io"]
   resources: ["storageclasses"]
   verbs: ["get", "list", "watch"]
 - apiGroups: [""]
   resources: ["events"]
   verbs: ["create", "update", "patch"]
 - apiGroups: [""]
   resources: ["services", "endpoints"]
   verbs: ["get"]
 - apiGroups: ["extensions"]
   resources: ["podsecuritypolicies"]
   resourceNames: ["nfs-provisioner"]
   verbs: ["use"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: run-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: harbor
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-cr
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: nfs-role
  namespace: harbor
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get","list","watch","create","update","patch"]

---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-provisioner
  namespace: harbor
subjects:
 - kind: ServiceAccount
   name: nfs-provisioner
   namespace: harbor
roleRef:
 kind: Role
 name: nfs-role
 apiGroup: rbac.authorization.k8s.io

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-proversitioner
  namespace: harbor
spec:
  selector:
    matchLabels:
      app: nfs-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccount: nfs-provisioner
      containers:
      - name: nfs-provisioner
        image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: nfs-client-root
          mountPath: /persistentvolumes
        env:
          - name: PROVISIONER_NAME
            value: example.com/nfs
          - name: NFS_SERVER
            value: 192.168.2.212
          - name: NFS_PATH
            value: /data/nfs/harbor
      volumes:
      - name: nfs-client-root
        nfs:
          server: 192.168.2.212   #  NFS服务端地址
          path: /data/nfs/harbor  # NFS共享目录
vim nfs-provisioner.yaml

部署Deployment使用的镜像是从阿里云拉取的。

创建资源对象:

kubectl apply -f nfs-provisioner.yaml
kubectl -n harbor get pod
nfs-proversitioner-6d66969dbf-n75g5   1/1     Running   0          28m

5、创建存储类(StorageClass)
Harbor的database和redis组件是为有状态服务,需要对Harbor数据做持久化存储。

本处基于NFS创建StorageClass存储类,使用NFS外部供应商可阅读我主页文章,NFS服务器和共享目录为:

- NFS服务器地址:10.0.8.16

- NFS共享目录:/data/nfs/harbor

$ vim harbor-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: harbor-storageclass
  namespace: harbor
provisioner: example.com/nfs    # 指定外部存储供应商
$ kubectl apply  -f harbor-storageclass.yaml
$ kubectl -n harbor  get storageclass
NAME                  PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
harbor-storageclass   example.com/nfs   Delete          Immediate           false                  5s

6、修改values.yaml配置

重点!重点!重点!  踩坑最多的地方来了!

$ cd harbor    
$ ls
cert  Chart.yaml  conf  LICENSE  README.md  templates  values.yaml
$ vim  values.yaml
expose:
  type: nodePort         # 我这没有Ingress环境,使用NodePort的服务访问方式。   
  tls:
    enabled: false    # 关闭tls安全加密认证(如果开启需要配置证书)
...
externalURL: http://192.168.2.11:30002   # 使用nodePort且关闭tls认证,则此处需要修改为http协议和expose.nodePort.ports.http.nodePort指定的端口号,IP即为kubernetes的节点IP地址

# 持久化存储配置部分
persistence:
  enabled: true   # 开启持久化存储
  resourcePolicy: "keep"
  persistentVolumeClaim:        # 定义Harbor各个组件的PVC持久卷部分
    registry:          # registry组件(持久卷)配置部分
      existingClaim: ""
    storageClass: "harbor-storageclass"           # 前面创建的StorageClass,其它组件同样配置
      subPath: ""
      accessMode: ReadWriteMany          # 卷的访问模式,需要修改为ReadWriteMany,允许多个组件读写,否则有的组件无法读取其它组件的数据
      size: 5Gi
    chartmuseum:     # chartmuseum组件(持久卷)配置部分
      existingClaim: ""
      storageClass: "harbor-storageclass"
      subPath: ""
      accessMode: ReadWriteMany
      size: 5Gi
    jobservice:    # 异步任务组件(持久卷)配置部分
      existingClaim: ""
      storageClass: "harbor-storageclass"    #修改,同上
      subPath: ""
      accessMode: ReadWriteOnce
      size: 1Gi
    database:        # PostgreSQl数据库组件(持久卷)配置部分
      existingClaim: ""
      storageClass: "harbor-storageclass"
      subPath: ""
      accessMode: ReadWriteMany
      size: 1Gi
    redis:    # Redis缓存组件(持久卷)配置部分
      existingClaim: ""
      storageClass: "harbor-storageclass"
      subPath: ""
      accessMode: ReadWriteMany
      size: 1Gi
    trivy:         # Trity漏洞扫描插件(持久卷)配置部分
      existingClaim: ""
      storageClass: "harbor-storageclass"
      subPath: ""
      accessMode: ReadWriteMany
      size: 5Gi
...
harborAdminPassword: "Harbor12345"   # admin初始密码,不需要修改
...
metrics:
  enabled: true  # 是否启用监控组件(可以使用Prometheus监控Harbor指标,具体见本专栏文章),非必须操作
  core:
    path: /metrics
    port: 8001
  registry:
    path: /metrics
    port: 8001
  jobservice:
    path: /metrics
    port: 8001
  exporter:
    path: /metrics
    port: 8001
###以下的trace为2.4版本的功能,不需要修改。

 

扩展:

如果不希望安装最新的版本,可以通过以下命令修改镜像版本号来安装指定的版本。

$ helm install  harbor  .  -n harbor        # 将安装资源部署到harbor命名空间
NAME: harbor
LAST DEPLOYED: Mon Apr 11 
NAMESPACE: harbor
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please wait for several minutes for Harbor deployment to complete.
Then you should be able to visit the Harbor portal at http://10.0.24.7:30002
For more details, please visit https://github.com/goharbor/harbor

-n前有个点,表示当前路径。

 

8、服务验证
      安装完成后,需要验证相关组件的服务是否正常!

[root@master ~]# kubectl -n harbor get pod -owide
NAME                                  READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
harbor-core-599b9c79c-g5sxf           1/1     Running   0          24m   10.244.2.59   node2   <none>           <none>
harbor-database-0                     1/1     Running   0          24m   10.244.2.61   node2   <none>           <none>
harbor-jobservice-77ddddfb75-4rxps    1/1     Running   3          24m   10.244.1.55   node1   <none>           <none>
harbor-nginx-74b65cbf94-sr59j         1/1     Running   0          24m   10.244.1.56   node1   <none>           <none>
harbor-portal-7cfc7dc6f9-dkxwd        1/1     Running   0          24m   10.244.1.54   node1   <none>           <none>
harbor-redis-0                        1/1     Running   0          24m   10.244.2.60   node2   <none>           <none>
harbor-registry-556f9dcbb7-8kwq2      2/2     Running   0          24m   10.244.2.58   node2   <none>           <none>
harbor-trivy-0                        1/1     Running   0          24m   10.244.1.57   node1   <none>           <none>
nfs-proversitioner-6d66969dbf-n75g5   1/1     Running   0          31m   10.244.1.53   node1   <none>           <none>

9、登录Harbor UI界面
查看组件服务

[root@master ~]#  kubectl -n harbor get  svc
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
harbor              NodePort    10.105.233.254   <none>        80:30002/TCP        25m
harbor-core         ClusterIP   10.96.36.235     <none>        80/TCP              25m
harbor-database     ClusterIP   10.100.119.167   <none>        5432/TCP            25m
harbor-jobservice   ClusterIP   10.109.113.7     <none>        80/TCP              25m
harbor-portal       ClusterIP   10.101.111.123   <none>        80/TCP              25m
harbor-redis        ClusterIP   10.103.43.191    <none>        6379/TCP            25m
harbor-registry     ClusterIP   10.97.39.105     <none>        5000/TCP,8080/TCP   25m
harbor-trivy        ClusterIP   10.96.77.232     <none>        8080/TCP            25m

使用kubernetes任一节点主机IP和30002端口即可访问UI管理界面。

 

标签:NFS,name,Harbor,harbor,nfs,provisioner,Helm,镜像
From: https://www.cnblogs.com/nb-blog/p/17917327.html

相关文章

  • dockerfile构建镜像
    定制docker镜像的方式有两种:手动修改容器内容,导出新的镜像(前面超哥讲dockersave等)基于Dockerfile自行编写指令,基于指令流程创建镜像。dockerfile简介 镜像是多层存储,每一层在前一层的基础上进行修改;容器也是多层存储,以镜像为基础层,在其基础上加一层作为容器运行时的存......
  • 企业级私有仓库Harbor
    仓库的概念也就是用于存储,docker仓库用于存储镜像。镜像构建完成后,很容易可以在宿主机上运行,但是如果要在其他服务器上运行,则需要考虑镜像的分发,存储的问题。共有/私有/仓库DockerRegistry有两种形式公开,开放给所有用户,提供给所有用户搜索,拉取,提交,更新镜像,还免费保管用户镜......
  • docker 常用基础镜像打包
    JAVADockerfile#8的镜像比较小,但是在某些机器运行可能会有问题#FROMopenjdk:8-jdk-alpine#ARM机器推荐#FROMarm64v8/openjdk:17-jdkFROMopenjdk:17-jdk-alpineENVLANGen_US.UTF-8RUNecho"http://mirrors.huaweicloud.com/alpine/v3.6/main">/etc/apk/reposito......
  • 如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 1
    本系列将分成三个部分,您将学习如何使用Helm在Kubernetes上集成Prometheus和Grafana,以及如何在Grafana上创建一个简单的控制面板。Prometheus和Grafana是Kubernetes最受欢迎的两种开源监控工具。学习如何使用Helm集成这两个工具,使您能够轻松监控Kubernetes集群并......
  • macOS Sonoma 14.2.1 (23C71) 正式版 Boot ISO 原版可引导镜像下载 (安全更新)
    macOSSonoma14.2.1(23C71)正式版BootISO原版可引导镜像下载(安全更新)本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。请访问原文链接:https://s......
  • linux系统,磁盘、镜像、目录挂载和未挂载,查看命令
    查看系统中存在磁盘或镜像、设备lsblk 使用lsblk命令查看系统上的所有块设备信息:blkid blkid命令可以更详细的查看未挂载磁盘,不仅能查看大小,还可以看到其他更多的信息fdisk-lfdisk-l命令可以列出系统中未挂载的所有磁盘,执行该命令后会列出当前系统的所有磁盘,其中......
  • Linux 安装 Harbor Docker镜像仓库&&远程访问
    Harbor是为企业用户设计的容器镜像仓库开源项目,包括了权限管理(RBAC)、LDAP、审计、安全漏洞扫描、镜像验真、管理界面、自我注册、HA等企业必需的功能,同时针对中国用户的特点,设计镜像复制和中文支持等功能。下面介绍如何在Linux安装并且使用cpolar内网穿透工具实现远程访问Har......
  • Harbor 本地docker镜像仓库远程连接(镜像管理零距离!!)
    简单几步,实现本地Harbordocker镜像仓库结合cpolar内网穿透实现远程推送和拉取镜像1.查看本地镜像进入本地Harbordocker仓库,我们可以看到我们的本地镜像,这边方便测试,提前上传了一个镜像  在左侧可以看到推送命令,这里局域网ip没有出现端口,说明默认使用80端口,知......
  • sealer 自定义 k8s 镜像并部署高可用集群
    sealer可以自定义k8s镜像,想把一些dashboard或者helm包管理器打入k8s镜像,可以直用sealer来自定义。sealer部署的k8s高可用集群自带负载均衡。sealer的集群高可用使用了轻量级的负载均衡lvscare。相比其它负载均衡,lvscare非常小仅有几百行代码,而且lvscare只做ipv......
  • helm v3 部署 ingress-nginx
    1、部署helmv3略...()2、添加源并更新[root@master1ingress]#helmrepoaddingress-nginxhttps://kubernetes.github.io/ingress-nginx[root@master1ingress]#helmrepoupdate3、拉取镜像[root@master1ingress]#helmpullingress-nginx/ingress-nginx4、解压并修改......