打破資料界限:Harbor x Minio的完美組合

Albert Weng
18 min readFeb 6, 2024

--

先前跟大家演示過如何做部署Harbor registry,當時資料主要是存放在Harbor本機內部,但實務上通常會將資料另外存放到外部的物件儲存節點,根據我的習慣,一般我會使用Minio這個專案來與Harbor進行整合。

本篇將從Minio的功能開始,一路到如何進行相關的整合,最後再說明這樣做的好處。

依照慣例,本篇重點如下:

  1. Minio是什麼?
  2. Harbor x Minio
  3. 部署測試
  4. 結論

1. Minio是什麼?

Minio 是一個開源的物件存儲服務,旨在提供簡單且高效的分散式儲存解決方案。它允許使用者建立自己的私有雲端存儲,並且支援對象儲存(Object Storage)的應用。Minio的特點包括易於部署、擴展性強、兼容S3 API(Amazon S3雲端儲存服務),以及具有高度可靠性和可用性。用户可以在各種應用中使用Minio,例如構建可擴展的數據湖、備份和還原、以及多媒體應用的存儲。

https://min.io/

目前Minio採用雙重授權模式,分別為GNU Affero通用公共授權條款第3.0版和MinIO商業授權。通過MinIO SUBNET註冊的部署使用商業授權,並包括24/7的MinIO支持。

優點如下:

  • Simple: 簡單性是超級規模數據基礎設施的基石 — 在技術和運營方面都是如此。沒有其他物件存儲可以讓您在更短的時間內實現從下載到生產的過程。
  • High Performance: MinIO是全球速度最快的物件存儲,其公布的GET/PUT結果超過每秒325 GiB和每秒165 GiB,分別在32個NVMe驅動器節點和100GbE網路上實現。
  • Kubrenetes-Native: 整合本地Kubernetes ,MinIO支援所有主要的Kubernetes發行版,包括公共雲、私有雲和邊緣雲。
  • AI Ready: MinIO專為人工智慧而建,並且與每個主要的AI/ML技術無縫運作。從預測模型到GenAI,MinIO提供性能和可擴展性,為AI企業提供強大支持。

2. Harbor x Minio

※ 部署Minio

#------------------------------
# S2-1. download minio & mc
#------------------------------
[minio]# mkdir /minio ; cd /minio
[minio]# wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20231209181751.0.0-1.x86_64.rpm -O minio.rpm
[minio]# dnf install minio.rpm

[minio]# wget https://dl.min.io/client/mc/release/linux-amd64/mc
[minio]# chmod +x mc
[minio]# sudo mv mc /usr/local/bin/mc

[minio]# groupadd -r minio-user
[minio]# useradd -M -r -g minio-user minio-user
[minio]# chown minio-user:minio-user /minio/data
#------------------------------
# S2-2. Create systemd service
# (預設系統會先檢查/etc/systemd後才檢查/usr/lib/systemd)
#------------------------------
[minio]# vim /usr/lib/systemd/system/minio.service
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local

User=minio-user
Group=minio-user
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# MinIO RELEASE.2023-05-04T21-44-30Z adds support for Type=notify (https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=)
# This may improve systemctl setups where other services use `After=minio.server`
# Uncomment the line to enable the functionality
# Type=notify

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})
#------------------------------
# S2-3. 建立環境變數
#------------------------------
[minio]# mkdir -p /minio/data
[minio]# vim /etc/default/minio
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin123
MINIO_VOLUMES="/minio/data"
#------------------------------
# S2-4. 啟用服務
#------------------------------
[minio]# sudo systemctl start minio.service
[minio]# sudo systemctl status minio.service
[minio]# sudo systemctl enable --now minio.service
[minio]# journalctl -f -u minio.service
#------------------------------
# S2-5. 進入console
#------------------------------
https://minio.test.example.poc:9000

※ 部署Harbor

建議資源需求:

#-----------------------------------------
# S2-6. Add Docker repo
#-----------------------------------------
[harbor]# yum install yum-utils
[harbor]# yum config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[harbor]# yum clean all ; yum repolist
#-----------------------------------------
# S2-7. docker install
#-----------------------------------------
[harbor]# yum remove podman buildah
[harbor]# yum install containerd.io docker-ce docker-ce-cli docker-ce-rootless-extras
[harbor]# systemctl enable --now docker
#-----------------------------------------
# S2-8. docker-compose
#-----------------------------------------
[harbor]# curl -SL https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
[harbor]# mv docker-compose /usr/local/bin/
[harbor]# chmod +x docker-compose
[harbor]# docker-compose version
Docker Compose version v2.20.0
#-----------------------------------------
# S2-9. sign-certificate
#-----------------------------------------
[harbor]# openssl genrsa -out ca.key 4096
[harbor]# openssl req -x509 -new -nodes -sha512 -days 3650 -key ca.key -out ca.crt
Common Name (eg, your name or your server's hostname) []:harbor.test.example.poc

[harbor]# openssl genrsa -out harbor.test.example.poc.key 4096
[harbor]# openssl req -sha512 -new -key harbor.test.example.poc.key -out harbor.test.example.poc.csr
Common Name (eg, your name or your server's hostname) []:harbor.test.example.poc

[harbor]# vim v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=habor.test.example.poc
DNS.2=harbor.test.example.poc
DNS.3=harbor.test.example.poc

[harbor]# openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.test.example.poc.csr \
-out harbor.test.example.poc.crt

※ copy certificates to docker and harbor
[harbor]# mkdir -p /data/cert/
[harbor]# cp -rp harbor.test.example.poc.crt harbor.test.example.poc.key /data/cert/

[harbor]# ls -al /data/cert/
harbor.test.example.poc.crt
harbor.test.example.poc.key

※ convert crt to cert for docker login
[harbor]# cd /root/docker/certs/
[harbor]# openssl x509 -inform PEM -in harbor.test.example.poc.crt -out harbor.test.example.poc.cert

※ copy to docker certificate folder
[harbor]# cpcp
[harbor]# cp harbor.test.example.poc.cert /etc/docker/certs.d/harbor.test.example.poc
[harbor]# cpcp harbor.test.example.poc.key /etc/docker/certs.d/harbor.test.example.poc
[harbor]# cp ca.crt /etc/docker/certs.d/harbor.test.example.poc

[harbor]# systemctl restart docker
#-----------------------------------------
# S2-10. harbor.yml (online installer) + minio backend
#-----------------------------------------
[harbor]# wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
[harbor]# tar zxvf harbor-offline-installer-v2.10.0.tgz
[harbor]# cp harbor.yml.tmpl harbor.yml
[harbor]# vim harbor.yml
hostname: harbor1.test.example.poc #指定要部署harbor的位置
external_url: https://harbor1.test.example.poc
http: #Production環境不要用
port: 80
https:
port: 443
certificate: /etc/docker/certs.d/harbor1.test.example.poc/harbor1.test.example.poc.cert #SSL certificate
private_key: /etc/docker/certs.d/harbor1.test.example.poc/harbor1.test.example.poc.key #SSL key
harbor_admin_password: Harbor12345

storage_service:
s3:
accesskey: minioadmin
secretkey: minioadmin123
region: us-east-1
regionendpoint: http://minio.test.example.poc:9000
bucket: harbor
secure: false
v4auth: true
#-----------------------------------------
# S2-11. install (online installer)
#-----------------------------------------
[harbor]#./install.sh --with-trivy
=> 確認都為`healthy`狀態
[root@harbor]# docker-compose ps
#-----------------------------------------
# S2-12. UI & docker login
#-----------------------------------------
[harbor]# docker login harbor1.test.example.poc
Username: admin
Password: Harbor12345

3. 部署測試

#-------------------------------------------------
# S3-1. 確認節點CA憑證
# Podman檢查CA的路徑與docker不同 (/etc/containers/certs.d/)
#-------------------------------------------------
[worker01]# mkdir -p /etc/containers/certs.d/harbor1.test.example.poc/
[harbor]# scp -rp ca.crt root@worker01:/etc/containers/certs.d/harbor1.test.example.poc/
[worker01]# podman pull harbor.test.example.poc/nginx-test/nginx:1.14.2
#-------------------------------------------------
# S3-2. 下載deployment.yaml & 部署
#-------------------------------------------------
[master]# wget https://k8s.io/examples/application/deployment.yaml
[master]# vim deployment.yaml (修改image url)
[master]# kubectl create -f deployment.yaml
[master]# kubectl get all -n nginx-test

4. 結論

選擇Minio作為Harbor的後端儲存有以下優點:

  • 高效能:Minio具備強大的效能與可擴展性,使用Harbor在儲存與查找鏡像時可以有極大的幫助。
  • 相容性:因為Minio提供相容於Amazon S3的API,所以所有支援S3 API的許多平台都可以使用Minio來做後端儲存,可以延伸出許多更進階的做法。
  • 容易部署:容易部署、容易整合
  • 可擴展性:具備很強的橫向擴展能力,可以根據需求輕鬆擴展儲存容量與性能,可以適應Harbor在不同規模和負載下的變化。
  • 活躍社群:活躍的社群表示有廣泛的開發者和用戶社群可以持續提供技術支援與改進。

將後端儲存與Image registry拆開有許多好處,透過架構上的拆分,我們可以讓Harbor以容器化的方式在K8S內運行,資料存在外部也可以避免任何意外造成資料遺失,而Image registry本身還有利用K8S的特色持續提供服務。

今天就先到這邊,我們下期再見~~

--

--

Albert Weng

You don't have to be great to start, but you have to start to be great