Loại bỏ giới hạn Docker Hub: Hướng dẫn tự triển khai Harbor chuẩn Production

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Khó khăn khi quản lý Docker Image khi mở rộng

Khi mới bắt đầu xây dựng ứng dụng, việc quản lý Docker image thường là thứ cuối cùng bạn nghĩ đến. Các đội ngũ thường bắt đầu bằng cách đẩy image lên các repository công khai hoặc dùng chung một tài khoản Docker Hub. Cách này ổn khi bạn chỉ có hai lập trình viên và ba microservice. Nhưng mọi thứ sẽ nhanh chóng trở nên rắc rối khi bạn mở rộng. Một khi bạn phải quản lý 50 microservice trên các môi trường Dev, Staging và Production, cách tiếp cận tùy tiện đó sẽ trở thành một rủi ro bảo mật khổng lồ.

Năm ngoái, đội ngũ của tôi đã gặp bế tắc. Chúng tôi liên tục bị giới hạn bởi định mức 200 lượt pull mỗi 6 giờ của Docker Hub, khiến pipeline CI/CD bị đình trệ. Tệ hơn nữa, chúng tôi đang làm việc trong tình trạng mù mờ thông tin. Chúng tôi không biết liệu các base image của mình có chứa các lỗ hổng nghiêm trọng hay không. Việc đẩy mã nguồn độc quyền lên một registry công khai trên cloud cũng khiến các bộ phận tuân thủ (compliance) không an tâm. Chúng tôi cần một kho lưu trữ container an toàn, hiệu năng cao, nằm ngay trong mạng nội bộ của mình.

Chúng tôi đã chuyển sang Harbor, một registry mã nguồn mở coi bảo mật là ưu tiên hàng đầu. Sau sáu tháng xử lý hơn 100 bản build mỗi ngày trong môi trường production có lưu lượng truy cập cao, kết quả đã chứng minh tất cả. Nó ổn định, nhanh chóng và giúp chúng tôi hoàn toàn làm chủ dữ liệu của mình.

Tại sao Harbor là lựa chọn tối ưu

Các giải pháp Cloud-native như AWS ECR hay Google Artifact Registry cũng tốt. Tuy nhiên, Harbor cung cấp mức độ kiểm soát mà các nhà cung cấp đám mây không thể sánh kịp. Nó không chỉ là một thùng chứa dữ liệu; nó là một nền tảng quản lý đầy đủ tính năng.

Kiểm soát truy cập chi tiết

Harbor tổ chức các image vào các dự án (project), giúp việc quản lý quyền trở nên đơn giản. Tôi đã cấu hình các bot CI/CD với quyền push/pull, trong khi các lập trình viên chỉ có quyền pull đối với môi trường production. Đối với các dự án development, họ có toàn quyền kiểm soát. Nó kết nối trực tiếp với Keycloak thông qua OIDC, vì vậy chúng tôi không phải quản lý một cơ sở dữ liệu người dùng riêng biệt.

Bảo mật tự động với Trivy

Bảo mật không nên làm thủ công. Harbor sử dụng trình quét Trivy để phân tích từng lớp (layer) của image nhằm tìm kiếm các lỗi CVE đã biết. Chúng tôi đã cấu hình một quy tắc cứng: nếu một image có dù chỉ một lỗ hổng ‘Critical’ (Nghiêm trọng), Harbor sẽ chặn lệnh pull. Điều này đảm bảo rằng các lỗi zero-day không thể xâm nhập vào cụm Kubernetes của chúng tôi.

Chính sách lưu trữ và đồng bộ thông minh

Chi phí lưu trữ tăng lên rất nhanh. Để tránh làm đầy ổ cứng, tôi đã thiết lập chính sách tự động xóa các image development cũ hơn 14 ngày. Chúng tôi giữ các tag production mãi mãi. Nếu bạn vận hành nhiều trung tâm dữ liệu, Harbor cũng có thể sao chép (replicate) image giữa các nơi để đảm bảo tốc độ pull nhanh nhất cho các cụm server khu vực.

Hướng dẫn triển khai thực tế

Nếu bạn đã từng làm việc với Docker Compose, bạn sẽ thấy việc thiết lập Harbor rất quen thuộc. Đối với môi trường production, đừng dùng các instance cấu hình thấp. Hãy sử dụng một máy ảo (VM) riêng biệt với ít nhất 8GB RAM và ổ SSD tốc độ cao để lưu trữ các layer của image.

