• HarBor私有镜像仓库


    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。统一了它们的文件路径,内容。

    安装redis

    [root@redis ~]# cat redis_install.sh  

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

     redis安装完毕。

    安装postgresql

    [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

    安装nginx

     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
     含义: 对企业内的镜像进行统一的管理,并且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:
        port: 5432
        db_name: harbor
        username: harbor
        password: 1123!!
        ssl_mode: disable
        max_idle_conns: 2
        max_open_conns: 0
      notary_signer:
        host:
        port: 5432
        db_name: notary_signer
        username: notary_signer
        password:1123!!
        ssl_mode: disable
      notary_server:
        host:
        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 for redis+sentinel:
      #  :,:,:
      host: :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 DATABASE

    postgres=# 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 ROLE

    postgres=# 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数据库创建完了,跟配置文件对应起来了。

    回到harbor中

    [root@harbor-a harbor]# ./prepare 运行它,做一部分的准备工作,生成一系列的配置文件

     

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

     

     【注意】少熬夜,多看书。

  • 相关阅读:
    Mysql服务器主从同步搭建
    DAO和增删改查通用方法-BasicDao
    学习Python第一天 ---Hello World
    【前端学习】—ES6新增的方法有哪些(十五)
    leetcode 460. LFU 缓存
    解决虚拟机centos8无法连接外网,ping: www.baidu.com: 未知的名称或服务
    视频转GIF:快速生成有趣的动态图片
    Java Math.sin()方法具有什么功能呢?
    【Android-Jetpack进阶】6、WorkManager 后台线程、一次性、周期性、任务链的 Work
    vue项目部署到服务器上
  • 原文地址:https://blog.csdn.net/weixin_53150440/article/details/127811855