Harbour1.9 + Nginx Высокие доступности Кластерные Складские Строительные ноты

Docker

Введение в гавань

Harborэто хранение и распространениеDocker镜像корпоративный уровеньRegistryСервер расширяет дистрибутив Docker с открытым исходным кодом, добавляя некоторые необходимые для предприятия функции, такие как безопасность, идентификация и управление. Как частный сервер реестра корпоративного уровня, Harbour обеспечивает лучшую производительность и безопасность. Повысьте эффективность передачи образов, чтобы пользователи могли использовать реестр для создания и запуска среды. Harbour поддерживает репликацию ресурсов изображений, установленных на нескольких узлах реестра.Все образы хранятся в частном реестре, чтобы гарантировать, что данные и интеллектуальная собственность управляются и контролируются во внутренней сети компании. Кроме того, Harbour также предоставляет расширенные функции безопасности, такие как управление пользователями, контроль доступа и аудит активности.

Описание архитектуры

На этот раз NFS используется в качестве общего хранилища для хранения данных, связанных с гаванью, и PostgreSQL и Redis отделены для использования несколькими габаритами, а Nginx используется для балансировки нагрузки.

Если в кластере конечной производственной среды много серверов, а Harbor, который опирается на LB, не может полностью соответствовать требованиям, можно использовать следующую архитектуру для развертывания узлов Harbour более низкого уровня для синхронизации зеркалирования с главного узла, а затем распределять их на производственные серверы.

Описание окружающей среды

  • Операционная система: CentOS 7 (минимальная установка)
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
  • версия программного обеспечения демо-среды
программное обеспечение Версия
Docker 18.06.3-ce
docker-compose 1.25.0-rc2
Harbor 1.9.0
Nginx 1.16.1
PostgreSQL 9.6.14
Redis 4.0.10
  • сеть демонстрационной среды

Здесь в основном проводятся демонстрации высокой доступности Harbour, разделяйте развертывание NFS и DB по требованию.

IP Имя процессора
10.10.1.10 Nginx+NFS+DB
10.10.1.11 Harbor-01
10.10.1.12 Harbor-02

развертывать

Выпустить частный сертификат

Сгенерировать закрытый ключ

Коммерческий сертификат рекомендуется для формальных производственных сред!

использоватьopensslИнструмент для создания закрытого ключа RSA

# openssl genrsa -des3 -out harbor.key 2048
Generating RSA private key, 2048 bit long modulus
.......................+++
......+++
e is 65537 (0x10001)
Enter pass phrase for harbor.key:                   # 输入一个至少4位的密码
Verifying - Enter pass phrase for harbor.key:       # 重复输入密码

Удалитьharbor.keyпароль в

# openssl rsa -in harbor.key -out harbor.key
Enter pass phrase for harbor.key:                 # 输入刚才创建时的密码
writing RSA key

Создать CSR (запрос на подпись сертификата)

