HarBor是vmware,在github中开源出私有镜像的项目,也是在开源领域里作为私有镜像仓库,以及容器镜像的制品库这一层面的项目代表。它是我们经常能遇见的一个项目。
公司在内部将自己的源代码打包成镜像的时候,需要将自己打包的镜像上传到自己可以控制的地方,如果发布到hub.docker. com里面,全世界所有的人都可以下载,这种情况是它们所不希望的。所以就引出来下面这么一套架构。
在公司内部实现其私有的镜像仓库
首先会有nginx去代理多台harbor的主机,可以用harborA,B实现私有镜像仓库的搭建,可以有多台,这个私有镜像仓库,支持k8s集群大概能支持5000多台的拉取,5000台k8s node节点去拉取harbor里的镜像,harbor是可以承受住的,大概上线是在10台harbor,10个harbor被一个负载均衡器负载,对于harbor内部而言,还要把内部的用户信息,及镜像的tar信息镜像存储的文件层数信息以及相应的哈希值,将其存到一个数据库叫pastgresql,(和mysql所起到的意义一样,比mysql的性能要高很多)两台harbor在拉取镜像的时候所去缓存住的一些信息要把它放到redis里。为了保证redis的稳定性,肯定要放一台redis-cluster。mysql的集群最少3台,postgresql最少是5台机器构成一个集群,在上方nginx还要做好备用机,keepalived做心跳检测,保证其高可用,集群内部没有单点。
十台harbor要把镜像文件存储到相同的地方,而且每次读到的文件都是相同的。还需要有一个共享存储,比如nfs,分布式存储产品ceph/glusterfs(专门应用在k8s外部存储,向内提供存储空间)。在内网中(harbor)推荐用nfs。也就是所有的harbor将镜像的文件会从nfs的共享目录中读取,以及从nfs的共享目录中,由harbor拉取提供给nginx,返回给用户。这些文件都会由nfs提供,而且harbor里面一些必要的用户信息,镜像信息等等,harbor都会去到postgresql进行拉取,在包括多台harbor里涉及到的一些镜像相关的缓存,包括用户之间的一些筛选这些信息都会存到redis-cluster中。
现在单做实验,这个项目中所需要的机器一台nginx,两台harbor,一台redis,一台postgresql,一台nfs。六台机器。
如果内存不够可以缩减一下,nginx一台,harbor两台,redis,postgresql,nfs三个放到一台机器。客户端一台(进行拉取镜像,推送镜像的测试)。

生产中所需要的机器:两台nginx 10台harbor 6台redis-cluster postgresql单独成一个集群最小需要5台机器 nfs只需要一台nfs服务器就ok 在生产中这个架构最小的机器台数大概在24台。
配置:nginx比较吃cpu,内存所以对于cpu内存一般给到4核16G 两台8核32G
由于harbor内部运行的是容器,所以它内部可能发生资源的争抢,官方推荐最小的配置是4核4G,而在生产中为了达到一定的效果一般会调整为4核16G,让它稳定的运行。
redis-cluster 每台机器要给64G,
postgresql :吃cpu,内存,磁盘要大
nfs:主要吃网络,io, 网口要给到万兆,存储要巨大:最好给到TB
在阿里云创建的最大节点数是5000(直接买)五套集群,40w,1套正在用,4套灾备,其中一套挂了,另外的立马顶上,
nginx一台,harbor两台,redis,postgresql,nfs三个放到一台机器。客户端一台
harbor 4GB 剩下三台1GB
在redis机器

yum -y install nfs-utils 安装nfs的驱动
mkdir -p /data/harbor 在本地创建一个目录
vi /etc/exports 对目录进行一个共享

systemctl enable --now nfs 启动
启动完nfs去harborA,B这两台机器,将nfs共享目录挂到这两台机器


[root@harbor-a ~]# mkdir -p /data/harbor 在harborA创建相同的目录(防止混乱)
[root@harbor-a ~]# vi /etc/fstab
挂载到本地的/data/harbor

[root@harbor-b ~]# mkdir -p /data/harbor
[root@harbor-b ~]# vi /etc/fstab


证明nfs构建好了,而且这两台机器harborA,B /data/harbor所读取到的内容全部来自于nfs这台机器data/harbor。统一了它们的文件路径,内容。

[root@redis ~]# cat redis_install.sh

[root@redis ~]# vi /usr/local/redis/etc/redis.conf


redis安装完毕。
[root@redis ~]# yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm 把它装到机器里

yum makecache 先看最近有没有版本更新,建议装新版,因为这个新版bug比较少,用的时候和mysql差不多,都是sql语句,相对mysql来说它的性能很强悍。

[root@redis ~]# yum install -y postgresql14-server
[root@redis ~]# /usr/pgsql-14/bin/postgresql-14-setup initdb 做数据库的初始化

确保启动它启动成功,然后调配置。
[root@redis ~]# vi /var/lib/pgsql/14/data/postgresql.conf

[root@redis ~]# vi /var/lib/pgsql/14/data/pg_hba.conf

md5是一种密码的授权方式,在postgresql数据库中,创建出的用户就可以连接到我们的数据库去控制数据库。
[root@redis data]# systemctl restart postgresql-14 重启让配置生效

装好了postgresql
yum -y install nginx
[root@nginx ~]# vi /etc/nginx/conf.d/default.conf
[root@nginx ~]# mkdir /etc/nginx/certs/
生成证书
certbot certonly --manual --preferred-challenges dns -d harbor.gg.icu 签证三级域的证书(如果报错连自己手机热点下载)
[root@nginx harbor.gkjt.work]# systemctl restart nginx
安装harbor
含义: 对企业内的镜像进行统一的管理,并且harbor还带有用户管理功能, 并且还具备LDAP用户管理域接入功能;
1.事先在两台harbor机其中安装好docker, 并配置好加速器
装harbir之前装好docker,因为harbor所有的服务都是以容器的形式运行,
[root@harbor-a ~]# cd /etc/yum.repos.d
[root@harbor-a yum.repos.d]# wget https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo 下载仓库
[root@harbor-a yum.repos.d]# sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' docker-ce.repo 改源地址,对docker版本没要求,最新版最好。
[root@harbor-a yum.repos.d]# yum makecache fast
[root@harbor-a yum.repos.d]# yum -y install docker-ce
配置镜像加速器
将默认的替换成cn
[root@harbor-a docker]# vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
[root@harbor-a docker]# systemctl daemon-reload
[root@harbor-a docker]# systemctl restart docker.service
harbor-B 同样的操作
2.安装docker-compose 单台机器中的容器编排,单台机器中的容器编排工作,有时候并不是启动一个容器就满足我们的业务场景,要连续启动多个就需要使用docker-compose。docker-compose就是用于把多个容器同时在一个宿主机上启动起来的工具,类似把docker写成一个脚本。
[root@harbor-a docker]# wget https://mirrors.hiops.icu/packages/docker-compose-linux-x86_64 --no-check-certificate
[root@harbor-a docker]# mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
[root@harbor-a docker]# chmod a+x /usr/local/bin/docker-compose
[root@harbor-a docker]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
下载harbor的离线安装包
[root@harbor-a docker]# wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v2.5.3/harbor-offline-installer-v2.5.3.tgz
[root@harbor-a docker]# tar xf harbor-offline-installer-v2.5.3.tgz -C /usr/local/ 解压

[root@harbor-a harbor]# vi harbor.yml 修改配置文件

https不要,https在做加密的时候传输速度慢,在内网里没有必要做加密(尤其是私有镜像仓库,只有公司能访问到,所以没必要加https,注释掉)

external_url : https://harbor.ggjt.work


# Uncomment external_database if using external database.
external_database:
harbor:
host: <postgresql_address>
port: 5432
db_name: harbor
username: harbor
password: 1123!!
ssl_mode: disable
max_idle_conns: 2
max_open_conns: 0
notary_signer:
host: <postgresql_address>
port: 5432
db_name: notary_signer
username: notary_signer
password:1123!!
ssl_mode: disable
notary_server:
host: <postgresql_address>
port: 5432
db_name: notary_server
username: notary_server
password: 11123!!
ssl_mode: disable# Uncomment external_redis if using external Redis server
external_redis:
# support redis, redis+sentinel
# host for redis: <host_redis>:<port_redis>
# host for redis+sentinel:
# <host_sentinel1>:<port_sentinel1>,<host_sentinel2>:<port_sentinel2>,<host_sentinel3>:<port_sentinel3>
host: <redis_address>:6379
#password:
# sentinel_master_set must be set to support redis+sentinel
#sentinel_master_set:
# db_index 0 is for core, it's unchangeable
registry_db_index: 1
jobservice_db_index: 2
chartmuseum_db_index: 3
trivy_db_index: 5
idle_timeout_seconds: 30
:set paste 告诉要粘贴了 再按i : % s/postgresql/192.168.22.200/ 数据库的ip



