- Harbor เหมาะกับงานอะไร
- สถาปัตยกรรมตัวอย่าง
- Workshop: ติดตั้ง Harbor บน Ubuntu ด้วย Docker Compose
- แนวทางใช้งานจริง
- สรุป
- แหล่งอ้างอิง
Harbor เป็นโครงการโอเพนซอร์สภายใต้ CNCF สำหรับจัดเก็บและบริหาร OCI artifacts และ container images พร้อมความสามารถด้านการควบคุมสิทธิ์ การสแกนช่องโหว่ การทำ replication และ audit logs
- เว็บไซต์: https://goharbor.io/
- ซอร์สโค้ด: https://github.com/goharbor/harbor
- คู่มือ: https://goharbor.io/docs/
#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 ได้ด้วย
#แนวทางใช้งานจริง
- เปิด HTTPS ด้วยใบรับรองที่เชื่อถือได้และจำกัดการเข้าถึงหน้า Admin
- ใช้ Robot Account แยกสำหรับ CI (push) และ runtime (pull) ตามหลัก least privilege
- ตั้งนโยบายสแกนช่องโหว่และเกณฑ์การอนุญาต deploy ให้เหมาะกับความเสี่ยง
- ใช้ immutable tags หรืออ้างอิง image digest เพื่อป้องกันการเปลี่ยน artifact โดยไม่ตั้งใจ
- วางแผนสำรองข้อมูลฐานข้อมูลและ storage พร้อมทดสอบการกู้คืน
- กำหนด retention policy, garbage collection และ replication ตามความจำเป็น
#สรุป
Harbor เป็นตัวเลือกที่เหมาะสำหรับทีม DevOps/Platform Engineering ที่ต้องการ Registry ภายในองค์กรพร้อมมาตรการด้านความปลอดภัยและ governance มากกว่า Registry พื้นฐาน โดยผสานเข้ากับ GitHub Actions, Jenkins และ Kubernetes ได้