1. Giới Thiệu
Trong thế giới phát triển ứng dụng hiện đại, việc triển khai các ứng dụng không trạng thái (stateless applications) trên nền tảng Kubernetes đã trở thành một thực tiễn phổ biến. Ứng dụng không trạng thái không lưu trữ dữ liệu bên trong container, giúp tăng khả năng mở rộng và dễ dàng quản lý. Bài viết này sẽ hướng dẫn bạn cách expose một External IP Address để truy cập ứng dụng trong cluster và cung cấp một ví dụ triển khai PHP Guestbook ứng dụng với Redis, minh họa cho ứng dụng không trạng thái.
2. Hiểu Về Ứng Dụng Không Trạng Thái (Stateless Applications)
2.1. Ứng Dụng Không Trạng Thái là gì?
Ứng dụng không trạng thái là những ứng dụng mà không lưu trữ bất kỳ thông tin trạng thái nào bên trong container. Tất cả dữ liệu cần thiết để ứng dụng hoạt động được lưu trữ bên ngoài container, như trong cơ sở dữ liệu, dịch vụ lưu trữ, hoặc thông qua các tài nguyên Kubernetes khác như ConfigMaps và Secrets.
2.2. Ưu Điểm của Ứng Dụng Không Trạng Thái
- Dễ Dàng Mở Rộng: Có thể dễ dàng tăng hoặc giảm số lượng Pods mà không cần lo lắng về việc đồng bộ trạng thái giữa các Pods.
- Độ Tin Cậy Cao: Nếu một Pod gặp sự cố, Kubernetes có thể tự động tạo lại Pod mới mà không ảnh hưởng đến dữ liệu hoặc trạng thái ứng dụng.
- Dễ Dàng Triển Khai và Cập Nhật: Việc triển khai và cập nhật ứng dụng không yêu cầu việc quản lý trạng thái phức tạp.
3. Exposing an External IP Address để Truy Cập Ứng Dụng trong Cluster
3.1. Hiểu Về Service và External IP
Service trong Kubernetes là một đối tượng trừu tượng hóa giúp định tuyến lưu lượng mạng đến các Pods. Để truy cập ứng dụng từ bên ngoài cluster, bạn cần cấu hình Service với loại LoadBalancer hoặc NodePort, hoặc sử dụng các giải pháp như Ingress.
External IP là địa chỉ IP bên ngoài cluster mà bạn có thể sử dụng để truy cập ứng dụng. Khi Service được cấu hình đúng cách, nó sẽ gán một External IP để kết nối từ bên ngoài vào ứng dụng trong cluster.
3.2. Triển Khai Service với External IP
Để expose ứng dụng ra ngoài, bạn có thể sử dụng loại Service là LoadBalancer. Trên các nhà cung cấp đám mây như AWS, GCP hoặc Azure, loại Service này sẽ tự động provision một load balancer bên ngoài với một External IP. Trên Minikube, bạn có thể sử dụng lệnh minikube service
để truy cập ứng dụng.
4. Ví Dụ: Triển Khai Ứng Dụng PHP Guestbook với Redis
Trong ví dụ này, chúng ta sẽ triển khai một ứng dụng PHP Guestbook sử dụng Redis làm backend lưu trữ dữ liệu. Ứng dụng này sẽ được triển khai dưới dạng các Pods không trạng thái và sẽ được expose ra ngoài cluster để người dùng có thể truy cập.
4.1. Tạo Namespace cho Ứng Dụng
Đầu tiên, tạo một namespace để quản lý các tài nguyên liên quan đến ứng dụng Guestbook.
kubectl create namespace guestbook
4.2. Triển Khai Redis
Redis sẽ hoạt động như một dịch vụ lưu trữ dữ liệu cho ứng dụng Guestbook.
Bước 1: Tạo Deployment cho Redis
Tạo file redis-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: guestbook
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:6.2
ports:
- containerPort: 6379
Bước 2: Triển Khai Deployment
kubectl apply -f redis-deployment.yaml
Bước 3: Tạo Service cho Redis
Tạo file redis-service.yaml
:
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: guestbook
spec:
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
Bước 4: Triển Khai Service
kubectl apply -f redis-service.yaml
4.3. Triển Khai PHP Guestbook
Bước 1: Tạo Deployment cho PHP Guestbook
Tạo file guestbook-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-guestbook
namespace: guestbook
spec:
replicas: 3
selector:
matchLabels:
app: php-guestbook
template:
metadata:
labels:
app: php-guestbook
spec:
containers:
- name: php-guestbook
image: gcr.io/google-samples/gb-frontend:v4
ports:
- containerPort: 80
env:
- name: GET_HOSTS_FROM
value: "dns"
Bước 2: Triển Khai Deployment
kubectl apply -f guestbook-deployment.yaml
4.4. Triển Khai Service để Expose PHP Guestbook
Để expose ứng dụng PHP Guestbook ra ngoài cluster, chúng ta sẽ sử dụng Service loại LoadBalancer.
Bước 1: Tạo Service cho PHP Guestbook
Tạo file guestbook-service.yaml
:
apiVersion: v1
kind: Service
metadata:
name: php-guestbook
namespace: guestbook
spec:
type: LoadBalancer
selector:
app: php-guestbook
ports:
- port: 80
targetPort: 80
Bước 2: Triển Khai Service
kubectl apply -f guestbook-service.yaml
4.5. Kiểm Tra và Truy Cập Ứng Dụng
Bước 1: Kiểm Tra Pods và Services
kubectl get pods -n guestbook
kubectl get services -n guestbook
Kết Quả Ví Dụ:
NAME READY STATUS RESTARTS AGE
php-guestbook-5f76cf6ccf-br9b5 1/1 Running 0 10m
php-guestbook-5f76cf6ccf-xyz12 1/1 Running 0 10m
php-guestbook-5f76cf6ccf-abc34 1/1 Running 0 10m
redis-6c5b7b4c8b-5d7ql 1/1 Running 0 10m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
php-guestbook LoadBalancer 10.96.144.78 <pending> 80:30369/TCP 10m
redis ClusterIP 10.96.0.10 <none> 6379/TCP 10m
Bước 2: Truy Cập Ứng Dụng
Trên các nhà cung cấp đám mây hỗ trợ LoadBalancer, External IP sẽ được gán tự động. Trên Minikube, sử dụng lệnh sau để truy cập ứng dụng:
minikube service php-guestbook -n guestbook
Lệnh này sẽ mở trình duyệt với địa chỉ IP của ứng dụng PHP Guestbook đang chạy.
5. Best Practices Cho Ứng Dụng Không Trạng Thái
5.1. Tách Biệt Dữ Liệu và Ứng Dụng
- Dữ Liệu Ngoài Container: Lưu trữ dữ liệu bên ngoài container, như trong các dịch vụ cơ sở dữ liệu hoặc lưu trữ đối tượng.
- Sử Dụng Persistent Volumes: Nếu cần thiết, sử dụng Persistent Volumes để lưu trữ dữ liệu lâu dài mà không bị mất khi Pods được xóa hoặc tái tạo.
5.2. Sử Dụng ConfigMaps và Secrets
- ConfigMaps: Quản lý cấu hình không nhạy cảm của ứng dụng.
- Secrets: Quản lý thông tin nhạy cảm như mật khẩu, khóa API một cách bảo mật.
5.3. Giám Sát và Logging
- Theo Dõi Hiệu Suất: Sử dụng các công cụ như Prometheus và Grafana để theo dõi hiệu suất ứng dụng và cluster.
- Quản Lý Logs: Sử dụng ELK Stack (Elasticsearch, Logstash, Kibana) hoặc các giải pháp logging khác để quản lý và phân tích logs.
6. Giám Sát và Quản Lý Ứng Dụng
6.1. Sử Dụng Prometheus và Grafana
- Prometheus: Thu thập và lưu trữ các metrics về hiệu suất và trạng thái của ứng dụng và cluster.
- Grafana: Trực quan hóa dữ liệu từ Prometheus thông qua các dashboard tùy chỉnh, giúp bạn dễ dàng theo dõi và phân tích các chỉ số tài nguyên.
Ví Dụ: Cài Đặt Prometheus và Grafana với Helm
helm install prometheus prometheus-community/prometheus -n monitoring --create-namespace
helm install grafana grafana/grafana -n monitoring
6.2. Sử Dụng ELK Stack
- Elasticsearch: Lưu trữ và tìm kiếm logs.
- Logstash: Thu thập và xử lý logs từ các nguồn khác nhau.
- Kibana: Trực quan hóa logs thông qua giao diện web.
Ví Dụ: Triển Khai ELK Stack với Helm
helm install elasticsearch elastic/elasticsearch -n logging --create-namespace
helm install kibana elastic/kibana -n logging
helm install logstash elastic/logstash -n logging
7. Kết Luận
Việc triển khai các ứng dụng không trạng thái trên Kubernetes giúp tăng khả năng mở rộng, độ tin cậy và dễ dàng quản lý. Bằng cách sử dụng Service để expose ứng dụng ra ngoài cluster và triển khai các thành phần phụ trợ như Redis, bạn có thể xây dựng các ứng dụng mạnh mẽ và linh hoạt. Áp dụng các best practices như tách biệt dữ liệu, sử dụng ConfigMaps và Secrets, cùng với việc giám sát liên tục sẽ giúp bạn duy trì và vận hành ứng dụng một cách hiệu quả.
Những Điểm Chính:
- Ứng Dụng Không Trạng Thái: Giúp tăng khả năng mở rộng và độ tin cậy.
- Service với External IP: Cho phép truy cập ứng dụng từ bên ngoài cluster.
- Triển Khai PHP Guestbook với Redis: Ví dụ minh họa cho ứng dụng không trạng thái.
- Best Practices: Tách biệt dữ liệu, sử dụng ConfigMaps và Secrets, giám sát và logging hiệu quả.
8. Tiếp Theo
- Update Your App trên Kubernetes: Hướng dẫn cách thực hiện Rolling Update cho ứng dụng sử dụng kubectl.
- Scale Your App trên Kubernetes: Hướng dẫn chi tiết cách scale ứng dụng sử dụng kubectl và Horizontal Pod Autoscaler.
- Security trên Kubernetes: Hướng dẫn cách áp dụng các tiêu chuẩn bảo mật và giới hạn quyền truy cập trong cluster.
- Sử Dụng Helm để Quản Lý Các Ứng Dụng Kubernetes: Tìm hiểu cách sử dụng Helm charts để dễ dàng triển khai và quản lý các ứng dụng phức tạp.
9. Tài Nguyên Tham Khảo
- Kubernetes Documentation – Services
- Kubernetes Documentation – Deployments
- Kubernetes Documentation – ConfigMaps
- Kubernetes Documentation – Secrets
- Minikube Documentation
- Prometheus Documentation
- Grafana Documentation
- Helm Documentation
- ELK Stack Documentation
- The Kubernetes Book
- Kubernetes Up & Running
- Horizontal Pod Autoscaler Documentation
- AppArmor Documentation
- seccomp Documentation