Harbor เป็นโครงการโอเพนซอร์สภายใต้ CNCF สำหรับจัดเก็บและบริหาร OCI artifacts และ container images พร้อมความสามารถด้านการควบคุมสิทธิ์ การสแกนช่องโหว่ การทำ replication และ audit logs

#Harbor เหมาะกับงานอะไร

Harbor เป็น Registry ภายในองค์กรสำหรับ CI/CD และ Kubernetes ช่วยแยกโครงการ (Project) กำหนดสิทธิ์ด้วย RBAC ตรวจสอบช่องโหว่ของอิมเมจ และซิงก์อิมเมจระหว่าง Registry ต่าง ๆ ได้

ความสามารถ ประโยชน์
Private Registry จัดเก็บ Container Images ภายในองค์กร
RBAC แบ่งสิทธิ์ตาม Project
Vulnerability Scanning ตรวจหาช่องโหว่ในอิมเมจ
Replication คัดลอกอิมเมจข้าม Registry
Audit Logs ตรวจสอบการดำเนินการย้อนหลัง
OIDC / LDAP ผสานระบบยืนยันตัวตน
Garbage Collection คืนพื้นที่จากข้อมูลที่ไม่ถูกอ้างอิง

#สถาปัตยกรรมตัวอย่าง

flowchart LR
  Dev[Developer] --> CI[GitHub Actions / Jenkins]
  CI -->|Build & Push| H[Harbor Registry]
  H --> S[Vulnerability Scanner]
  H -->|Pull| K[Kubernetes Cluster]
  H -->|Replication| R[Secondary Registry]

#Workshop: ติดตั้ง Harbor บน Ubuntu ด้วย Docker Compose

ตัวอย่างนี้ใช้โดเมน harbor.example.com ซึ่งต้องเปลี่ยนเป็นโดเมนที่ใช้งานจริงและชี้ DNS มายังเซิร์ฟเวอร์ เตรียม TLS certificate ที่เชื่อถือได้ก่อนใช้งานจริง

#1. เตรียมระบบ

ติดตั้ง Docker Engine และ Docker Compose plugin ตามคู่มือทางการของ Docker ตรวจสอบด้วยคำสั่ง:

docker --version
docker compose version

ตรวจสอบ CPU, RAM, ดิสก์ และพอร์ตตามข้อกำหนดของ Harbor รุ่นที่จะติดตั้ง

#2. ดาวน์โหลด Release

เปิดหน้า https://github.com/goharbor/harbor/releases แล้วเลือก stable release และไฟล์ online installer ที่ตรงกับรุ่น จากนั้นตรวจสอบ checksum และลายเซ็นตามคู่มือรุ่นนั้น ๆ ก่อนแตกไฟล์

# ตัวอย่าง: เมื่อดาวน์โหลดไฟล์ harbor-online-installer-<VERSION>.tgz มาแล้ว
tar xzf harbor-online-installer-<VERSION>.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml

#3. กำหนดค่า harbor.yml

hostname: harbor.example.com
https:
  port: 443
  certificate: /etc/ssl/harbor/fullchain.pem
  private_key: /etc/ssl/harbor/privkey.pem
harbor_admin_password: CHANGE_TO_A_STRONG_PASSWORD

ค่าอื่นใน harbor.yml ให้คงตามไฟล์ต้นแบบและปรับตามระบบจริง หลีกเลี่ยงการใช้รหัสผ่านตัวอย่างใน production

#4. ติดตั้ง

sudo ./install.sh

เปิด https://harbor.example.com เข้าสู่ระบบด้วยบัญชี admin และรหัสผ่านที่กำหนด แล้วสร้าง Project ชื่อ demo โดยเลือกเป็น Private

#5. Push Docker Image

docker login harbor.example.com
docker pull nginx:alpine
docker tag nginx:alpine harbor.example.com/demo/nginx:1.0
docker push harbor.example.com/demo/nginx:1.0

#6. Pull Image บน Kubernetes

สร้าง Secret สำหรับเข้าถึง Registry (ควรใช้ Robot Account ที่มีสิทธิ์ pull เท่านั้น):

kubectl create namespace demo
kubectl -n demo create secret docker-registry harbor-credentials \
  --docker-server=harbor.example.com \
  --docker-username='robot$demo+puller' \
  --docker-password='<ROBOT_ACCOUNT_SECRET>'

ตัวอย่าง Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      imagePullSecrets:
        - name: harbor-credentials
      containers:
        - name: nginx
          image: harbor.example.com/demo/nginx:1.0
          ports:
            - containerPort: 80

บันทึกเป็น deployment.yaml แล้วรัน:

kubectl apply -f deployment.yaml
kubectl -n demo rollout status deployment/nginx

ชื่อ Robot Account เป็นตัวอย่าง ต้องสร้างจริงใน Harbor และใช้ชื่อที่ Harbor แสดง ระบบ Kubernetes nodes ต้อง resolve DNS และเชื่อถือ CA ของ Harbor ได้ด้วย

#แนวทางใช้งานจริง

  1. เปิด HTTPS ด้วยใบรับรองที่เชื่อถือได้และจำกัดการเข้าถึงหน้า Admin
  2. ใช้ Robot Account แยกสำหรับ CI (push) และ runtime (pull) ตามหลัก least privilege
  3. ตั้งนโยบายสแกนช่องโหว่และเกณฑ์การอนุญาต deploy ให้เหมาะกับความเสี่ยง
  4. ใช้ immutable tags หรืออ้างอิง image digest เพื่อป้องกันการเปลี่ยน artifact โดยไม่ตั้งใจ
  5. วางแผนสำรองข้อมูลฐานข้อมูลและ storage พร้อมทดสอบการกู้คืน
  6. กำหนด retention policy, garbage collection และ replication ตามความจำเป็น

#สรุป

Harbor เป็นตัวเลือกที่เหมาะสำหรับทีม DevOps/Platform Engineering ที่ต้องการ Registry ภายในองค์กรพร้อมมาตรการด้านความปลอดภัยและ governance มากกว่า Registry พื้นฐาน โดยผสานเข้ากับ GitHub Actions, Jenkins และ Kubernetes ได้

#แหล่งอ้างอิง