HarborCDN技术分析

一、介绍

  1. 简要介绍

​​Harbor​​ 是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。Harbor 的所有组件都在 Dcoker 中部署,所以 Harbor 可使用 Docker Compose 快速部署。

CDN的全称是Content Delivery Network,即​​内容分发网络​​。使用户可就近取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。

  1. 应用场景

harbor

  • 基于角色的访问控制(Role Based Access Control)
  • 基于策略的镜像复制(Policy based image replication)
  • 镜像的漏洞扫描(Vulnerability Scanning)
  • AD/LDAP集成(LDAP/AD support)
  • 镜像的删除和空间清理(Image deletion & garbage collection)
  • 友好的管理UI(Graphical user portal)
  • 审计日志(Audit logging)
  • RESTful API
  • 部署简单(Easy deployment)

CDN

  • 网页加速
  • 流媒体加速
  • 大文件加速
  • 应用协议加速

二、架构原理

组网图及架构说明

Harbor大致模块工作原理见下图:

Harbor依赖的外部组件
  • Nginx(即Proxy代理层): Nginx前端代理,主要用于分发前端页面ui访问和镜像上传和下载流量; Harbor的registry,UI,token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
  • Registry v2: 镜像仓库,负责存储镜像文件; Docker官方镜像仓库, 负责储存Docker镜像,并处理docker push/pull命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token进行解密验证。
  • Database(MySQL或Postgresql):为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
Harbor自有组件
  • Core services(Admin Server): 这是Harbor的核心功能,主要提供以下服务:
  • UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。
  • webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。
  • Auth服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
  • API: 提供Harbor RESTful API
  • Replication Job Service:提供多个 Harbor 实例之间的镜像同步功能。
  • Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。

核心组件

  • Proxy:一个nginx的前端代理,代理Harbor的registry,UI, token等服务。-通过深蓝色先标识
  • db:负责储存用户权限、审计日志、Dockerimage分组信息等数据。
  • UI:提供图形化界面,帮助用户管理registry上的镜像, 并对用户进行授权。
  • jobsevice:jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。通过紫色线标识
  • Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置。通过灰色线标识;
  • Registry:镜像仓库,负责存储镜像文件。当镜像上传完毕后通过hook通知ui创建repository,上图通过红色线标识,当然registry的token认证也是通过ui组件完成。通过红色线标识
  • Log:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。过docker的log-driver把日志汇总到一起,通过浅蓝色线条标识

CDN(内容分发网络)

架构原理分析

工作原理就是ansible程序调用读取/etc/ansible/ansible.cfg配置文件获取主机列表清单 /etc/ansible/hosts文件,获取所要处理的主机列表,然后查看剧本任务,再根据剧本中一系列任务生成一个临时的脚本文件,然后将该脚本文件发送给所管理的主机,脚本文件在远程主机上执行完成后返回结果,然后删除本地临时文件。

ansible分为两种工作模式:

一是adhoc(点对点模式):此模式相当于对管理主机执行单个的shell命令

如当本地管理远端主机(IP:172.16.80.101)执行​ansible 172.16.80.101 -a "/sbin/reboot"​,就可以通过ssh传输命令,把172.16.80.101这台主机重启了。

二是playbook(剧本模式):该模式应用较多,该模式是指将一系列任务整合形成一个剧本,以此来达成某种功能(譬如部署某个服务,数据库备份等)的目的。有点像shell脚本。

ansible内部模块实现幂:

通过代码做检查来实现,以copy 模块为例:

如果文件已经存在,且md5一样,则不执行操作,即 changed = False;否则开始文件copy,copy成功后,changed = Ture。

三、使用指南

使用软硬环境

硬件要求

支持硬件

类型

要求

服务器

ARM/X86

【注:有其他特殊要求的请在列表下面添加行,如内存: 不小于16G】

实验硬件

类型

实验使用

服务器

ARM

【注:有其他特殊要求的请在列表下面添加行,如内存: 不小于16G】

软件要求

依赖软件列表

类型

要求版本

操作系统

Redhat系或ubuntu系的系统

python

不小于3.6

ansible

2.11.12

实验软件版本

类型

实验版本

操作系统

Kylin-Server-V10

python

3.7

ansible

2.11.12

安装部署

【若已有安装部署手册,可以见安装部署手册】

ansible安装比较简单,使用使用pip3一键安装即可,步骤如下:

pip3 install ansible==2.11.12

安装完后查看版本

使用步骤

ansible配置文件关键配置介绍

/etc/ansible/ansible.cfg 应用程序主配置文件:

inventory :管理的主机清单文件路径
library:ansible的模块存放的目录
remote_tmp:上述工作原理中提到的将脚本发送至对端的临时目录
local_tmp:上述工作原理中提到本地生成脚本存放的临时目录
forks:并发连接数,默认为5
sudo_user :命令执行用户
remote_port :定义了Ansible的通信端口,默认为22。
host_key_checking:设置是否检查SSH主机的密钥,默认为false
timeout :ssh连接被管理主机的超时时间
log_path:ansilbe日志文件路径

