1. Xác định yêu cầu phần cứng và hệ điều hành
Yêu cầu tối thiểu cho Harbor, Notary và Policy Engine
Để triển khai kiến trúc Secure Multi-Cloud Registry với đầy đủ thành phần Harbor (Registry + Notary), Policy Engine (Trivy/Clair) và cơ chế Replication, bạn cần phân bổ tài nguyên theo quy mô sau. Đây là con số thực tế đã kiểm chứng trên môi trường sản xuất.
- CPU: Tối thiểu 4 vCPU cho node Harbor Core, 2 vCPU cho Notary, 2 vCPU cho Policy Engine. Tổng cộng cần 8 vCPU cho một cluster đơn lẻ.
- RAM: Tối thiểu 8GB RAM cho Harbor (bao gồm Redis, PostgreSQL, Registry, Core, Portal, Jobservice), 2GB cho Notary, 4GB cho Policy Engine. Tổng cộng cần 16GB RAM.
- Disk: Cần ít nhất 50GB SSD cho hệ thống, cộng thêm dung lượng lưu trữ artifact (tùy biến). Khuyến nghị dùng NVMe cho database và registry storage để tăng IOPS.
Hệ điều hành khuyến nghị là Linux phát hành mới nhất thuộc dòng RHEL (Rocky Linux 9, AlmaLinux 9) hoặc Debian/Ubuntu (Ubuntu 22.04 LTS, Debian 12 Bookworm). Tránh dùng CentOS 7 do đã hết vòng đời (EOL).
Verify yêu cầu phần cứng
Thực hiện lệnh sau để kiểm tra tài nguyên hiện có trên server trước khi cài đặt:
cat /proc/cpuinfo | grep "processor" | wc -l
free -h
df -h /
uname -r
Kết quả mong đợi: Số core CPU >= 8, RAM >= 16G, Disk >= 50G trống, Kernel version >= 5.4.
2. Lựa chọn và chuẩn bị hạ tầng Multi-Cloud
Thiết lập Cluster Kubernetes cơ bản
Harbor cần chạy trên Kubernetes (K8s) để đạt được High-Availability (HA). Bạn sẽ chuẩn bị một cluster K8s với ít nhất 3 node (1 Master, 2 Worker) hoặc dùng Managed Service (EKS, AKS, GKE).
Trong hướng dẫn này, giả định bạn đã có access SSH đến các server và sẽ dùng KubeADM hoặc kubeadm để tạo cluster, hoặc dùng Terraform để provision infrastructure trên AWS/Azure/GCP.
Cấu hình Network Policy cho Multi-Cloud
Trong môi trường Multi-Cloud, traffic giữa các registry cần được bảo mật. Cấu hình VPC Peering hoặc Transit Gateway giữa các cloud provider trước khi deploy.
Trên mỗi node, cần đảm bảo firewall cho phép các port sau:
- Port 443: HTTPS cho Harbor Portal và Registry API.
- Port 80: HTTP (chỉ để redirect sang HTTPS, không nên mở public).
- Port 8080: Harbor API (internal).
- Port 4000: Notary API (internal).
- Port 4001-4002: Notary TUF (internal).
- Port 5432: PostgreSQL (internal only).
- Port 6379: Redis (internal only).
Verify Network Connectivity
Kiểm tra khả năng kết nối giữa các node và port cần thiết:
systemctl status firewalld
firewall-cmd --list-ports
kubectl get nodes -o wide
Kết quả mong đợi: Firewall đang chạy và đã mở các port trên, tất cả nodes trong cluster có trạng thái READY.
3. Cài đặt Docker Engine và Helm CLI
Cài đặt Docker Engine trên tất cả nodes
Docker Engine là runtime để chạy container cho Harbor components. Cần cài đặt phiên bản Docker 20.10 trở lên để tương thích với Kubernetes 1.24+.
Thực hiện lệnh sau trên Master và Worker nodes (Ubuntu/Debian example):
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) 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-compose-plugin
sudo systemctl enable docker
sudo systemctl start docker
Kết quả mong đợi: Docker service đang chạy, version >= 20.10.
Cài đặt Helm CLI trên Master node
Helm là package manager để deploy Harbor chart vào Kubernetes. Cần cài đặt trên node quản trị (Master).
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | sudo bash
helm version
Kết quả mong đợi: Lệnh `helm` chạy được, hiển thị version (ví dụ: v3.12.0).
Verify Docker và Helm
Chạy lệnh kiểm tra cuối cùng:
docker info | grep "Server Version"
helm version
kubectl version --short
Kết quả mong đợi: Hiển thị version của Docker, Helm và K8s thành công.
4. Cấu hình DNS, SSL/TLS và Firewall Rules
Thiết lập DNS Record
Harbor yêu cầu một hostname cố định để kết nối. Bạn cần cấu hình DNS (public hoặc internal) trỏ về IP của Master node hoặc Load Balancer.
Giả sử domain là `harbor.example.com`. Thêm A Record trỏ về IP Public của cluster.
Gen SSL/TLS Certificates
Để bảo mật, Harbor bắt buộc phải dùng HTTPS. Bạn có thể dùng Let's Encrypt (Cert-Manager) hoặc tự tạo Self-Signed Certificate cho môi trường test. Dưới đây là cách tạo Self-Signed Certificate để cấu hình nhanh:
Tạo thư mục chứa cert và key:
mkdir -p /etc/harbor/certs
cd /etc/harbor/certs
openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout harbor.key -out harbor.crt -subj "/C=US/ST=CA/L=SF/O=DevTeam/CN=harbor.example.com"
Kết quả mong đợi: Tạo ra 2 file `harbor.key` và `harbor.crt` trong thư mục.
Cấu hình Firewall Rules chi tiết
Khóa toàn bộ port và chỉ mở những port cần thiết. Sử dụng UFW (Ubuntu) hoặc firewalld (RHEL):
# Ubuntu Example
sudo ufw default deny incoming
sudo ufw allow 443/tcp
sudo ufw allow 80/tcp
sudo ufw allow 22/tcp
sudo ufw enable
# RHEL Example (firewalld)
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
Kết quả mong đợi: Firewall bật và chỉ cho phép traffic trên port 80, 443, 22.
Verify DNS và SSL
Kiểm tra DNS resolution và chứng chỉ:
nslookup harbor.example.com
openssl s_client -connect harbor.example.com:443 -servername harbor.example.com 2>/dev/null | openssl x509 -noout -subject
Kết quả mong đợi: DNS trả về đúng IP, openssl hiển thị subject chứa CN=harbor.example.com.
5. Chuẩn bị tài khoản Cloud và IAM Roles
Tạo IAM User/Role cho Object Storage
Harbor sử dụng Object Storage (S3, Azure Blob, GCS) để lưu trữ image layers. Bạn cần tạo IAM Role có quyền truy cập vào bucket lưu trữ.
Giả định sử dụng AWS S3 (tương tự cho Azure Blob/GCS):
- Đến AWS Console -> IAM -> Create Role.
- Chọn trusted entity: EC2 (nếu Harbor chạy trên EC2) hoặc External ID (nếu dùng từ on-prem).
- Gán policy: `AmazonS3FullAccess` (hoặc policy custom chỉ quyền `s3:GetObject`, `s3:PutObject`, `s3:ListBucket` trên bucket cụ thể).
- Attach role vào EC2 instance nơi chạy Harbor.
Đối với Azure/GCP, tạo Service Principal hoặc Service Account tương tự với quyền `Storage Blob Data Contributor`.
Cấu hình AWS CLI và Credentials (Nếu dùng On-prem)
Nếu Harbor chạy on-prem và cần connect AWS, bạn cần cấu hình credentials file:
mkdir -p ~/.aws
cat > ~/.aws/credentials
Kết quả mong đợi: File credentials được tạo với quyền đọc 400 (chỉ owner đọc được).
Verify IAM Access
Kiểm tra quyền truy cập S3 bằng lệnh AWS CLI:
aws s3 ls
aws s3api list-buckets
Kết quả mong đợi: Trả về danh sách các bucket mà IAM role/user được phép truy cập. Nếu lỗi "Access Denied", kiểm tra lại Policy IAM.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Secure Multi-Cloud Container Registry với Harbor, Notary và Policy Engine để kiểm soát phân phối artifact an toàn
Phần 2: Triển khai Harbor Registry với kiến trúc High-Availability trên Kubernetes »