Stateless Applications trong Kubernetes

Stateless Applications trong Kubernetes

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

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *