Harbor的安装与使用

前言

通过 Harbor 项目地址 找到最新的 Release 版本
在这里插入图片描述
因为Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器。在使用的过程中,发现与containerd不能很好地兼容。所以我这边启用了原来的一套基于docker-cri 的K8S高可用服务(3台AlmaLinux 的 master节点,使用IP漂移)来做测试

1. harbor的主要功能

  1. 镜像存储:提供安全可靠的容器镜像存储服务,支持多种容器格式,如 Docker 镜像。
  2. 访问控制:可以对用户和用户组进行精细的访问权限控制,确保只有授权用户能够访问特定的镜像资源。
  3. 镜像复制:支持在不同的 Harbor 实例之间进行镜像复制,方便跨数据中心或不同环境的镜像分发。
  4. 漏洞扫描:能够对上传的镜像进行漏洞扫描,及时发现潜在的安全风险。
  5. 签名验证:支持对镜像进行数字签名,确保镜像的完整性和来源可信。

2. 优势特点

  1. 企业级特性:专为企业环境设计,满足企业对容器镜像管理的高要求,如安全性、可扩展性和高可用性。
  2. 安全保障:通过多种安全机制,如访问控制、漏洞扫描和签名验证,保障容器镜像的安全性。
  3. 易于部署和管理:提供简单易用的安装和管理界面,方便管理员进行配置和维护。
  4. 与容器生态系统集成:与常见的容器编排工具(如 Kubernetes)和持续集成 / 持续部署(CI/CD)工具无缝集成。

3. 应用场景

  1. 企业内部容器化应用部署:为企业内部的容器化应用提供统一的镜像存储和管理平台。
  2. 多云环境下的镜像分发:方便在不同的云平台之间分发容器镜像。
  3. 软件开发和交付流程:在持续集成 / 持续部署流程中,作为可靠的镜像仓库,确保镜像的质量和安全性。

总之,Harbor 是一个功能强大、安全可靠的容器镜像仓库,为企业的容器化应用提供了重要的基础设施支持。
官网地址:https://github.com/goharbor/harbor

安装

方法1

这里单独用一台服务器来部署的 harbor
我目前使用的方法1

1. 先安装 docker 及相关组件

docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

这里直接略过了,这里不讲docker的安装和使用

2. 添加docker镜像配置

这里主要把我们的私有仓库地址配置进去 - insecure-registries

{"registry-mirrors":["https://registry.docker-cn.com","https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com","https://rncxm540.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-opts": {"max-size": "100m"},"insecure-registries": ["192.168.86.100"]
}

配置完成后重启一下
systemctl daemon-reload
systemctl restart docker.service

3. Docker-compose安装

sudo curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#授权
sudo chmod +x /usr/local/bin/docker-compose
#检查
docker-compose --version
#检查 - 提示信息如下
Docker Compose version v2.21.0#如果你的系统提示找不到 docker-compose,你可以创建一个符号链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

4. 签发证书

我这里就把这个步骤省了(因为这里是第二次操作了)
考虑 harbor 一般都会部署在内网,感觉意义不大
如果上生产的话,我肯定会考虑使用 阿里云 或 Docker Registry 之类的

mkdir /data/ssl -p
cd /data/ssl/#生成私钥
openssl genrsa -out ca.key 2048#生成证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.pem#生成域名私钥
openssl genrsa -out weiheng-basic-sevice.key 2048
#生成证书请求 - Common Name 填写主机名
openssl req -new -key weiheng-basic-sevice.key -out weiheng-basic-sevice.csr
#签发证书
openssl x509 -req -in weiheng-basic-sevice.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out weiheng-basic-sevice.pem -days 3650

5. Harbor脚本功能

Harbor安装包文件作用解释:
● prepare - 环境准备
● common.sh - 环境检测脚本,在安装过程中会运行该脚本来检测docker、docker-compose、golang等是否符合要求
● harbor.yml.tmpl - harbor的配置文件模板,可根据该文件生成Harbor的配置文件,譬如密码,持久化位置
● install.sh - 安装脚本

6. 安装

#下载最新的 harbor
#从这个地址去找 https://github.com/goharbor/harbor/releases
wget https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-offline-installer-v2.11.1.tgztar zxvf harbor-offline-installer-v2.11.1.tgz cd harbor
cp harbor.yml.tmpl harbor.yml
vim harbor.yml#修改配置文件:
hostname: weiheng-basic-sevice
#修改 hostname,跟上面签发的证书域名保持一致
#协议用 https - 我这里直接把 https 相关的直接注释掉了,直接使用 http 访问
certificate: /data/ssl/weiheng-basic-sevice.pem
private_key: /data/ssl/weiheng-basic-sevice.key#邮件和 ldap 不需要配置,在 harbor 的 web 界面可以配置, 其他配置采用默认即可
#修改之后保存退出
#harbor 默认的账号密码:admin/Harbor12345#安装
./install.sh#停止 & 重启容器
docker compose down && docker compose up -d

在这里插入图片描述
harbor 安装完成
在这里插入图片描述
上面的https 是之前的一个截图
下面的是 http 直接访问的,可以看到都是OK的
在这里插入图片描述

7. 上传镜像到Harbor

docker login 192.168.86.100
#账户/密码:admin/Harbor12345#给Tomcat镜像打标签
docker tag tomcat:latest 192.168.86.100/test/tomcat:v1#推送到harbor
docker push 192.168.86.100/test/tomcat:v1#删除镜像
docker rmi 192.168.86.100/test/tomcat:v1#从harbor拉取镜像
docker pull 192.168.86.100/test/tomcat:v1

到这一步,如果先拉用docker pull 从harbor 拉取镜像,再通过K8S使用相同的镜像创建资源对象,已经可以成功使用harbor镜像了
但是如果 docker images 里没有该镜像, 直接 k run --image 会出现镜像拉取失败

8. 配置K8S从harbor拉取镜像

参考官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/pull-image-private-registry/

[root@weihengmaster1 ~]# docker login -u admin -p Harbor12345
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
^C[root@weihengmaster1 ~]# docker login -u admin -p Harbor12345 192.168.86.100
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-storesLogin Succeeded
[root@weihengmaster1 ~]# kubectl -n harbor create secret generic harbor  \--from-file=.dockerconfigjson=/root/.docker/config.json  \--type=kubernetes.io/dockerconfigjson#创建私有仓库仓库访问凭据
kubectl -n harbor create secret docker-registry harbor-regcred \--docker-server=192.168.86.100 \--docker-username=admin \--docker-password=Harbor12345 \--docker-email=<email>#检查
kubectl -n harbor get secret harbor-regcred --output=yaml
#查看 dockerconfigjson 明文
kubectl -n harbor get secret harbor-regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode#要了解 auth 字段中的内容,请将 base64 编码过的数据转换为可读格式:
echo "c3R...zE2" | base64 --decode#创建使用私有仓库的po
apiVersion: v1
kind: Pod
metadata:name: private-reg
spec:containers:- name: private-reg-containerimage: 192.168.86.100/test/tomcat:v1imagePullSecrets:- name: harbor-regcrednamespace: harbork create -f private-reg.yaml

在这里插入图片描述
这里可以看到,镜像直接由K8S拉取的,没有存储到本地的 docker images 里

9. 测试

这里给刚才新建的pod expose 一个类型为 NodePort 的 service 然后进行访问尝试
在这里插入图片描述
可以看到是可以正常访问到tomcat的,只不过这里没有找到欢迎页面
那么我进入这个pod手动写入一个 index.jsp

k exec -it private-reg -- /bin/bash

刷新后可以看到
在这里插入图片描述
这里因为使用了IP漂移,所以通过VIP - 192168.86.199 也是可以正常访问的
在这里插入图片描述

到这里我想整个流程已经形成闭环了
harbor安装 -> image上传 -> K8S拉取 harbor 镜像发布成pod

方法2

这是之前安装的,后来舍弃的一个方法,因为当时用的containerd,感觉很不方便
主要体现在harbor 是基于docker的,K8S是基于 containerd 的,镜像间的推送拉取感觉很不方便,欢迎大佬留言赐教
下面是之前本地的一些笔记,现在贴出来做个记录吧

1. 新建一个 Namespace

kubectl create namespace harbor

2. 生成私钥和证书

这一步可以跳过,如果没有设置,harbor会自动生成私钥和证书文件

openssl genrsa -out harbor.key 2048
openssl req -new -x509 -days 3650 -key harbor.key -out harbor.pem

在这里插入图片描述

3. 创建一个 TLS 类型的 Secret 存放证书

kubectl -n harbor create secret tls harbor-tls
–cert=harbor.pem --key=harbor.key

4. 安装NFS

#在主机节点安装nfs服务
sudo apt-get update && sudo apt-get install -y nfs-kernel-server#指定文件共享目录
sudo mkdir /opt/nfs
#创建目录,只允许创建者删除该目录
sudo chmod 1777 /opt/nfs/
sudo bash -c 'echo software > /opt/nfs/hello.txt'#创建共享目录
sudo vim /etc/exports
#添加如下内容 - 权限调整
/opt/nfs/	*(rw,sync,no_root_squash,subtree_check)
/var/nfs/harbor	10.0.0.0/8(rw,sync,no_root_squash,no_subtree_check)#使 /etc/exports 文件重新读取
sudo exportfs -ra#在第二个节点进行测试
#weiheng@weihengworker:~$ sudo apt-get -y install nfs-common
#weiheng@weihengworker:~$ showmount -e weihengcp
#Export list for weihengcp:
#/opt/nfs *
#weiheng@weihengworker:~$ #将远程 /opt/nfs 共享目录挂载到本地 /nfs 目录
#weiheng@weihengworker:~$  sudo mount weihengcp:/opt/nfs /opt/nfs
#weiheng@weihengworker:~$ ls -l /opt/nfs
#total 4
#-rw-r--r-- 1 root root 9 Oct 11 03:41 hello.txt
#weiheng@weihengworker:~$ 

5. 创建PV、PVC

这里只会检查语法,名称或目录不正确不会产生错误,但使用该资源的 Pod 将无法启动
accessModes 目前不会影响实际访问,通常只是作为标签使用

创建PV

vim harbor-pv.yaml
#内容如下
apiVersion: v1
kind: PersistentVolume
metadata:name: harbor-pv
spec:capacity:storage: 13GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /opt/nfsserver: weihengcp   #修改成自己的readOnly: falsekubectl create -f harbor-pv.yamlkubectl get pv

创建PVC


vim harbor-pvc.yaml
#内容如下 - 创建并验证新的 PVC 是否已绑定。
#这里是自动完成PVC和PV的绑定的,K8S控制器会寻找一个符合条件的PV并将其绑定到PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: harbor-pvcnamespace: harbor
spec:accessModes:- ReadWriteManyresources:requests:storage: 13Gi#创建PVC
kubectl create -f harbor-pvc.yaml#查看PVC
weiheng@weihengcp:/data/work$ k -n harbor get pvc
NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
harbor-pvc   Bound    harbor-pv   13Gi       RWX                           <unset>                 19s
weiheng@weihengcp:/data/work$ #查看PV,是否有被自动绑定上 - 看 CLAIM 字段
weiheng@weihengcp:/data/work$ k get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
harbor-pv   13Gi       RWX            Retain           Bound    harbor/harbor-pvc                  <unset>                          24s
weiheng@weihengcp:/data/work$

6. 安装Harbor

我在Harbor官网上找了一下:https://goharbor.io/docs/2.11.0/install-config/harbor-ha-helm/

#添加仓库
helm repo add harbor https://helm.goharbor.io
#更新
helm repo update
#下载harbor
helm fetch harbor/harbor --untar #编辑修改 values.yaml
weiheng@weihengcp:~/.cache/helm/repository/harbor$ vim values.yaml
#内容如下,就改了几个地方,其他都是用的默认值
expose:type: nodePorttls:enabled: truecertSource: secretauto:commonName: ""secret:#用的自定义的secretsecretName: "harbor-tls"ingress:hosts:core: core.harbor.comkubeVersionOverride: ""className: ""annotations:ingress.kubernetes.io/ssl-redirect: "true"ingress.kubernetes.io/proxy-body-size: "0"nginx.ingress.kubernetes.io/ssl-redirect: "true"nginx.ingress.kubernetes.io/proxy-body-size: "0"labels: {}#这里配的自己 节点名称,因为我这里使用的 expose 类型是 nodePort
externalURL: https://weihengcppersistence:enabled: trueresourcePolicy: "keep"persistentVolumeClaim:registry:#用的自己之前创建的PVCexistingClaim: "harbor-pvc" 	#<-- editstorageClass: ""subPath: "registry"accessMode: ReadWriteManysize: 5Giannotations: {}jobservice:jobLog:existingClaim: "harbor-pvc"	#<-- editstorageClass: ""subPath: "jobservice"accessMode: ReadWriteManysize: 1Giannotations: {}database:existingClaim: "harbor-pvc"		#<-- editstorageClass: ""subPath: "database"accessMode: ReadWriteManysize: 1Giannotations: {}redis:existingClaim: "harbor-pvc"		#<-- editstorageClass: ""subPath: "redis"accessMode: ReadWriteManysize: 1Giannotations: {}trivy:existingClaim: "harbor-pvc"		#<-- editstorageClass: ""subPath: "trivy"accessMode: ReadWriteManysize: 5Giannotations: {}#使用 values.yaml 安装这个chart,查看输出以确保正常运行
weiheng@weihengcp:~/.cache/helm/repository/harbor$ helm --namespace harbor install harbor .
NAME: harbor
LAST DEPLOYED: Fri Oct 11 06:54:03 2024
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 https://core.harbor.com
For more details, please visit https://github.com/goharbor/harbor
weiheng@weihengcp:~/.cache/helm/repository/harbor$#如果安装后发现 Values 中有些配置需要修改,可以在修改完配置后以升级的方式使配置生效
helm --namespace harbor upgrade harbor .#删除测试的资源
#helm uninstall harbor --namespace harbor

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到这里就安装完了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fastbootd模式刷android固件的方法

1. fastbootd追根溯源 Google在Android 10上正式引入了动态分区机制来提升OTA的可扩展性。动态分区使能后&#xff1a;andorid系统可以在开机阶段动态地进行分区创建、分区销毁、分区大小调整等操作&#xff0c;下游厂商只需要规划好super分区的总大小&#xff0c;其内部的各个…

Mid term Review

Partial Fractions 部分分式 有理函数拆分的结果是若干项简单分式的和&#xff0c;这些简单分式被称为部分分式。在积分有理函数&#xff0c;解有理方程&#xff0c;或者处理拉普拉斯变换时特别有用。 有理函数的定义和拆分要求 有理函数必须为真有理式(与真分数的判断条件相…

致茂Chroma61860回收式电网模拟电源

Chroma回收式电网模拟电源 Chroma61830 Chroma61845 Chroma61860 Chroma61800-100 功率规格 61830&#xff1a;30kVA 61845&#xff1a;45kVA 61860&#xff1a;60kVA 61800-100&#xff1a;105kVA 61800-100 (800VLN)&#xff1a;105kVA 电压规格&#xff1a; 0~300V 0~40…

CSS基础知识六(浮动的高度塌陷问题及解决方案)

目录 1.浮动高度塌陷概念 2.下面是几种解决高度塌陷的几种方案&#xff1a; 解决方案一&#xff1a; 解决方案二&#xff1a; 解决方案三&#xff1a; 1.浮动高度塌陷概念 在CSS中&#xff0c;高度塌陷问题指的是父元素没有正确地根据其内部的浮动元素或绝对定位元素来计…

计算机网络:网络层 —— 边界网关协议 BGP

文章目录 路由选择协议动态路由协议边界网关协议 BGPBGP 的基本概念BGP-4 的四种报文 路由选择协议 因特网是全球最大的互联网&#xff0c;它所采取的路由选择协议具有以下三个主要特点&#xff1a; 自适应&#xff1a;因特网采用动态路由选择&#xff0c;能较好地适应网络状态…

风力发电并网系统的相关控制策略

风电作为一种可再生资源&#xff0c;具有低污染、储量大等优点。随着近年来**绿色发展战略的深入实施&#xff0c;我国风力发电技术取得重大进展。风力发电总装机容量机并网规模呈逐年增长趋势&#xff0c;为**工农业生产及居民生活提供了大量电力能源。然而&#xff0c;风力发…

uni-app跨域set-cookie

set-cookie的值是作为一个权限控制的 首先&#xff0c;无论什么接口都会返回一个set-cookie&#xff0c;但未登录时&#xff0c;set-cookie是没有任何权限的 其次&#xff0c;登录接口请求时会修改set-cookie&#xff0c;并且在后续其他接口发起请求时&#xff0c;会在请求头…

【RabbitMQ】03-交换机

1. 交换机 2. Fanout交换机 广播。生产者向exchange发消息 SpringBootTest public class SpringAmqpTest {Autowiredpublic RabbitTemplate rabbitTemplate;Testvoid testSimple() {String exchangName "hmall.fabout";rabbitTemplate.convertAndSend(exchangName…

基于python构造电影neo4j知识图谱

使用pandas构造neo4j电影知识谱图 实现效果 电影知识图谱构造过程 实现过程 import pandas as pd from tqdm import tqdmfrom config import graph, cnndef delete_all():graph.run("MATCH(n) DETACH DELETE(n)")# 创建带属性的节点 def createNode(node, row):try…

曲速磨-干法研磨机、超细研磨机、节能细磨

曲速磨在涂料粉体中的应用广泛&#xff0c;主要体现在提高涂料粉体的品质、生产效率以及适应特殊工艺需求等方面。 1.提高涂料粉体品质 细化颗粒&#xff1a;曲速磨通过研磨媒体(如锆珠)的高速运动&#xff0c;对涂料粉体进行强烈的碰撞、摩擦和剪切作用&#xff0c;从而有效地…

加锁失效,非锁之过,加之错也|京东零售供应链库存研发实践

本文导读 从事京东零售供应链库存业务&#xff0c;库存数量操作增减十分频繁&#xff0c;并且项目开发中会常常遇到各种并发情况&#xff0c;一旦库存数量操作有误&#xff0c;势必给前台销售产生损失影响&#xff0c;因此需要关注对库存数量并发操作下的一致性问题。 大部分…

FileLink如何帮助医疗行业实现安全且高效的跨网文件交换

在当今数字化时代&#xff0c;医疗行业在快速发展的同时&#xff0c;也面临着数据安全和信息流转效率的双重挑战。患者的健康记录、影像数据、检查报告等大量敏感信息需要在不同医院、诊所、实验室和保险公司之间高效、迅速地传递。然而&#xff0c;传统的邮件、传真和纸质文件…

Nginx:我自己的网站

一、Nginx的简介 Nginx是一款轻量的级的HTTP服务器&#xff0c;也是一款邮箱代理服务器&#xff0c;同时具备反向代理&#xff0c;通用TCP/UDP代理功能。 Nginx可以运行在x86、ARM等多种平台上&#xff0c;同时支持Linux、windows等主流的操作系统 二、Nginx的特点 1、支持高并…

qt QDropEvent详解

1、概述 QDropEvent是Qt框架中用于处理拖放释放事件的一个类。它允许开发者在用户界面中更好地管理和处理拖放操作&#xff0c;从而实现交互式和响应式的应用程序。QDropEvent类提供了处理拖放释放事件所需的方法和信号&#xff0c;使得开发者能够轻松地实现拖放功能&#xff…

数据中台一键大解析!

自从互联玩企业掀起了数据中台风&#xff0c;数据中台这个点马上就火起来了&#xff0c;短短几年数据中台就得到了极高的热度&#xff0c;一大堆企业也在跟风做数据中台&#xff0c;都把数据中台作为企业数字化转型的救命稻草&#xff0c;可是如果我告诉你数据中台并不是万能钥…

C++设计模式结构型模式———组合模式

文章目录 一、引言二、组合模式三、总结 一、引言 组合模式是一种结构型设计模式&#xff0c; 可以使用它将对象组合成树状结构&#xff0c; 并且能像使用独立对象一样使用它们。代码实现中涉及了递归调用。组合模式与传统上的“类与类之间的组合关系”没有关联&#xff0c;不…

Maven项目的基础配置:利用IDEA将SpringBoot的项目打包成war文件

文章目录 引言Maven项目的聚合与继承(依赖管理)把项目打包成war包其他打包配置引言 利用IDEA将SpringBoot的项目打包成war文件Maven项目的聚合与继承(依赖管理)Maven项目的聚合与继承(依赖管理) 把项目打包成war包 利用IDEA将SpringBoot的项目打包成war文件:要配置启动…

基于vue框架的的奶茶店预约订单系统3fb55(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,奶茶分类,奶茶信息 开题报告内容 开题报告 题目&#xff1a;基于Vue框架的奶茶店预约订单系统开发 一、研究背景与意义 背景 随着饮品市场的蓬勃发展&#xff0c;奶茶店作为其中的重要组成部分&#xff0c;其业务量和顾客需求持…

Interpreter 解释器模式

1 意图 给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示》解释语言中的句子。 2 结构 AbstactExpression 声明一个程序的解释操作&#xff0c;这个接口为抽象语法树中所有的结点所共享。TemminalExpression 实…

【数据结构】哈希思想详解

目录 前言1. unordered系列关联式容器1.1 unordered_map1.1.1 unordered_map介绍1.1.2 接口说明 1.2 unordered_set 2. 哈希概念3. 哈希冲突4. 哈希函数5. 哈希冲突解决5.1 闭散列5.1.1 闭散列的概念5.1.2 闭散列代码实现 5.2 开散列5.2.1 开散列概念5.2.2 开散列代码实现5.2.3…