0
0
Lập trình
NM

Cài Đặt HTTPS trên Kubernetes với cert-manager và Let's Encrypt

Đăng vào 6 tháng trước

• 9 phút đọc

Chủ đề:

KungFuTech

Hướng Dẫn Cài Đặt HTTPS Trên Kubernetes Với cert-manager và Let's Encrypt

Trong bối cảnh kỹ thuật số hiện nay, việc bảo mật các ứng dụng web của bạn bằng HTTPS là điều không thể thiếu. HTTPS không chỉ đảm bảo quyền riêng tư dữ liệu mà còn xây dựng lòng tin của người dùng và phù hợp với các tiêu chuẩn bảo mật hiện đại. Nếu bạn đang vận hành một cụm Kubernetes và muốn kích hoạt HTTPS cho ingress của mình bằng chứng chỉ SSL từ Let's Encrypt, cert-manager sẽ là công cụ lý tưởng để tự động hóa quản lý chứng chỉ.

Bài viết này cung cấp một hướng dẫn chi tiết từng bước để cấu hình HTTPS trên cụm Kubernetes với cert-manager và Let's Encrypt. Chúng tôi sẽ đi qua toàn bộ quy trình, từ việc xác thực cấu hình của bạn đến xử lý các vấn đề thường gặp, đảm bảo miền của bạn (ví dụ: platform-dev.example.ai) được bảo mật bằng chứng chỉ SSL hợp lệ.

Tổng Quan: Những Gì Chúng Ta Sẽ Xây Dựng

Hướng dẫn này sẽ chỉ ra cách thiết lập HTTPS cho một ingress Kubernetes bằng cert-manager, một tiện ích mở rộng mạnh mẽ của Kubernetes tự động hóa việc cấp phát và gia hạn chứng chỉ SSL từ Let's Encrypt. Đến cuối hướng dẫn này, bạn sẽ có:

  • Một cụm Kubernetes với trình điều khiển nginx ingress.
  • Một miền (ví dụ: platform-dev.example.ai) được ánh xạ đến IP công cộng của cụm (ví dụ: 34.75.54.5).
  • Một ingress được cấu hình cho HTTPS với quản lý chứng chỉ SSL tự động.

Trạng Thái Thiết Lập Ban Đầu

Trước khi bắt đầu, hãy làm rõ điểm khởi đầu của bạn:

  • Cụm: Một cụm Kubernetes với trình điều khiển nginx ingress đã được triển khai.
  • Miền: Một miền (ví dụ: platform-dev.example.ai) được ánh xạ đến IP công cộng 34.75.54.5.
  • Ingress: Một ingress hiện có với phần TLS, nhưng chứng chỉ không hoạt động đúng cách.
  • Mục Tiêu: Kích hoạt HTTPS với cấp phát và gia hạn chứng chỉ SSL tự động bằng cert-manager và Let's Encrypt.

Điều Kiện Tiên Quyết

Để theo dõi hướng dẫn này, hãy đảm bảo bạn có:

  • Một cụm Kubernetes với trình điều khiển nginx ingress đã cài đặt.
  • Một tên miền đã đăng ký trỏ đến IP công cộng của cụm.
  • kubectl được cấu hình với quyền truy cập vào cụm của bạn.

Hãy bắt đầu với quy trình thiết lập.

Bước 1: Xác Minh Cài Đặt cert-manager

Bước đầu tiên là xác nhận xem cert-manager đã được cài đặt trong cụm Kubernetes của bạn hay chưa. cert-manager là một công cụ bản địa của Kubernetes giúp đơn giản hóa việc quản lý chứng chỉ bằng cách tự động hóa quy trình cấp phát, gia hạn và quản lý chứng chỉ SSL.

Chạy lệnh sau để kiểm tra các pod cert-manager hiện có:

Copy
kubectl get pods -n cert-manager

Nếu cert-manager đã được cài đặt, bạn sẽ thấy ba pod đang chạy:

  • cert-manager-xxxxx
  • cert-manager-cainjector-xxxxx
  • cert-manager-webhook-xxxxx

Nếu các pod này không có mặt, bạn cần cài đặt cert-manager. Sử dụng lệnh sau để triển khai phiên bản ổn định mới nhất (v1.13.0 tại thời điểm viết bài):

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

Sau khi áp dụng manifest, hãy chạy lại lệnh kubectl get pods -n cert-manager để xác minh rằng ba pod cert-manager đang chạy. Điều này đảm bảo cert-manager đã sẵn sàng để quản lý chứng chỉ cho cụm của bạn.

Bước 2: Tạo ClusterIssuer cho Let's Encrypt

Một ClusterIssuer là một tài nguyên Kubernetes định nghĩa cách cert-manager sẽ cấp phát chứng chỉ. Trong trường hợp này, chúng ta sẽ cấu hình một ClusterIssuer để giao tiếp với máy chủ ACME sản xuất của Let's Encrypt để cấp phát chứng chỉ SSL hợp lệ.

