Giới thiệu
Trong bài viết này, chúng ta sẽ tìm hiểu cách thiết lập một Docker Registry bảo mật (HTTPS) với xác thực cơ bản (Basic Auth) và cách tích hợp nó vào cụm Rancher/RKE2. Việc sử dụng Docker Registry riêng giúp bạn quản lý hình ảnh Docker một cách an toàn và hiệu quả hơn.
Mục lục
- Sản xuất chứng chỉ
- Cài đặt Docker Registry
- Triển khai chứng chỉ trên Node RKE2
- Tạo Kubernetes Secret
- Khắc phục sự cố
- Kết luận
1. Sản xuất chứng chỉ
Để Registry hoạt động an toàn qua HTTPS, cần phải tạo một chứng chỉ TLS tự ký.
1.1 Cấu hình OpenSSL
Đầu tiên, mở tệp cấu hình OpenSSL:
bash
/etc/ssl/openssl.cnf
Thêm cấu hình SAN (Subject Alternative Name) vào cuối tệp:
bash
[ mydocker ]
subjectAltName = DNS:mydocker.me
Nếu bạn muốn sử dụng nhiều miền, hãy phân tách bằng dấu phẩy:
bash
subjectAltName = DNS:mydocker.me, DNS:registry.local
1.2 Tạo Key và CSR
Chuyển đến thư mục chứa các tệp chứng chỉ:
bash
cd /etc/ssl/private
Tạo khóa riêng và yêu cầu chứng chỉ:
bash
openssl ecparam -name prime256v1 -genkey -out server.key
openssl req -new -key server.key -out server.csr
Khi được yêu cầu, hãy nhập tên miền của Registry vào mục Common Name (CN) (ví dụ: mydocker.me).
1.3 Tạo chứng chỉ
Chạy lệnh sau để tạo chứng chỉ:
bash
openssl x509 -in server.csr -out server.crt \
-req -signkey server.key \
-extfile /etc/ssl/openssl.cnf -extensions mydocker \
-days 3650
Tại đây, bạn sẽ nhận được ba tệp:
server.key→ Khóa riêngserver.crt→ Chứng chỉserver.csr→ Yêu cầu chứng chỉ (có thể xóa sau khi sử dụng)
2. Cài đặt Docker Registry
2.1 Cấu hình xác thực người dùng
Trước tiên, chúng ta cần cấu hình xác thực cơ bản cho Registry:
bash
apt install apache2-utils -y
mkdir -p /etc/docker/auth
htpasswd -Bc /etc/docker/auth/htpasswd muser
2.2 Khởi động Registry
Bây giờ, chúng ta sẽ khởi động Docker Registry với lệnh sau:
bash
docker run -d \
--restart=always \
--name registry \
-v /etc/ssl/private:/certs \
-v /etc/docker/auth:/auth \
-v /var/lib/registry:/var/lib/registry \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-p 443:443 \
registry:2
Kiểm tra Registry
Sau khi Registry đã được khởi động, hãy kiểm tra khả năng hoạt động bằng cách thực hiện các lệnh sau:
bash
docker pull nginx:latest # Tải hình ảnh nginx từ Docker Hub
docker login mydocker.me # Đăng nhập vào Registry của bạn
docker tag nginx:latest mydocker.me/nginx:latest
docker push mydocker.me/nginx:latest
docker pull mydocker.me/nginx:latest
3. Triển khai chứng chỉ trên Node RKE2
RKE2 sử dụng containerd. Để các node có thể tin tưởng chứng chỉ tự ký, bạn cần sao chép chứng chỉ CA tới mỗi node.
3.1 Sao chép đến thư mục của RKE2
bash
mkdir -p /etc/rancher/rke2/certs.d/mydocker.me
cp /etc/ssl/private/server.crt /etc/rancher/rke2/certs.d/mydocker.me/ca.crt
3.2 Thêm vào kho tin cậy toàn cầu (tùy chọn nhưng được khuyến nghị)
bash
cp /etc/ssl/private/server.crt /usr/local/share/ca-certificates/mydocker.crt
update-ca-certificates
3.3 Khởi động lại dịch vụ
bash
systemctl restart rke2-server # nút master
systemctl restart rke2-agent # nút worker
4. Tạo Kubernetes Secret
4.1 Tạo Secret
Chạy lệnh sau để tạo Kubernetes Secret:
bash
kubectl create secret docker-registry pullsecretq \
--docker-server=mydocker.me \
--docker-username=muser \
--docker-password='password' \
-n default
Lưu ý: Tên miền trong
--docker-serverchỉ nên là tên miền mà không cần thêmhttps://.
4.2 Sử dụng secret trong Deployment
Dưới đây là ví dụ về cách sử dụng secret trong một Deployment:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-registry
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: test-registry
template:
metadata:
labels:
app: test-registry
spec:
containers:
- name: nginx
image: mydocker.me/nginx:latest
imagePullSecrets:
- name: pullsecretq
Sau khi tạo tệp Deployment, áp dụng nó:
bash
kubectl apply -f test-registry.yaml
kubectl get pods -w
5. Khắc phục sự cố
- Lỗi x509: chứng chỉ được ký bởi cơ quan không xác định: Chứng chỉ không có trong
/etc/rancher/rke2/certs.d/mydocker.me/ca.crthoặc thiếu SAN. - Không có thông tin xác thực cơ bản: Secret đã được tạo với tên miền sai (dùng
mydocker.methay vìhttps://mydocker.me). - 401 Unauthorized: Thông tin người dùng/mật khẩu trong tệp htpasswd không khớp với thông tin trong Kubernetes secret.
6. Kết luận
Bằng cách làm theo các bước trên, bạn có thể dễ dàng thiết lập một Docker Registry bảo mật và tích hợp nó với Rancher. Điều này không chỉ giúp bảo vệ hình ảnh Docker của bạn mà còn cải thiện quy trình triển khai ứng dụng. Hãy thử nghiệm ngay hôm nay và khám phá những lợi ích mà Docker Registry mang lại cho dự án của bạn!
Các thực hành tốt nhất
- Đảm bảo cập nhật chứng chỉ TLS thường xuyên để bảo mật tối đa.
- Sử dụng tên miền hợp lệ cho Registry.
- Thực hiện kiểm tra định kỳ để đảm bảo tính sẵn sàng của Registry.
Những cạm bẫy phổ biến
- Không cấu hình đúng SAN trong chứng chỉ có thể dẫn đến lỗi xác thực.
- Quên khởi động lại dịch vụ sau khi cập nhật chứng chỉ.
Mẹo hiệu suất
- Sử dụng SSD cho lưu trữ Registry để cải thiện tốc độ truy cập.
- Tối ưu hóa cấu hình Docker Registry để phù hợp với khối lượng công việc của bạn.
FAQ
Q: Có thể sử dụng chứng chỉ từ một CA công cộng không?
A: Có, nhưng nếu bạn muốn sử dụng chứng chỉ tự ký, hãy chắc chắn rằng tất cả các node trong cụm đều tin cậy chứng chỉ đó.
Q: Làm thế nào để xóa một Registry?
A: Bạn có thể sử dụng lệnh docker rm -f registry để xóa Registry nếu không còn cần thiết nữa.