Cách triển khai Nginx Ingress với Cert-Manager trên Bizfly Kubernetes Engine
Giới thiệu
Kubernetes Ingress cho phép người quản trị định tuyến lưu lượng từ bên ngoài vào các Service cụm Kubernetes. Có thể dùng các tập luật trong ingress để định tuyến lưu lượng HTTP hoặc HTTPS, các tập luật này có thể viết trong Ingress Controller
Bài viết sẽ hướng dẫn cách triển khai Kubernetes (K8s)
Chuẩn bị
Trước khi bắt đầu, chúng ta cần chuẩn bị:
- 1 cụm Kubernetes với RBAC. Trong bài viết sẽ sử dụng cụm BKE
- Công cụ dòng lệnh kubectl trên máy tính cá nhân
- 1 domain và bản ghi DNS có thể trỏ đến BLB được sử dụng bởi ingress
Bước 1 - Cài đặt dịch vụ web
Trước khi triển khai Ingress Controller, ta sẽ tạo 2 Service mẫu để có thể định tuyến lưu lượng đến Ingress. Service sẽ chạy "http-echo" webserver container, khi có request đến sẽ có một chuỗi văn bản trả về
Ở trên máy cá nhân, tạo file echo1.yaml với vim (hoặc bất cứ trình soạn thảo văn bản nào khác)
vim echo1.yaml
Ta sẽ tạo 1 Service gọi là echo1 sẽ điều hướng lưu lượng đến Pod với nhãn app: echo1. Service sẽ tiếp nhận lưu lượng từ TCP port 80 và điều hướng đến port 5678
Tiếp đến ta sẽ định nghĩa Deployment tên là echo1 để quản lý các Pod với nhãn app: echo1 và mở port 6789 trên container
Sau đó ta sẽ tạo các tài nguyên kubernetes đó sử dụng lệnh kubectl apply -f echo1.yaml
Lặp lại và tiếp tục tạo dịch vụ echo2
Bước 2 - Cài đặt dịch vụ Kubernetes Nginx Ingress Controller
Có nhiều phiên bản nginx ingress controller, trong bài viết sẽ sử dụng phiên bản https://kubernetes.github.io/ingress-nginx/deploy/ được hỗ trợ bởi cộng đồng
Nginx Ingress Controller chưa Pod chạy nginx, trong pod sẽ chạy nginx webserver sẽ theo dõi Kubernetes Control Plane để cập nhật các Ingress Resource. Ingress Resource về cơ bản là danh sách các quy tắc định tuyến lưu lượng tới các dịch vụ backend. Ví dụ, quy tắc của ingress rul có thể điều phối các lưu lượng đến path /web1 sẽ đến backend web1. từ đó ta có thể truy cập vào website web1.xxxxxx.yyy sẽ điều hướng đến dịch vụ backend web1
Bài viết sẽ hướng dẫn triển khai Ingress Controller cho cluster BKE. Ingress Controller sẽ tạo Service Load Balancer được cấp bởi BLB để định tuyến tất cả traffic từ ngoài vào Ingress controller
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/cloud/deploy.yaml
Sau 1 vài phút chúng ta sẽ có 1 IP public của BLB
LB này sẽ nhận lưu lượng từ HTTP và HTTPS trên port 80 và 443 rồi chuyển tiếp xuống Pod Ingress Controller
Bước 3 - Tạo các Ingress Resource
Ta sẽ sử dụng domain quanlm1999.tk
Ta sẽ tạo 2 rule để định tuyến lưu lượng là echo1.quanlm1999.tk đến backend service web1 và echo2.quanlm1999.tk để đến backend web2
Ta sẽ tạo ingress như sau:
Sau khi tạo xong Ingress ta sẽ trỏ bản ghi A sử dụng dịch vụ quản lý DNS, trong bài viết sẽ sử dụng trình quản lý DNS của BizflyCloud. Ta sẽ trỏ như sau
Ta gọi thử đến dịch vụ
Bước 4 - Tạo và cấu hình Cert-manager
Trong bài viết ta sẽ cài đặt version v1.11.0 của cert-manager. cert-manager là add-on của Kubernetes cung cấp chứng chỉ TLS từ Let's Encrypt hoặc từ các CA khác và quản lý chu kỳ của các chứng chỉ đó.
Ta cài đặt cert-manager:
Trước khi cấp chứng chỉ cho 2 domain echo1.quanlm1999.tk và echo2.quanlm1999.tk trong bài biết sẽ sử dụng Let's Encrypt CA.
Tạo ClusterIssuer để test, ta sẽ dùng letsencrypt-staging để test, vì production giới hạn lượng request, nên khi test ta sẽ dùng staging
Tương tự với production:
Bước 5 - Phát hành chứng chỉ Let's Encrypt
Để phát hành chứng chỉ Let's encrypt, ta sẽ bổ sung thêm 1 số trường vào ingress
Ta theo dõi trang thái với lệnh kubectl describe ingress
Tương tự, theo dõi trạng thái của certificate: kubectl describe certificate echo-tls
sử dụng trình duyệt web, truy cập và ta thấy chứng chỉ cấp bởi Let's Encrypt (Staging)
Đối với chứng chỉ Let's Encrypt staging
Tương tự, khi thay ingress thành cert-manager.io/cluster-issuer: "letsencrypt-prod",
Chứng chỉ đã sử dụng Let's Encrypt
Kết luận
Bài viết đã hướng dẫn việc cài đặt Nginx ingress kết hợp với cert-manager để cấp chứng chỉ TLS cho 2 domain.