Đầu tiên, kiểm tra xem một ClusterIssuer có tên là letsencrypt-prod đã tồn tại chưa:

Copy
kubectl get clusterissuer letsencrypt-prod

Nếu nó không tồn tại hoặc không được cấu hình đúng, hãy tạo một cái với URL máy chủ ACME chính xác. Quan trọng: Nhiều hướng dẫn thường sử dụng URL máy chủ ACME không chính xác. URL đúng là:

  • Đúng: https://acme-v02.api.letsencrypt.org/directory
  • Sai: https://acme-v2.api.letsencrypt.org/directory

Để tạo ClusterIssuer, hãy áp dụng cấu hình sau, thay thế your-email@company.com bằng địa chỉ email thực tế của bạn (được sử dụng cho thông báo từ Let's Encrypt):

Copy
cat <<EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: your-email@company.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx
EOF

Sau khi áp dụng, hãy xác minh rằng ClusterIssuer đã sẵn sàng:

Copy
kubectl get clusterissuer letsencrypt-prod

Kết quả nên hiển thị READY: True. Nếu nó không sẵn sàng, chúng ta sẽ xem xét xử lý sự cố trong Bước 5.

Bước 3: Cấu Hình Ingress cho HTTPS

Tài nguyên ingress Kubernetes của bạn cần các chú thích và cấu hình cụ thể để hoạt động với cert-manager và kích hoạt HTTPS. Dưới đây là cấu hình ingress hoàn chỉnh cho miền của bạn (ví dụ: platform-dev.example.ai), điều hướng lưu lượng đến hai dịch vụ: platform-uiplatform-api.

Áp dụng cấu hình ingress sau:

Copy
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/enable-rewrite-log: "true"
    nginx.ingress.kubernetes.io/use-regex: "true"
  name: example-ingress
  namespace: platform-namespace
spec:
  ingressClassName: nginx
  rules:
  - host: platform-dev.example.ai
    http:
      paths:
      - backend:
          service:
            name: platform-ui
            port:
              number: 80
        path: /
        pathType: Prefix
      - backend:
          service:
            name: platform-api
            port:
              number: 80
        path: /api
        pathType: Prefix
  tls:
  - hosts:
    - platform-dev.example.ai
    secretName: example-tls

Điểm Chính Trong Cấu Hình:

  • Chú Thích: cert-manager.io/cluster-issuer: letsencrypt-prod cho cert-manager biết sử dụng letsencrypt-prod để cấp phát chứng chỉ.
  • Phần TLS: Chỉ định miền (platform-dev.example.ai) và secret (example-tls) nơi cert-manager sẽ lưu trữ chứng chỉ SSL.
  • Đường Dẫn: Điều hướng / đến dịch vụ platform-ui/api đến dịch vụ platform-api, cả hai đều sử dụng cổng 80.
  • Namespace: Đảm bảo ingress được tạo trong namespace chính xác (platform-namespace).

Cấu hình này sẽ kích hoạt cert-manager yêu cầu chứng chỉ từ Let's Encrypt và lưu trữ nó trong secret example-tls.

Bước 4: Xác Minh Việc Tạo Chứng Chỉ

Khi ingress được cấu hình, cert-manager sẽ tự động yêu cầu một chứng chỉ từ Let's Encrypt. Để theo dõi quá trình tạo chứng chỉ, hãy sử dụng các lệnh sau:

Copy
# Kiểm tra trạng thái chứng chỉ
kubectl get certificate -n platform-namespace

# Lấy thông tin chi tiết về chứng chỉ
kubectl describe certificate example-tls -n platform-namespace

# Kiểm tra các yêu cầu chứng chỉ (để xử lý sự cố)
kubectl get certificaterequest -n platform-namespace

Đối với một chứng chỉ thành công, kết quả của kubectl get certificate nên trông như sau:

Copy
NAME         READY   SECRET       AGE
example-tls  True    example-tls  5m

Trạng thái READY: True cho biết rằng chứng chỉ đã được cấp phát thành công và được lưu trữ trong secret example-tls.

Bước 5: Xử Lý Các Vấn Đề Thường Gặp

Nếu có điều gì đó không đúng, dưới đây là các vấn đề thường gặp và giải pháp:

1. ClusterIssuer Không Sẵn Sàng

Nếu trạng thái của ClusterIssuer không phải là READY: True, hãy chạy:

Copy
kubectl describe clusterissuer letsencrypt-prod

Kiểm tra các sự kiện hoặc trạng thái để tìm lỗi. Vấn đề phổ biến nhất là URL máy chủ ACME không chính xác (ví dụ: sử dụng acme-v2 thay vì acme-v02). Đảm bảo rằng URL là https://acme-v02.api.letsencrypt.org/directory.

2. Chứng Chỉ Bị Đình Trệ Trong Trạng Thái Chờ

Nếu trạng thái chứng chỉ hiển thị là chờ, hãy điều tra bằng lệnh:

Copy
kubectl describe certificate example-tls -n platform-namespace
kubectl logs -n cert-manager deployment/cert-manager

Tìm kiếm lỗi liên quan đến quy trình thách thức ACME, chẳng hạn như lỗi thách thức HTTP-01.

3. Vấn Đề DNS

Đảm bảo miền của bạn được phân giải chính xác đến IP công cộng của cụm. Kiểm tra phân giải DNS từ bên trong cụm:

Copy
kubectl run test-dns --rm -it --restart=Never --image=busybox -- nslookup platform-dev.example.ai

Xác minh khả năng kết nối đến máy chủ ACME của Let's Encrypt:

Copy
kubectl run test-connectivity --rm -it --restart=Never --image=curlimages/curl -- curl -I https://acme-v02.api.letsencrypt.org/directory

Bước 6: Xác Minh HTTPS Đang Hoạt Động

Khi chứng chỉ đã được cấp phát, hãy kiểm tra điểm cuối HTTPS của bạn để xác nhận rằng nó đang hoạt động:

Copy
# Kiểm tra phản hồi HTTPS
curl -I https://platform-dev.example.ai

# Kiểm tra chi tiết chứng chỉ
openssl s_client -connect platform-dev.example.ai:443 -servername platform-dev.example.ai

Các Chỉ Số Thành Công Chính

Cài đặt của bạn thành công nếu:

  • ✅ Trạng thái chứng chỉ là READY: True.
  • ✅ Trạng thái ClusterIssuer là READY: True.
  • ✅ Ingress hiển thị cả hai cổng 80 và 443.
  • ✅ Secret example-tls tồn tại với dữ liệu chứng chỉ.
  • ✅ Trang web có thể truy cập qua HTTPS.

Vòng Đời Chứng Chỉ

  • Thời Gian Hiệu Lực: Chứng chỉ của Let's Encrypt có thời gian hiệu lực là 90 ngày.
  • Tự Động Gia Hạn: cert-manager tự động gia hạn chứng chỉ 30 ngày trước khi hết hạn.
  • Giám Sát: Kiểm tra thời gian gia hạn của chứng chỉ trong trạng thái của nó với kubectl describe certificate example-tls -n platform-namespace.

Thực Hành Bảo Mật Tốt Nhất

Để đảm bảo một thiết lập an toàn và đáng tin cậy:

  1. Cấu Hình Email: Sử dụng một địa chỉ email được theo dõi cho các thông báo từ Let's Encrypt để luôn được thông báo về các vấn đề hoặc gia hạn chứng chỉ.
  2. Quản Lý Secret: cert-manager tự động quản lý các secret TLS, vì vậy hãy tránh thay đổi thủ công.
  3. Chuyển Hướng HTTP đến HTTPS: Thêm chú thích sau vào ingress của bạn để buộc sử dụng HTTPS:
Copy
nginx.ingress.kubernetes.io/ssl-redirect: "true"

Tóm Tắt Cấu Hình Cuối Cùng

Để thiết lập HTTPS thành công, hãy đảm bảo:

  1. cert-manager đã được cài đặt và đang chạy.
  2. ClusterIssuer sử dụng URL máy chủ ACME chính xác.
  3. Ingress bao gồm chú thích cert-manager và phần TLS.
  4. DNS được cấu hình chính xác để trỏ đến IP công cộng của cụm.
  5. Xác thực miền hoàn thành thành công.

Tham Khảo Các Lệnh Xử Lý Sự Cố Nhanh

Để chẩn đoán nhanh, hãy sử dụng các lệnh sau:

Copy
# Kiểm tra các thành phần cert-manager
kubectl get pods -n cert-manager
kubectl logs -n cert-manager deployment/cert-manager

# Kiểm tra chứng chỉ
kubectl get certificate -A
kubectl describe certificate example-tls -n platform-namespace

# Kiểm tra ClusterIssuer
kubectl get clusterissuer
kubectl describe clusterissuer letsencrypt-prod

# Kiểm tra ingress
kubectl get ingress -A
kubectl describe ingress example-ingress -n platform-namespace

# Kiểm tra secret
kubectl get secret example-tls -n platform-namespace -o yaml

Kết Luận

Bằng cách làm theo hướng dẫn này, bạn đã thành công trong việc cấu hình HTTPS cho ingress Kubernetes của bạn sử dụng cert-manager và Let's Encrypt.

Miền của bạn (ví dụ: platform-dev.example.ai) giờ đây đã được bảo mật bằng chứng chỉ SSL được quản lý tự động, đảm bảo giao tiếp an toàn cho người dùng của bạn. Với cert-manager xử lý các lần gia hạn, bạn có thể tập trung vào việc xây dựng ứng dụng của mình trong khi vẫn duy trì bảo mật vững chắc.

Nếu bạn gặp bất kỳ vấn đề nào, hãy tham khảo các lệnh xử lý sự cố hoặc liên hệ với cộng đồng Kubernetes hoặc cert-manager để được hỗ trợ. Chúc bạn thành công trong việc bảo mật!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào