Разворачиваем harbor registry

0
(0)

Подготавливаем Vagrantfile

Ruby
servers=[
  {:hostname => "harbor",:ip => "192.168.10.50",:ssh_port => 2230}
]

Vagrant.configure("2") do |config|
  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.memory = 4096
    vb.cpus = 2
    vb.check_guest_additions = false
    config.vm.box_check_update = false
    config.vm.box = "bento/ubuntu-22.04"
  end

  servers.each do |machine|
    config.vm.define machine[:hostname] do |node|
      node.vm.hostname = machine[:hostname]
      node.vm.network "public_network", ip: machine[:ip], bridge: "wlo1"
      node.vm.network "forwarded_port", id: "ssh", host: machine[:ssh_port], guest: 22
      
      node.vm.provider "virtualbox" do |vb|
        file_to_disk = "./#{machine[:hostname]}_disk.vdi"
        vb.customize ['createhd', '--filename', file_to_disk, '--size', 20 * 1024]
        vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk]
      end
    end
  end
end

Далее нужно установить docker на машину:

Bash
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

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

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

Генерируем закрытый ключ сертификата СА:

Bash
openssl genrsa -out ca.key 4096

Далее генерируем сертификат СА:

Bash
openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.dev.local" \
 -key ca.key \
 -out ca.crt

Я брал примеры из официальной документации harbor, меняя только адрес домена.

Генерируем приватный ключ для СА сервера:

Bash
openssl genrsa -out harbor.dev.local.key 4096

Запрос на подписание сертификата (CSR):

Bash
openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.dev.local" \
    -key harbor.dev.local.key \
    -out harbor.dev.local.csr

Далее нам рекомендуют создать x509 сертификат на основе файла расширения v3.ext:

Bash
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=harbor.dev.local
DNS.2=harbor.dev
DNS.3=harbor
Bash
openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in harbor.dev.local.csr \
    -out harbor.dev.local.crt

Конвертим сертификат для docker:

Bash
openssl x509 -inform PEM -in yourdomain.com.crt -out harbor.dev.local.cert

Копируем сертификаты в директорию harbor. У меня это /data/cert :

Bash
cp harbor.dev.local.crt /data/cert/
cp harbor.dev.local.key /data/cert/

Копируем сертификаты в директория docker «/etc/docker/certs.d/harbor.dev.local»:

Bash
cp harbor.dev.local.cert /etc/docker/certs.d/harbor.dev.local/
cp harbor.dev.local.key /etc/docker/certs.d/harbor.dev.local/
cp ca.crt /etc/docker/certs.d/harbor.dev.local/

Перезапускаем docker:

Bash
systemctl restart docker

Устанавливаем harbor:

Со странице релизов, нужно забрать архив нужной версии. Я использовал online installer.

Скачиваем и разархивируем:

Bash
wget  https://github.com/goharbor/harbor/releases/download/v2.7.3/harbor-online-installer-v2.7.3.tgz
tar xvf  harbor-online-installer-v2.7.3.tgz

Внутри есть скрипты установки, а также пример файла harbor.yml.tmpl.

Мой конфигурационный файл выглядит так:

YAML
hostname: harbor.dev.local
http:
  port: 80
https:
  port: 443
  certificate: /data/cert/harbor.dev.local.crt
  private_key: /data/cert/harbor.dev.local.key
harbor_admin_password: admin
database:
  password: admin
  max_idle_conns: 100
  max_open_conns: 900
  conn_max_lifetime: 5m
  conn_max_idle_time: 0
data_volume: /data
trivy:
  ignore_unfixed: false
  skip_update: false
  offline_scan: false
  security_check: false
  insecure: false
  github_token: xxx
jobservice:
  max_job_workers: 10

notification:
  webhook_job_max_retry: 10

chart:
  absolute_url: disabled
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor
_version: 2.7.3
proxy:
  http_proxy: 
  https_proxy: 
  no_proxy: 
  components:
    - core
    - jobservice
    - trivy
  metric:
  enabled: true
  port: 9090
  path: /metrics
upload_purging:
  enabled: true
  age: 168h
  interval: 24h
  dryrun: false

Останавливаться на параметрах нет смысла, часть из них интуитивно понятна, другая часть хорошо описана в документации а также в виде комментариев в оригинальном harbor.yml.tmpl

Запускаем установку:

Bash
./install.sh --with-trivy

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

У harbor встроен сканер образов trivy, о включении которого мы сказали скрипту при установке. Есть и другие фишки, но уже сейчас они помечены как deprecated, их пробовать не стал.

Финальные штрихи:

Не забудем добавить запись в наш локальный DNS вида «- address=/harbor.{{ local_domain }}/192.168.10.50» и перезапустить машину с ansible provision.

Также нам нужно отредактировать наш daemon.json docker:

Bash
 $ cat /etc/docker/daemon.json 
{
  "insecure-registries" : [ "harbor.dev.local" ]
}

Создадим в веб-морде проект docker_local.

Перезапускаем docker и пробуем выполнить docker login, docker push:

Bash
docker login harbor.dev.local
docker pull nginx
docker tag nginx harbor.dev.local/docker_local/nginx:test
docker push harbor.dev.local/docker_local/nginx:test

В настройках мы можем включить автоскан образов с помощью trivy для нашего репозитория.

Немного автоматизации:

Вот тут можно забрать ansible роль для развертывания harbor. Роль предполагает, что сертификаты уже есть, их нужно просто положить в files директорию роли.

Файл ./defaults/main.yaml довольно простой, имеет удобное разделение и практически все его параметры относятся к конфигурационному файлу harbor.yml.

Насколько статья полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Оставить комментарий