/etc/ansible/hosts配置文件(Host Inventory定义管控主机):

Ansible 可以同时操作一个组的多台主机。组和主机之间的关系通过inventory文件 配置。默认路径为/etc/ansible/hosts。

/etc/ansible/hosts 文件的格式与windows的ini配置文件类似

#基本定义
mail.example.com                            #直接指定某个主机

[webservers]                                #组名
foo.example.com                             #组成员
bar.example.com                             #组成员

[dbservers]                                 #组名
one.example.com:9527                        #指定非标准ssh端口
foo.example.com                             #同一台主机,可以属于多个组
172.16.80.100                               #直接用主机IP
#批量host简写
db-[a:f].example.com                        #简写字母范围   
db-[1:20].example.com                       #简写数字范围   
#主机和变量。在定义主机时,还可以把变量传递给主机,这些变量可以用在 playbooks中
[atlanta]
#http_port、maxRequestsPerChild是变量名
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
#组和变量。注意,要先定义组
[websuvs]
web1.example.com 
web2.example.com 

[websuvs:vars]
http_port=8080
https_port=443
ansible常用命令
#ansible-doc命令
#查看模块使用方法
Usage: ansible-doc [options] [module...]

Options:
  -a, --all             查看所有模块的文档
  -h, --help            查看帮助
  -l, --list            列出所有可用模块
  -M MODULE_PATH, --module-path=MODULE_PATH
                        列出模块路径
  -s, --snippet         获取指定模块的使用信息
  -v, --verbose         详细信息
  --version             查看程序版本
  
 #ansible命令 
 Usage: ansible <host-pattern> [-f forks] [-m module_name] [-a args]

<host-pattern>        指定被管控的主机,需要事先定义在inventory文件中,可以是IP、组,支持模式匹配;all表示所有inventory定义的主机。
[-f forks]            指定线程数,即同时处理的主机数,默认是5
[-m module_name]      指定使用的模块
[-a args]             指明模块的参数

#ansible-playbook
Usage: ansible-playbook playbook.yml
Options:
  -C, --check           干跑playbook.yml,不真正执行

四、常见问题

Q1:执行 ansible-playbook -C httpd_roles.yml 遇到以下问题:

分析:

python2依赖问题。

解决:

通过加上 -e ansible_python_interpreter=/usr/bin/python3 解决

五、资料出处

  1. ​​cloud.tencent.com​​
  2. ​​【Harbor学习笔记】-快速搭建Docker私有仓库​​

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

直击GDC 2024 (二):网易智企首次揭秘篮球游戏AI智能体!

近几日&#xff0c;世界级游戏开发者盛会 GDC&#xff08;Game Developers Conference&#xff09;2024 正在美国举行。全球游戏行业的精英都汇聚于旧金山&#xff0c;共同探索前沿的游戏开发技术、洞察行业最新趋势&#xff0c;并互相交流对未来发展的深刻见解。 &#xff08;…

校园跑腿小程序源码系统多校园版 跑腿达人入驻接单 带完整的安装代码包以及系统部署教程

在数字化时代的浪潮中&#xff0c;校园生活的便捷性和高效性成为了广大师生的共同追求。为了满足这一需求&#xff0c;罗峰给大家分享一款适用于多校园的跑腿小程序源码系统——校园跑腿小程序源码系统多校园版。该系统不仅提供了完整的安装代码包&#xff0c;还附带了详尽的系…

你以为的富贵包其实是脂肪瘤 整形外科医生为你科普脂肪瘤

脖子后面长的包都是富贵包吗&#xff1f;西安国际医学中心医院整形外科门诊主任冯登超曾接诊过一位七旬老人&#xff0c;他的颈部后方有一个直径约13厘米的巨大肿块&#xff0c;核磁共振检查提示右侧劲后皮下软组织内巨大囊性肿块。“他们以为是富贵包&#xff0c;实际上是脂肪…

C语言:给结构体取别名的4种方法

0 前言 在进行嵌入式开发的过程中&#xff0c;我们经常会见到typedef这个关键字&#xff0c;这个关键字的作用是给现有的类型取别名&#xff0c;在实际使用过程中往往是将一个复杂的类型名取一个简单的名字&#xff0c;便于我们的使用。就像我们给很熟的人取外号一样&#xff…

【大模型基础】什么是KV Cache?

哪里存在KV Cache&#xff1f; KV cache发生在多个token生成的步骤中&#xff0c;并且只发生在decoder中&#xff08;例如&#xff0c;decoder-only模型&#xff0c;如 GPT&#xff0c;或在encoder-decoder模型&#xff0c;如T5的decoder部分&#xff09;&#xff0c;BERT这样…

详解Python面向对象编程(一)

类和对象 面向过程——怎么做&#xff1f; &#xff08;1&#xff09;把完成某一需求的所有步骤、从头到尾&#xff0c;逐步实现 &#xff08;2&#xff09;根据开发需求&#xff0c;将某些功能独立的代码块封装成一个又一个的函数 &#xff08;3&#xff09;最后完成的代码&a…

3.3 数据定义 数据库与系统概论

目录 3.3.1 模式的定义与删除 1. 定义模式 2. 删除模式 CASCADE&#xff08;级联&#xff09; RESTRICT&#xff08;限制&#xff09; 3.3.2 基本表的定义、删除与修改 表的定义 2.数据类型 3. 模式与表 4. 修改基本表 5. 删除基本表 3.3.3 索引的建立与删除 1. …

开发者的瑞士军刀:DevToys

DevToys&#xff1a; 一站式开发者工具箱&#xff0c;打造高效创意编程体验&#xff0c;让代码生活更加得心应手&#xff01;—— 精选真开源&#xff0c;释放新价值。 概览 不知道大家是否在windows系统中使用过PowerToys&#xff1f;这是微软研发的一项免费实用的系统工具套…

2024-简单点-pandas

pandas pandas to numpy 尽量不用.values提取数据 numexpr 和 bottleneck加速 布尔操作 describe 自定义describe .pipe df.apply 行或者列级别函数级别应用

pod name 传到容器内部环境变量

背景: 部署skywalking需要管理k8s的pod&#xff0c;需要一个参数-Dskywalking.agent.instance_name 要将podname传递给这个参数 -Dskywalking.agent.instance_name{PODNAME} 通过configmap和secret都无法传递。 在容器里通过这两个命令都可以获取到podname 但在env里这样设置或…

模仿羊羊~消消乐

慎玩&#xff01;随机生成、不保证能消完哦&#xff01; 游戏试玩&#xff1a; 链接: https://pan.baidu.com/s/1IwtOd__8Ca0bSouMP8kEzw 提取码: 6yhd

docker配置镜像加速后容器和镜像消失

一、问题描述 根据阿里云给docker配置镜像加速器 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://gt6j98xi.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl rest…

力扣面试150 Pow(x, n) 快速幂 负指数

Problem: 50. Pow(x, n) 解题方法 &#x1f468;‍&#x1f3eb; 参考题解 复杂度 时间复杂度: O ( l o g 2 n ) O(log_{2}n) O(log2​n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public double myPow(double x, int n){if (x 0.0f)return 0.0d;long b…

最长上升子序列问题

题目&#xff1a;1014. 登山 思路 First 这题也可以看作最长上升子序列&#xff0c;只不过这个序列有三种情况。 先上升&#xff0c;后下降先上升&#xff0c;不下降不上升&#xff0c;直接下降 其实这三种情况我们可以归纳为一种情况&#xff1a;先上升后下降。先上升不下…

C++之多态(二)

一.抽象类 纯虚函数&#xff1a;在虚函数后面加上0就是纯虚函数 作用&#xff1a;纯虚函数规范了派生类必须重写&#xff0c;另外纯虚函数更体现出了接口继承 抽象类定义&#xff1a; 包含纯虚函数的类叫做抽象类&#xff08;也叫接口类&#xff09;&#xff0c;抽象类不能…

Scikit-Learn K近邻分类

Scikit-Learn K近邻分类 1、K近邻分类1.1、K近邻分类及原理1.2、超参数K1.3、K近邻分类的优缺点2、Scikit-Learn K近邻分类2.1、Scikit-Learn K近邻分类API1、K近邻分类 K近邻是一种常用的分类算法。K近邻在机器学习知识结构中的位置如下: 1.1、K近邻分类及原理 K近邻(K-Near…

GoogLeNet论文学习笔记

题目&#xff1a;Going deeper with convolutions 下载地址&#xff1a;GoogLeNet论文 代码&#xff1a;GoogLeNet代码 GoogLeNet在2014年的ISCRC分类比赛中第一名。 创新点 引入Inception结构&#xff08;融合不同尺度的特征信息&#xff09;&#xff1b; 使用1*1的卷积核…

AI:Nvidia官网人工智能大模型工具合集(文本生成/图像生成/视频生成)的简介、使用方法、案例应用之详细攻略

AI&#xff1a;Nvidia官网人工智能大模型工具合集(文本生成/图像生成/视频生成)的简介、使用方法、案例应用之详细攻略 目录 Nvidia官网人工智能大模型工具合集的简介 1、网站主要功能包括: Nvidia官网人工智能大模型工具合集的使用方法 1、SDXL-Turbo的使用 2、GEMMA-7B的…

全志A33编译踩坑!

领导给了个新sdk。然后开编。 编译的标准流程是这样 cd lichee ./build.sh config 这还得了&#xff0c;每次都选很烦&#xff08;虽然只需要选一次&#xff09;&#xff0c;于是新写法是这样 ./build.sh -p sun8iw5p1_android -k linux-3.4 -b evb 果断提示 ERROR: inv…

Intellij IDEA构建Android开发环境

Intellij IDEA创建项目时没有Android的选项 进设置&#xff08;Intellij IDEA - Settings - Plugins &#xff09;