Giới thiệu
Khi triển khai microservices trên Kubernetes, bạn có thể đã trải qua những khó khăn như hàng loạt tệp YAML, sao chép cấu hình và duy trì các bản khai khác nhau cho mỗi dịch vụ. Điều này có thể hoạt động tốt… cho đến khi bạn cần mở rộng. Helm là giải pháp cho vấn đề đó. Bằng cách tạo các chart riêng của mình, bạn có thể biến những bản khai lộn xộn thành các khối xây dựng có thể tái sử dụng và mở rộng dễ dàng khi ứng dụng của bạn phát triển.
Trong bài viết này, tôi sẽ hướng dẫn bạn cách tôi đã xây dựng một ứng dụng mua sắm với nhiều microservices, triển khai trên AWS EKS bằng Terraform, nhưng quan trọng hơn, cách tôi đã làm cho toàn bộ cấu hình trở nên mô-đun với các Helm charts tùy chỉnh.
Điều Cần Biết Trước Khi Triển Khai Ứng Dụng Microservices
Trước khi bắt đầu, bạn cần xác định:
- Các microservices nào cần triển khai
- Các dịch vụ nào giao tiếp với nhau
- Cách chúng giao tiếp
- Cơ sở dữ liệu nào mà chúng sử dụng
- Các cổng mà mỗi dịch vụ chạy trên
Tại Sao Nên Viết Helm Charts Của Riêng Bạn?
- Tính tái sử dụng - không có YAML trùng lặp
- Khả năng mở rộng - dễ dàng thêm dịch vụ mới
- Tính linh hoạt - sử dụng
values.yamlđể cấu hình riêng cho từng môi trường - Tính nhất quán - Redis, ingress, và microservices chia sẻ cấu trúc
Thay vì triển khai một lần, cách tiếp cận này đã cho tôi một khung để phát triển ứng dụng mà không gặp rắc rối.
Các Yêu Cầu Cần Thiết
Trước khi tiến vào chi tiết, bạn nên có:
- Kiến thức cơ bản về Kubernetes – triển khai, dịch vụ, và ingress
- Kiến thức cơ bản về Terraform – cách cung cấp hạ tầng (init, apply, destroy)
Hạ Tầng Trước: Terraform + EKS
Tôi đã sử dụng Terraform để cung cấp nền tảng:
- Một VPC với các subnet
- Một cụm EKS
- Các IAM roles và cấu hình mạng
Với điều này, việc khởi động hoặc dừng cụm chỉ cần:
bash
cd infra
tf init
tf apply --auto-approve
tf destroy --auto-approve
Xây Dựng Helm Charts Cho Mỗi Thành Phần
Thay vì gom tất cả microservices vào một bản khai, tôi đã xây dựng một chart cho mỗi thành phần:
manifests/
├── charts/
│ ├── ingress/
│ ├── redis/
│ └── shopping-ms/
├── values/
├── helmfile.yaml
└── issuer.yaml
Tôi đã tạo chart cho cơ sở dữ liệu Redis, ingress và microservice.
bash
helm create <chart-name>
Ví dụ, tôi đã tạo một chart cho microservice mua sắm:
bash
helm create shopping-ms
Điều này sẽ tạo ra một cấu trúc thư mục như sau:
shopping-ms/
├── charts/
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── _helpers.tpl
├── values.yaml
├── Chart.yaml
└── .helmignore
Từ đây, các mẫu có thể được chỉnh sửa với các tham số để phù hợp với microservice, và values.yaml sẽ chứa các giá trị mặc định cho chart.
Bây giờ, quay trở lại hai cấp trên thư mục shopping-ms/, trong manifests/, bên trong values/, chúng ta có thể có các values.yaml riêng cho mỗi microservice. Các giá trị trong những tệp YAML này sẽ ghi đè các giá trị mặc định trong values.yaml của thư mục chart.
Bảo Mật Ingress Với TLS
- Cài đặt Nginx Ingress Controller trong cụm, chịu trách nhiệm tạo loadbalancer và xử lý lưu lượng truy cập. Triển khai và dịch vụ trong chart Ingress cơ bản là các quy tắc mà controller tuân theo để biết cách xử lý lưu lượng truy cập.
Tôi đã sử dụng kho Helm cho nginx-ingress controller và cert-manager trực tiếp từ Helm để giảm thiểu nhiều công việc thừa, tôi sẽ đến cert-manager sau, hãy kiên nhẫn nhé!
bash
# Thêm kho Helm cho ingress-nginx
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# Cài đặt ingress-nginx vào namespace riêng
kubectl create namespace ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.publishService.enabled=true
# Xác minh Ingress Controller
kubectl get pods -n ingress-nginx
# Kiểm tra dịch vụ LoadBalancer
kubectl get svc -n ingress-nginx
- Bạn cần có một tên miền hiện có hoặc tạo một, trỏ tên miền của bạn đến IP LoadBalancer với một bản ghi CNAME.
- Cài đặt cert-manager trong cụm. Điều này sẽ xử lý việc tạo tự động chứng chỉ và gia hạn trước khi hết hạn. Tuy nhiên, một
clusterissuerhoặcissuerlà cần thiết để nói cho cert-manager biết CA (cơ quan cấp chứng chỉ) nào sẽ sử dụng. Ngoài ra, annotation củacert-manager.io/cluster-issuer: letsencrypt-prodphải được định nghĩa trongingress.yamlđể ingress có thể yêu cầu chứng chỉ thành công.
bash
kubectl create namespace cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--set installCRDs=true
# Điều này cài đặt cert-manager và các CRDs (nếu không, issuers sẽ không hoạt động, điều này là cần thiết cho TLS).
# Xác minh cài đặt
kubectl get pods -n cert-manager
- Chúng ta cần áp dụng
issuer.yaml, để cert-manager đã sẵn sàng phục vụ chứng chỉ khi được yêu cầu.
bash
kubectl apply -f issuer.yaml
Lưu Ý Quan Trọng
- Ingress controller là tài nguyên toàn cụm, không thuộc về namespace cụ thể
- cert-manager cũng là một tài nguyên toàn cụm
- Sử dụng ClusterIssuer thay vì Issuer cho các chứng chỉ áp dụng cho nhiều namespace
Triển Khai Với Helmfile
Quản lý từng chart một cách riêng lẻ nhanh chóng trở nên phức tạp. Đó là lý do tôi sử dụng Helmfile, một lệnh duy nhất để áp dụng hoặc hủy tất cả các chart cùng một lúc.
bash
helmfile apply
helmfile destroy
Truy Cập Ứng Dụng
Khi đã triển khai, ứng dụng mua sắm đã hoạt động tại:
https://<your-domain>
Mẹo Khắc Phục Sự Cố
- HTTPS không hoạt động? Đảm bảo cert-manager đã được cài đặt trước khi áp dụng issuer của bạn
- Chạm đến giới hạn tỷ lệ của Let’s Encrypt? Sử dụng issuer staging trước
- Dịch vụ không được hiển thị? Kiểm tra lại các annotation ingress trong chart Helm của bạn
- Bạn mới bắt đầu với Kubernetes? Tôi khuyên bạn nên bắt đầu với một tệp triển khai đơn lẻ rồi sau đó biến nó thành các helm charts.
Bài Học Rút Ra
- Bắt đầu với các chart sớm, đừng đợi đến khi bạn có quá nhiều YAML.
- Helmfile là một cứu tinh, một lệnh để áp dụng/hủy mọi thứ.
- Các chart có thể di chuyển, tôi có thể giờ đây đưa Redis hoặc ingress vào bất kỳ cụm mới nào.
Kết Luận
Dự án này đã cho tôi thấy cách viết các Helm charts tái sử dụng khiến việc triển khai Kubernetes trở nên mở rộng, nhất quán, và sẵn sàng cho tương lai. Thay vì phải xử lý nhiều bản khai, tôi giờ đây có những khối xây dựng mô-đun mà tôi có thể áp dụng ở bất kỳ đâu.
Tôi dự định mở rộng các chart này để theo dõi (Prometheus + Grafana) để cấu hình có thể phát triển thành một stack sẵn sàng sản xuất hoàn chỉnh.
Tài Nguyên Tham Khảo
Câu Hỏi Thường Gặp
1. Helm là gì?
Helm là một công cụ quản lý gói cho Kubernetes, giúp bạn dễ dàng triển khai và quản lý các ứng dụng.
2. Tôi cần kiến thức gì trước khi sử dụng Helm?
Bạn cần có kiến thức cơ bản về Kubernetes và cách hoạt động của nó.
3. Helmfile là gì và tại sao tôi nên sử dụng nó?
Helmfile cho phép bạn quản lý nhiều chart Helm một cách dễ dàng thông qua một tệp cấu hình duy nhất.