postgres=# CREATE DATABASE harbor;
CREATE DATABASE
postgres=# CREATE DATABASE notary_signer;
CREATE DATABASE
postgres=# CREATE DATABASE notary_server;
CREATE DATABASEpostgres=# CREATE USER harbor WITH PASSWORD 'Harbor123!!';
CREATE ROLE
postgres=# CREATE USER notary_signer WITH PASSWORD 'Harbor123!!';
CREATE ROLE
postgres=# CREATE USER notary_server WITH PASSWORD 'Harbor123!!';
CREATE ROLEpostgres=# GRANT ALL PRIVILEGES ON DATABASE harbor TO harbor;
GRANT
postgres=# GRANT ALL PRIVILEGES ON DATABASE notary_signer TO notary_signer;
GRANT
postgres=# GRANT ALL PRIVILEGES ON DATABASE notary_server TO notary_server;

postgresql数据库创建完了,跟配置文件对应起来了。
[root@harbor-a harbor]# ./prepare 运行它,做一部分的准备工作,生成一系列的配置文件

[root@harbor-a harbor]# ./install.sh 将harbor涉及到的容器进程启动起来



【注意】少熬夜,多看书。
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案
我正在尝试获得良好的Ruby编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但是现在我偶然发现了这个:classMyClass上面的代码导致错误privatemethodsanitize_namecalled但是当删除self.并仅使用sanitize_name时,它会起作用。这是为什么? 最佳答案 发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说self.sanitize_name是显式指定应该接收sanitize_name的对象(self),而不是依赖于隐式接收器(也是
来自Java,我正在尝试在Ruby中实现LinkedList。我在Java中实现它的通常方法是有一个名为LinkedList的类和一个名为Node的私有(private)内部类,其中LinkedList的每个对象都作为Node对象。classLinkedListprivateclassNodeattr_accessor:val,:nextendend我不想将Node类暴露给外部世界。然而,通过Ruby中的这个设置,我可以使用这个访问LinkedList类之外的私有(private)Node类对象-node=LinkedList::Node.new我知道,在Ruby1.9中,我们可以使用
您好,我正在尝试创建一个帮助程序,用于将ruby方法大量定义为私有(private)类方法。通常,可以通过使用private_class_method键工作将方法定义为私有(private)类方法。但我想创建一个以下样式的助手:classPersondefine_private_class_methodsdodefmethod_oneenddefmethod_twoendendend我计划通过以下方式动态定义它,但根本不起作用:classObjectdefself.define_private_class_methods&blockinstance_evaldoprivate&bl
在另一个对象中注册该对象后,我需要将一些实例方法设为私有(private)。我不想卡住对象,因为它必须保持可编辑状态,只是功能较少。而且我不想取消定义这些方法,因为它们是在内部使用的。我需要的是这样的:classMyClassdefmy_methodputs"Hello"endenda=MyClass.newb=MyClass.newa.my_method#=>"Hello"a.private_instance_method(:my_method)a.my_method#=>NoMethodErrorb.my_method#=>"Hello"有什么想法吗?
最好用一个例子来解释:文件1.rb:deffooputs123end文件2.rb:classArequire'file1'endA.new.foo将给出错误“':调用了私有(private)方法'foo'”。我可以通过执行A.new.send("foo")来解决这个问题,但是有没有办法公开导入的方法?编辑:澄清一下,我没有混淆include和require。另外,我不能使用正常包含的原因(正如许多人正确指出的那样)是因为这是元编程设置的一部分。我需要允许用户在运行时添加功能;例如,他可以说“run-this-app--includefile1.rb”,应用程序的行为将根据他在file1
我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss
我是Ruby新手,来自C#世界。在C#中,这样做是合法的:publicclassTest{publicvoidMethod(){PrivateMethod();}privatevoidPrivateMethod(){PrivateStaticMethod();}privatestaticvoidPrivateStaticMethod(){}}是否可以在Ruby中做类似的事情?一些背景知识:我有一个Rails应用程序...其中一个模型有一个私有(private)方法来设置一些依赖项。有一个类方法可以创建模型的初始化实例。由于遗留原因,模型的某些实例未正确初始化。我添加了一个实例方法来初始