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ó:
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-xxxxxcert-manager-cainjector-xxxxxcert-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):
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:
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):
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:
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-ui và platform-api.
Áp dụng cấu hình ingress sau:
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-prodcho cert-manager biết sử dụngletsencrypt-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-uivà/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:
# 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:
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:
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:
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:
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:
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:
# 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-tlstồ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:
- 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ỉ.
- 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.
- 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:
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:
- cert-manager đã được cài đặt và đang chạy.
ClusterIssuersử dụng URL máy chủ ACME chính xác.- Ingress bao gồm chú thích cert-manager và phần TLS.
- DNS được cấu hình chính xác để trỏ đến IP công cộng của cụm.
- 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:
# 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!