# openssl req -new -key harbor.key -out harbor.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn             # 国家
State or Province Name (full name) []:Sichuan    # 地区 
Locality Name (eg, city) [Default City]:Chengdu  # 城市
Organization Name (eg, company) [Default Company Ltd]:akiya  # 组织
Organizational Unit Name (eg, section) []:akiya  # 组织单位
Common Name (eg, your name or your server's hostname) []:akiya    # 常用名可填自己名字或域名
Email Address []:a@b.com                         # 邮件地址

Please enter the following 'extra' attributes
to be sent with your certificate request      
A challenge password []:       # 可留空
An optional company name []:   # 可留空

Создать самоподписанный сертификат

Уведомление: при использовании самоподписанного временного сертификата браузер сообщит, что центр сертификации неизвестен.

# echo subjectAltName = IP:10.10.1.10 > extfile.cnf
# openssl x509 -req -days 365 -in harbor.csr -signkey harbor.key -out harbor.crt -extfile extfile.cnf
Signature ok
subject=/C=cn/ST=Sichuan/L=Chengdu/O=akiya/OU=akiya/CN=akiya/emailAddress=a@b.com
Getting Private key

Сохранить сертификат

Скопируйте сертификат в/www/certsподдерживать

# mkdir -p /www/certs && cp harbor.crt harbor.key /www/certs

Docker

Официальная установка скрипта в один клик

# curl -sSL https://get.docker.com/ | sh

Установить с помощью облачного источника Alibaba

  • Сначала установите необходимые зависимости
# yum -y install yum-utils device-mapper-persistent-data lvm2
  • Добавить информацию об источнике программного обеспечения
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • обновить кеш
# yum makecache fast
  • Запрос версии Docker в библиотеке
# yum list docker-ce --showduplicates | sort -r
已加载插件:fastestmirror
可安装的软件包
 * updates: mirrors.aliyun.com
Loading mirror speeds from cached hostfile
 * extras: mirrors.aliyun.com
docker-ce.x86_64            3:19.03.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.0-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.9-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.8-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.7-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.6-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.5-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.4-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.3-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.0-3.el7                     docker-ce-stable
docker-ce.x86_64            18.06.3.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.2.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.1.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.0.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            18.03.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.3.ce-1.el7                    docker-ce-stable
docker-ce.x86_64            17.03.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos             docker-ce-stable
 * base: mirrors.aliyun.com
  • Установите Docker или установите указанную версию Docker
# yum -y install docker
# yum -y install docker-ce-18.06.3.ce-3.el7
  • Посмотреть версию докера
# docker --version
Docker version 18.06.3-ce, build d7080c1
  • Изменить хранилище Docker для внутренних зеркальных сайтов
# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
  • Начните службу докера и добавьте его в AutoStart
# systemctl start docker
# systemctl enable docker

Compose

composeЭто инструмент командной строки, предоставляемый Docker для определения и запуска приложений, состоящих из нескольких контейнеров. Используя compose, мы можем декларативно определить различные службы приложения через файлы YAML и завершить создание и запуск приложения с помощью одной команды.

По причинам внутренней политики скорость скачивания файлов на зарубежных сайтах может быть низкой, поэтому рекомендуется скачивать файлы локально и загружать их на сервер.

скачатьdocker-composeИ дать исполняемое разрешение

# curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

Посмотреть локальную версию compose

# docker-compose -v
docker-compose version 1.25.0-rc2, build 661ac20e

DB

Поскольку Harbour v1.9.0 использует PostgreSQL, мы также независимо развертываем набор PostgreSQL и Redis.В этой демонстрации используется развертывание Docker, и фактическая производственная среда может выбирать, следует ли развертывать на хосте по мере необходимости.

PostgreSQL

Просмотрев установленныеHarbor v1.9.0Запуск в автономной версииharbor-dbКонтейнер может знать, что на этот раз работает версия PostgreSQL.9.6.14

# docker exec -it harbor-db /bin/bash
postgres [ / ]$ psql
psql (9.6.14)
Type "help" for help.

postgres=# select version();
                                    version
-------------------------------------------------------------------------------
 PostgreSQL 9.6.14 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 6.3.0, 64-bit
(1 row)

Redis

в соответствии софициальная документацияКак описано, для использования Redis требуется версия 4.0.10-1.ph2. Точно так же на этот раз мы также используем docker-compose для развертывания в демонстрационных целях.

yaml-скрипт

Затем используем ту же версию PostgreSQL с Redis, пишемdocker-compose.ymlСодержание следующее:

# author:akiya
version: "3"

networks:
  harbor:
    driver: bridge

services:
  registry:
    image: postgres:9.6.14
    container_name: harbor-registry
    restart: always
    environment:
      POSTGRES_DB: registry
      POSTGRES_PASSWORD: root123
    volumes:
      - $PWD/postgres/registry:/var/lib/postgresql/data
    networks:
      - harbor
    ports:
      - 20010:5432
  clair:
    image: postgres:9.6.14
    container_name: harbor-clair
    restart: always
    environment:
      POSTGRES_DB: clair
      POSTGRES_PASSWORD: root123
    volumes:
      - $PWD/postgres/clair:/var/lib/postgresql/data
    networks:
      - harbor
    ports:
      - 20011:5432
  notarysigner:
    image: postgres:9.6.14
    container_name: harbor-notarysigner
    restart: always
    environment:
      POSTGRES_DB: notarysigner
      POSTGRES_PASSWORD: root123
    volumes:
      - $PWD/postgres/notarysigner:/var/lib/postgresql/data
    networks:
      - harbor
    ports:
      - 20012:5432
  notaryserver:
    image: postgres:9.6.14
    container_name: harbor-notaryserver
    restart: always
    environment:
      POSTGRES_DB: notaryserver
      POSTGRES_PASSWORD: root123
    volumes:
      - $PWD/postgres/notaryserver:/var/lib/postgresql/data
    networks:
      - harbor
    ports:
      - 20013:5432
  Redis:
    image: redis:4.0.10
    container_name: harbor-redis
    command: redis-server /usr/local/etc/redis/redis.conf
    restart: always
    volumes:
      - $PWD/redis/data:/data
      - $PWD/redis/redis.conf:/usr/local/etc/redis/redis.conf
    networks:
      - harbor
    ports:
      - 20000:6379

После сохранения используемdocker-compose up -dКоманда запускает соответствующий контейнер и открывает соответствующий порт в брандмауэре.

# docker-compose up -d
# firewall-cmd --zone=public --permanent --add-port=20000/tcp
# firewall-cmd --zone=public --permanent --add-port=20010/tcp
# firewall-cmd --zone=public --permanent --add-port=20011/tcp
# firewall-cmd --zone=public --permanent --add-port=20012/tcp
# firewall-cmd --zone=public --permanent --add-port=20013/tcp
# firewall-cmd --reload

NFS

Сервер

Создать путь к общему ресурсу NFS

# mkdir -p /data/nfs

Установите NFS (rpcbind включен по умолчанию после установки nfs-utils)

# yum -y install nfs-utils rpcbind

Запустите службы, связанные с NFS, и установите запуск

# systemctl start rpcbind
# systemctl enable rpcbind
# systemctl start nfs-server
# systemctl enable nfs-server
# systemctl start nfs-lock
# systemctl enable nfs-lock
# systemctl start nfs-idmap
# systemctl enable nfs-idmap

Используйте команду вроде/etc/exportsдобавить конфигурацию

# echo '/data/nfs  10.0.0.0/8(rw,sync,no_root_squash)' >> /etc/exports
# exportfs -a      # 使exports的修改生效

Проверьте правильность общего каталога NFS.

# showmount -e localhost
Export list for localhost:
/data/nfs 10.0.0.0/8

Отпустите соответствующие службы брандмауэра

# firewall-cmd --add-service=nfs --permanent --zone=public
# firewall-cmd --add-service=mountd --permanent --zone=public
# firewall-cmd --add-service=rpc-bind --permanent --zone=public
# firewall-cmd --reload

клиент

Создать путь к файлу монтирования NFS

# mkdir /data

Установка NFS

# yum -y install nfs-utils

Проверьте, существует ли каталог удаленного общего доступа NFS.

# showmount -e 10.10.1.10
Export list for 10.10.1.10:
/data/nfs 10.0.0.0/8

Смонтировать путь к удаленному общему ресурсу NFS

# mount -t nfs 10.10.1.10:/data/nfs /data

Добавить в автомонтирование при загрузке системы

# echo '10.10.1.10:/data/nfs /data nfs defaults 0 0' >> /etc/fstab

контрольная работа

Создайте тестовый файл после монтирования NFS на клиенте

# touch /data/test

Затем переключитесь на сервер, чтобы увидеть, существует ли он.

# ls /data/nfs/
test

Harbor

скачать

скачатьHarborАвтономный монтажный пакет, файлы автономного установочного пакета больше (примерно: 590 м), рекомендуется использовать локальномногопоточный инструментПосле загрузки загрузите сервер для использования.

# curl -O https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.0.tgz

Также можно установить на серверaxelМногопоточный инструмент загрузки ускоряет загрузку (вы можете найти исходный код и скомпилировать его самостоятельно)

# curl -O http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/a/axel-2.4-9.el7.x86_64.rpm
# rpm -ivh axel-2.4-9.el7.x86_64.rpm
# axel -n 20 https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.0.tgz

Разархивируйте установочный пакет

# tar -zxvf harbor-offline-installer-v1.9.0.tgz && cd harbor

Изменить файл конфигурации

Исправлятьharbor.ymlконфигурационный файл

# vim harbor.yml

Основные параметры конфигурации следующие: поскольку мы используем внешние PostgreSQL и Redis, мы их напрямую закомментируем.databaseВместо этого используйте соответствующую конфигурациюexternal_databaseиexternal_redis

# 修改为当前服务器内网IP地址即可
hostname: reg.mydomain.com
# HTTP相关配置
http:
  port: 80
# HTTPS相关配置,这里由于我们会在前端加一个Nginx
# 所以我们直接使用HTTP,而在Nginx上做SSL
#https:
#  # HTTPS端口
#  port: 443
#  # TLS证书
#  certificate: /www/certs/harbor.crt
#  # TLS私钥
#  private_key: /www/certs/harbor.key
# 默认管理员密码
harbor_admin_password: Harbor12345
# Harbor DB配置,由于使用外部数据库,所以这里我们注释掉
# database:
#   password: root123
#   max_idle_conns: 50
#   max_open_conns: 100
...
# 外部PostgreSQL,由于Harbor使用了4个数据库,这里我们也需要对相应数据库地址进行配置
external_database:
  harbor:
    host: 10.10.1.10
    port: 20010
    db_name: registry
    username: postgres
    password: root123
    ssl_mode: disable
    max_idle_conns: 2
    max_open_conns: 0
  clair:
    host: 10.10.1.10
    port: 20011
    db_name: clair
    username: postgres
    password: root123
    ssl_mode: disable
  notary_signer:
    host: 10.10.1.10
    port: 20012
    db_name: notarysigner
    username: postgres
    password: root123
    ssl_mode: disable
  notary_server:
    host: 10.10.1.10
    port: 20013
    db_name: notaryserver
    username: postgres
    password: root123
    ssl_mode: disable
# 使用外部Redis,取消相应注释即可
external_redis:
  host: 10.10.1.10
  port: 20000
  password:
  registry_db_index: 1
  jobservice_db_index: 2
  chartmuseum_db_index: 3
...

Создайте необходимые файлы (среды) для запуска гавани иdocker-compose.ymlДокументы; Docker Image будет проходить через сеть после выполнения, предлагаемые модификации ускоряют продвижение хороших внутренних зеркальных сайтов.

# ./prepare

Установить гавань

# ./install.sh

Порт открытой гавани

# firewall-cmd --zone=public --permanent --add-port=80/tcp
# firewall-cmd --reload

Nginx

Установить

Добавить исходный код Nginx

# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

ням установить Nginx

# yum -y install nginx

Запустить Nginx

# systemctl start nginx
# systemctl enable nginx

запись конфигурации

Создайте/etc/nginx/conf.d/harbor.confфайл и напишите следующее

upstream harbor {
    ip_hash;
    server 10.10.1.11:80;
    server 10.10.1.12:80;
}
server {
   listen       80;
   # 提供访问的域名或者IP
   server_name  harbor.yourdomain.com;
   return      308 https://$host$request_uri;
}
server {
    listen  443 ssl;
    server_name harbor.yourdomain.com;
    
    # SSL 证书
    ssl_certificate ./certs/harbor.crt;
    # SSL 私钥
    ssl_certificate_key ./certs/harbor.key;
    client_max_body_size 0;
    chunked_transfer_encoding on;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
        proxy_ssl_verify off;
        proxy_ssl_session_reuse on;
        proxy_pass http://harbor;
        proxy_http_version 1.1;
}
    location /v2/ {
        proxy_pass http://harbor/v2/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_ssl_verify off;
        proxy_ssl_session_reuse on;
        proxy_buffering off;
        proxy_request_buffering off;
    }
}

Запустить Nginx

Проверьте правильность конфигурации Nginx

# nginx -t

Изящно перезапустите Nginx

# nginx -s reload

Откройте порт брандмауэра 80/443

# firewall-cmd --zone=public --permanent --add-port=80/tcp
# firewall-cmd --zone=public --permanent --add-port=443/tcp
# firewall-cmd --reload

Проблема

Nginx

проблема: Ошибка при использовании самоподписанного сертификата

emerg] 31815#31815: cannot load certificate "/www/certs/harbor.crt": BIO_new_file() failed (SSL: error:0200100D:system library:fopen:Permission denied:fopen('/www/certs/harbor.crt','r') error:2006D002:BIO routines:BIO_new_file:system lib)

Решение:Создайте/etc/nginx/certsпуть и скопируйте сертификат на этот путь

mkdir -p /etc/nginx/certs && cp /www/certs/ ./certs

Исправлятьharbor.confПуть, связанный с сертификатом

# 刚才我们自己签发的证书
ssl_certificate ./certs/harbor.crt;
# 证书对应的私钥
ssl_certificate_key ./certs/harbor.key;