1. Chuẩn bị môi trường

Kiểm tra xem máy chủ của bạn đã sẵn sàng Docker và Docker Compose chưa. Đừng cố tiết kiệm tài nguyên; Harbor chạy nhiều container sidecar để quản lý log và cơ sở dữ liệu.

# Kiểm tra phiên bản của bạn
docker --version
docker-compose --version

2. Tải về và cấu hình

Tải xuống bản phát hành ổn định mới nhất. Tôi hiện đang sử dụng v2.10.0 vì tính ổn định và giao diện UI được cải thiện.

wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-online-installer-v2.10.0.tgz
tar xvzf harbor-online-installer-v2.10.0.tgz
cd harbor

Nhiệm vụ chính của bạn là chỉnh sửa tệp harbor.yml. Bạn phải thiết lập hostname chính xác, nếu không các Docker client sẽ không thể kết nối. Đừng bao giờ nghĩ đến việc chạy hệ thống này qua HTTP — các phiên bản Docker hiện đại sẽ từ chối kết nối trừ khi bạn thực hiện các cấu hình phức tạp để bỏ qua bảo mật.

cp harbor.yml.tmpl harbor.yml
vi harbor.yml

Đảm bảo các chứng chỉ (certificate) của bạn đã sẵn sàng. Sử dụng Let’s Encrypt là cách dễ nhất để xử lý việc này cho một tên miền chuẩn production.

# Các thiết lập harbor.yml quan trọng
hostname: harbor.example.com

https:
  port: 443
  certificate: /etc/letsencrypt/live/harbor.example.com/fullchain.pem
  private_key: /etc/letsencrypt/live/harbor.example.com/privkey.pem

harbor_admin_password: NhapMatKhauManhTaiDay

3. Khởi chạy hệ thống

Chạy bộ cài đặt. Luôn bao gồm Trivy để quét mã độc và Notary nếu bạn muốn ký số image để ngăn chặn việc giả mạo.

sudo ./install.sh --with-trivy --with-notary

4. Kết nối Harbor vào Pipeline của bạn

Sau khi Harbor đã hoạt động, bạn cần tự động hóa quy trình. Trong thiết lập GitLab CI của chúng tôi, chúng tôi sử dụng một tài khoản dịch vụ (service account) thay vì thông tin đăng nhập cá nhân của lập trình viên. Điều này giúp giữ an toàn cho thông tin xác thực và làm cho log sạch sẽ hơn.

Dưới đây là một đoạn code ví dụ cho một job build-and-push tiêu chuẩn:

build_and_push:
  stage: build
  script:
    - echo "$REGISTRY_PASSWORD" | docker login $REGISTRY_URL -u "$REGISTRY_USER" --password-stdin
    - docker build -t $REGISTRY_URL/core/api:$CI_COMMIT_SHORT_SHA .
    - docker push $REGISTRY_URL/core/api:$CI_COMMIT_SHORT_SHA
    - docker tag $REGISTRY_URL/core/api:$CI_COMMIT_SHORT_SHA $REGISTRY_URL/core/api:latest
    - docker push $REGISTRY_URL/core/api:latest

5. ‘Scan on Push’ – Chốt chặn an toàn cuối cùng

Hãy bật tính năng “Scan on Push” trong cài đặt dự án ngay lập tức. Điều này buộc Harbor phải quét image ngay khi nó vừa được đẩy lên. Nếu Trivy tìm thấy một lỗi nghiêm trọng, đội ngũ bảo mật sẽ nhận được cảnh báo và chúng tôi sẽ dừng việc triển khai trước khi nó chạm đến máy chủ. Đó là một người gác cổng tự động không bao giờ ngủ.

Lời kết

Chuyển sang Harbor là bước đi hạ tầng tốt nhất mà chúng tôi đã thực hiện trong năm nay. Nó đã loại bỏ sự phụ thuộc vào giới hạn lượt tải của bên thứ ba và mang lại cho chúng tôi một tiêu chuẩn bảo mật chuyên nghiệp. Mặc dù việc quản lý chứng chỉ và lưu trữ tốn một chút công sức, nhưng sự yên tâm mà nó mang lại xứng đáng đến từng giây cấu hình. Nếu bạn đang quản lý hơn 10 microservice, hãy ngừng mạo hiểm với các registry công khai. Một registry riêng (private registry) chính là nền móng của một văn hóa DevOps trưởng thành.

Share: