Xử lý lỗi kết nối giữa các Cloud Provider trong kiến trúc Replication
Khi cấu hình Replication giữa các registry trên AWS ECR, GCP Artifact Registry và Azure Container Registry, lỗi kết nối thường xuất phát từ firewall, VPC peering hoặc cấu hình proxy không đúng.
Triệu chứng: Job replication bị treo ở trạng thái "Running" hoặc lỗi "Connection refused/timeout" trong dashboard Harbor.
Cách khắc phục: Kiểm tra kết nối từ pod Harbor core hoặc job service ra địa chỉ đích qua cổng 443.
Thực hiện lệnh kiểm tra DNS và kết nối từ container Harbor:
docker exec -it harbor-core curl -v --connect-timeout 5 https://:443/v2/_catalog
Kết quả mong đợi: Nếu thấy HTTP 200 hoặc 401 (chưa có quyền) là kết nối thành công. Nếu thấy timeout hoặc connection refused, cần kiểm tra Security Group của cloud đích.
Cấu hình proxy nếu Harbor nằm trong VPC nội bộ cần đi qua proxy public:
Tạo file cấu hình proxy tại `/etc/harbor/harbor.yml` (hoặc chỉnh sửa file config hiện có):
proxy:
http_proxy: http://proxy.example.com:8080
https_proxy: http://proxy.example.com:8080
no_proxy: 127.0.0.1,localhost,harbor-core,harbor-registry,harbor-registryctl,harbor-notary,harbor-jobservice
Khởi động lại Harbor để áp dụng:
docker-compose restart
Verify kết quả: Chạy lại lệnh curl ở trên, đảm bảo không còn timeout. Kiểm tra lại job replication trong UI Harbor, trạng thái chuyển sang "Success".
Xử lý lỗi chữ ký Notary không khớp hoặc hết hạn
Lỗi Notary thường xảy ra khi chữ ký (signature) của image không khớp với public key trong Notary server, hoặc chứng thư (certificate) đã hết hạn.
Triệu chứng: CLI Docker hoặc Kubernetes báo lỗi "Signature verification failed" hoặc "Certificate has expired" khi pull image đã ký.
Nguyên nhân phổ biến: Time synchronization lệch giữa Notary server và client, hoặc Notary server bị reset cấu hình.
Cách kiểm tra thời gian trên Notary server:
docker exec -it harbor-notary-server date
Cách khắc phục lỗi hết hạn chứng thư (Certificate Expiration):
Thủ tục này yêu cầu tạo lại cặp key và chứng thư mới, sau đó ký lại các image hiện có.
1. Sao lưu dữ liệu Notary hiện tại:
cp -r /var/lib/notary /var/lib/notary.backup_$(date +%F)
2. Khởi động lại Notary để tạo chứng thư mới (nếu cấu hình tự động) hoặc chạy lệnh tái tạo thủ công:
docker-compose restart harbor-notary-server harbor-notary-signer
3. Nếu lỗi vẫn tồn tại, cần kiểm tra log Notary để xác định root cause:
docker logs harbor-notary-server 2>&1 | grep -i "signature\|certificate\|expired"
Kết quả mong đợi: Log hiển thị thông báo về chứng thư mới được tạo hoặc chỉ rõ thời gian hết hạn cũ.
Verify kết quả: Chạy lệnh ký và pull lại image:
docker trust sign :
docker pull :
Không xuất hiện lỗi signature verification.
Phân tích log Harbor và Policy Engine để debug lỗi từ chối artifact
Khi Policy Engine (Trivy/Clair) chặn một image, Harbor sẽ từ chối phân phối (push/pull) dựa trên threshold đã thiết lập.
Triệu chứng: Lỗi "Image blocked by vulnerability scan" hoặc "Quarantine" khi thao tác với image.
Cách phân tích log để tìm nguyên nhân cụ thể (CVE nào, severity nào gây ra lỗi):
Log của Policy Engine (Trivy) thường nằm trong container trivy-server hoặc jobservice nếu chạy trong-cluster.
docker logs harbor-trivy-server 2>&1 | grep -A 10 "BLOCKED\|CRITICAL\|HIGH" | tail -n 20
Log của Harbor Core để xem quyết định từ chối:
docker logs harbor-core 2>&1 | grep -i "policy\|scan\|deny" | tail -n 20
Để debug sâu hơn, bật chế độ debug trong Harbor Config:
Chỉnh sửa file `/etc/harbor/harbor.yml`:
log:
level: debug
location: /var/log/harbor
max_size: 200M
max_age: 30
max_backups: 10
Khởi động lại:
docker-compose restart
Kết quả mong đợi: Log chi tiết hiển thị thông tin CVE-ID, điểm số risk, và quy tắc policy nào đã kích hoạt việc chặn.
Verify kết quả: Thử push một image có lỗ hổng đã biết, kiểm tra log xem có ghi nhận rõ ràng lý do từ chối hay không.
Cấu hình Prometheus và Grafana để giám sát Health và Performance
Để chủ động phát hiện sự cố, cần triển khai Prometheus để thu thập metrics và Grafana để trực quan hóa.
Bước 1: Triển khai Prometheus qua Docker Compose hoặc Kubernetes.
Tạo file cấu hình `prometheus.yml` tại `/etc/prometheus/prometheus.yml`:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'harbor-registry'
static_configs:
- targets: ['harbor-registry:5000']
metrics_path: /metrics
scheme: http
basic_auth:
username: admin
password: Harbor12345
- job_name: 'harbor-core'
static_configs:
- targets: ['harbor-core:8080']
metrics_path: /metrics
scheme: http
- job_name: 'harbor-jobservice'
static_configs:
- targets: ['harbor-jobservice:8080']
metrics_path: /metrics
scheme: http
Bước 2: Chạy Prometheus:
docker run -d -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml -v prometheus_data:/prometheus -p 9090:9090 prom/prometheus
Bước 3: Chạy Grafana và import dashboard Harbor.
docker run -d -p 3000:3000 grafana/grafana
Trong Grafana, thêm Prometheus datasource tại `http://prometheus:9090`.
Import dashboard ID 10788 (Harbor Registry Dashboard) từ Grafana.com.
Các metric quan trọng cần theo dõi:
- harbor_registry_pull_requests_total: Số lượng request pull.
- harbor_registry_push_requests_total: Số lượng request push.
- harbor_scan_job_duration_seconds: Thời gian quét lỗ hổng (phát hiện chậm trễ).
- harbor_replication_job_duration_seconds: Thời gian đồng bộ (phát hiện lỗi replication).
Verify kết quả: Mở Grafana, xem biểu đồ "Registry Requests" tăng dần khi thực hiện push/pull. Kiểm tra alert "High Latency" nếu thời gian quét vượt ngưỡng.
Best Practices về Disaster Recovery và Rotation Key tự động
Để đảm bảo tính liên tục (High Availability) và an toàn dữ liệu, cần có kế hoạch sao lưu và phục hồi (DR) cũng như xoay vòng khóa (Key Rotation).
1. Chiến lược sao lưu Harbor:
Harbor lưu trữ metadata trong Postgres và data trong storage backend. Cần sao lưu cả hai.
Tạo script backup tự động (chạy trên host Linux):
#!/bin/bash
BACKUP_DIR="/var/backups/harbor"
DATE=$(date +%F_%H%M)
mkdir -p $BACKUP_DIR
# Backup Postgres
docker exec -t harbor-db pg_dump -U postgres harbor > $BACKUP_DIR/harbor_db_$DATE.sql
# Backup Notary DB
docker exec -t harbor-notary-db pg_dump -U notary notary > $BACKUP_DIR/notary_db_$DATE.sql
# Backup config và data
docker cp harbor-core:/etc/harbor/harbor.yml $BACKUP_DIR/harbor.yml.$DATE
tar -czf $BACKUP_DIR/harbor_data_$DATE.tar.gz /var/lib/harbor
# Cleanup old backups (keep 7 days)
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
Chạy script qua cron job hàng ngày:
0 2 * * * /usr/local/bin/backup_harbor.sh
2. Tự động hóa Rotation Key cho Notary:
Notary hỗ trợ rotation key để giảm thiểu rủi ro khi key bị rò rỉ. Tuy nhiên, việc này cần cân nhắc kỹ để không làm mất chữ ký cũ.
Để tự động hóa, sử dụng script gọi API Notary để tạo key mới và đánh dấu key cũ là deprecated.
Chạy lệnh trong container Notary:
docker exec -it harbor-notary-signer notary-key rotate --trust-root=/etc/notary/trust_root.json
Lưu ý: Sau khi rotate, cần ký lại (re-sign) các artifact quan trọng nếu yêu cầu tính toàn vẹn tuyệt đối, hoặc đảm bảo client tin tưởng cả key cũ và key mới.
Verify kết quả DR: Thử xóa toàn bộ container Harbor, restore từ backup file mới nhất bằng lệnh `docker-compose up -d` và import database. Đảm bảo image và policy vẫn hoạt động.
Verify kết quả Key Rotation: Chạy lệnh `docker trust inspect` trên image đã ký, xác nhận có 2 key (cũ và mới) trong trust store.
Đ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 8: Xây dựng pipeline CI/CD tích hợp Secure Artifact Delivery