Mở đầu

Khi triển khai các ứng dụng trên Kubernetes (K8S), việc đảm bảo giao tiếp an toàn thông qua HTTPS là một yêu cầu quan trọng. Tuy nhiên, quản lý chứng chỉ TLS/SSL thủ công có thể tốn thời gian và dễ xảy ra sai sót. Đây là lúc Cert Manager xuất hiện như một giải pháp cứu cánh. Trong bài viết này, tôi sẽ hướng dẫn các bạn từng bước để hiểu Cert Manager là gì, tại sao nó quan trọng, cách cài đặt, cấu hình và sử dụng nó trong K8S một cách hiệu quả.

1. Cert Manager là gì?

Cert Manager là một công cụ mã nguồn mở được thiết kế để tự động hóa việc quản lý và cấp phát chứng chỉ TLS trong Kubernetes. Nó giúp chúng ta:

  • Tự động xin cấp chứng chỉ: Từ các nhà cung cấp như Let’s Encrypt, HashiCorp Vault, hoặc thậm chí tự ký (self-signed).
  • Gia hạn chứng chỉ: Đảm bảo chứng chỉ luôn hợp lệ mà không cần bạn can thiệp thủ công.
  • Quản lý dễ dàng: Sử dụng các tài nguyên Kubernetes như Certificate, Issuer, và ClusterIssuer để quản lý chứng chỉ theo cách khai báo (declarative).

Nói một cách đơn giản, Cert Manager là “người quản gia” của chứng chỉ TLS trong cụm K8S của bạn, giúp các ứng dụng giao tiếp an toàn qua HTTPS mà không gây đau đầu.

2. Tại sao cần Cert Manager trong Kubernetes?

Nếu bạn từng quản lý chứng chỉ thủ công, bạn sẽ hiểu nỗi khổ khi chứng chỉ hết hạn bất ngờ hoặc cấu hình sai dẫn đến downtime. Cert Manager giải quyết những vấn đề này bằng cách:

  • Tự động hóa toàn bộ quy trình: Từ xin cấp đến gia hạn chứng chỉ.
  • Tích hợp linh hoạt: Làm việc với nhiều nhà cung cấp chứng chỉ như Let’s Encrypt (miễn phí và phổ biến), Venafi, hay HashiCorp Vault.
  • Tích hợp với K8S: Sử dụng các Custom Resource Definitions (CRDs) để quản lý chứng chỉ như một phần của workflow Kubernetes.

Ví dụ, nếu bạn chạy một ứng dụng web trên K8S và cần HTTPS, Cert Manager sẽ tự động cấp chứng chỉ và gắn nó vào Ingress của bạn. Điều này giúp bạn tiết kiệm thời gian và giảm rủi ro.

3. Cài đặt Cert Manager

Có hai cách phổ biến để cài đặt Cert Manager:

Cách 1: Sử dụng Helm

Helm là công cụ quản lý package cho Kubernetes, giúp cài đặt Cert Manager dễ dàng hơn. Các bước như sau:

  1. Thêm Helm repository của Cert Manager:
helm repo add jetstack https://charts.jetstack.io
helm repo update
  1. Cài đặt Cert Manager:
helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.14.5 \
  --set installCRDs=true
  • –namespace cert-manager: Tạo một namespace riêng cho Cert Manager.
  • –set installCRDs=true: Cài đặt các CRDs cần thiết.
  1. Kiểm tra cài đặt:
kubectl get pods -n cert-manager

Bạn sẽ thấy các pod như cert-manager, cert-manager-cainjector, và cert-manager-webhook đang chạy.

Cách 2: Cài đặt thủ công bằng YAML

Nếu không dùng Helm, ta có thể tải file manifest từ GitHub:

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.5/cert-manager.yaml

Sau khi cài đặt, kiểm tra trạng thái giống như trên.

4. Cấu hình Cert Manager

Sau khi cài đặt, ta cần cấu hình Cert Manager để nó biết cách xin cấp chứng chỉ từ đâu. Điều này được thực hiện qua Issuer hoặc ClusterIssuer.

  • Issuer: Dành cho một namespace cụ thể.
  • ClusterIssuer: Áp dụng cho toàn bộ cụm K8S.

Ví dụ: Cấu hình ClusterIssuer với Let’s Encrypt
Let’s Encrypt là nhà cung cấp chứng chỉ miễn phí phổ biến. Dưới đây là cách cấu hình:

  1. Tạo file clusterissuer.yaml:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: your-email@example.com
    privateKeySecretRef:
      name: letsencrypt-prod-key
    solvers:
    - http01:
        ingress:
          class: nginx
  1. Apply manifest:
kubectl apply -f clusterissuer.yaml
  • server: Địa chỉ API của Let’s Encrypt (dùng staging để thử nghiệm: https://acme-staging-v02.api.letsencrypt.org/directory).
  • email: Email của bạn để nhận thông báo từ Let’s Encrypt.
  • solvers: Phương thức xác thực (ở đây dùng http01 với Ingress).

Sử dụng Cert Manager để cấp chứng chỉ

Bây giờ, hãy yêu cầu Cert Manager cấp một chứng chỉ cho ứng dụng của bạn.

  1. Tạo file certificate.yaml:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-com-cert
  namespace: default
spec:
  secretName: example-com-tls
  dnsNames:
  - example.com
  - www.example.com
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  1. Apply manifest:
kubectl apply -f certificate.yaml
  • secretName: Tên Secret nơi Cert Manager sẽ lưu chứng chỉ.
  • dnsNames: Các tên miền cần cấp chứng chỉ.
  • issuerRef: Liên kết với ClusterIssuer đã tạo.

Cert Manager sẽ tự động xin cấp chứng chỉ từ Let’s Encrypt và lưu vào Secret example-com-tls.

  1. Sử dụng chứng chỉ với Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  namespace: default
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - example.com
    - www.example.com
    secretName: example-com-tls
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80

Apply file này, và ứng dụng của bạn sẽ chạy với HTTPS!

6. Gia hạn và quản lý chứng chỉ

Cert Manager tự động gia hạn chứng chỉ khoảng 30 ngày trước khi hết hạn. Chúng ta có thể:

  • Theo dõi trạng thái:
kubectl describe certificate example-com-cert
  • Xem log:
kubectl logs -n cert-manager -l app=cert-manager

9. Kết luận

Cert Manager là một công cụ không thể thiếu nếu bạn muốn triển khai HTTPS trong Kubernetes một cách an toàn và tự động. Từ việc cài đặt dễ dàng bằng Helm, cấu hình với Let’s Encrypt, đến quản lý chứng chỉ declarative, Cert Manager giúp bạn tiết kiệm thời gian và tránh lỗi thủ công.