Triển khai API Gateway lên Kubernetes với Kong API Gateway, Konga và PostgreSQL

1229
02-02-2023
Triển khai API Gateway lên Kubernetes với Kong API Gateway, Konga và PostgreSQL

API Gateway đóng vai trò là cổng vào của ứng dụng bằng cách tạo HTTP endpoint và nhận các requests từ phía người dùng. Trong bài viết hôm nay, Bizfly Cloud sẽ hướng dẫn bạn thực hành các bước để triển khai API Gateway lên môi trường Kubernetes bằng Kong, Konga và PostgreSQL.

Trước khi đọc bài bạn nên tìm hiểu kỹ hơn về API Gateway qua bài viết: API gateway là gì? Khi nào cần sử dụng API gateway?

Những khái niệm quan trọng khi triển khai API Gateway lên môi trường Kubernetes

Dưới đây là một số khái niệm cần thiết khi triển khai API Gateway lên môi trường Kubernetes:

StatefulSet

StatefulSet là một workload của K8s, được sử dụng để chạy ứng dụng Stateful (Ứng dụng hỗ trợ lưu trữ dữ liệu để không bị mất đi sau quá trình tạo lại).

StatefulSet được sử dụng để triển khai các ứng dụng này, giúp quản lý việc triển khai và mở rộng các pod nhằm đảm bảo thứ tự và tính duy nhất của pod.

Cách quản lý pod của Deployment và StatefulSet khá giống nhau. Tuy nhiên, khác với Deployment, StatefulSet sẽ duy trì tính duy nhất và cố định cho các pod của nó. Do đó, các pod này sẽ không hoán đổi được cho nhau.

Ingress

Ingress là một API trong Kubernetes, hỗ trợ quản lý truy cập từ bên ngoài vào các services trong Cluster thông qua http. Ingress tiếp nhận các request HTTP và HTTPS từ bên ngoài và điều hướng đến các services trong cluster. Router được điều khiển và điều hướng thông qua các rules được định nghĩa khi triển khai Ingress. Với Ingress, người dùng có thể thực hiện cân bằng tải, SSL termination và định danh các service bằng name-based.

Persistent Volume (PV)

Persistent Volume là không gian lưu trữ trong cluster cung cấp bởi Admin hoặc được cấp phát động. Đây là một dạng tài nguyên trong cluster tương tự như node. Trong khi PV đại diện cho tài nguyên lưu trữ, node sẽ là các tài nguyên RAM, CPU,…

Persistent Volume Claim (PVC)

Persistent Volume Claim là request từ phía người dùng để yêu cầu sử dụng không gian lưu trữ đối với một PV cụ thể. Claim có thể yêu cầu kích thước không gian lưu trữ hoặc yêu cầu về quyền truy cập không gian như ReadWriteOnce, ReadWriteMany, ReadOnlyMany,...

Container trong các pod cần không gian lưu trữ cho các dạng dữ liệu cố định, ví dụ như static files, files do người dùng tải lên, database,... được lưu trữ trong PV thông qua khai báo PVC.

Các bước triển khai API Gateway lên môi trường Kubernetes

Trước khi triển khai API Gateway lên môi trường Kubernetes, bạn sẽ cần chuẩn bị môi trường Kubernetes. Sau đó, bạn triển khai các thành phần cơ bản của một Microservices lên Kubernetes như dưới đây.

Khởi tạo PV và PVC

Có hai namespace chính cần lưu ý, đó là default namespace và kong namespace. Trong đó, kong là nơi triển khai và phân biệt kong với các tài nguyên khác.

  • Triển khai kong namespace bằng câu lệnh: kubectl apply -f kong_namespace.yaml
API Gateway đóng vai trò là cổng vào của ứng dụng bằng cách tạo HTTP endpoint và nhận các requests từ phía người dùng. Trong - Ảnh 1.

  • Triển khai PV và PVC: kubectl apply -f pg_pv_claim.yaml
API Gateway đóng vai trò là cổng vào của ứng dụng bằng cách tạo HTTP endpoint và nhận các requests từ phía người dùng. Trong - Ảnh 2.

Sau đó, bạn cần kiểm tra xem các tài nguyên này đã được khởi tạo hay chưa trước khi thực hiện các bước tiếp theo.

>> Có thể bạn quan tâm: Cách triển khai Nginx Ingress với Cert-Manager trên Bizfly Kubernetes Engine

Triển khai StatefulSets để chạy các database

Sau khi khởi tạo PV và PVC, bạn sẽ cần một instance để chạy database cho ứng dụng.

Tại file này, bạn cần lưu ý tới block volumes và khai báo volumes cho StatefulSet là pg-persistent-storage, sử dụng PVC pg-pv-claim. Sau đó thực hiện khai báo tại volumeMounts cho các containers.

Lúc này, dữ liệu trong container sẽ được mount vào PV và tồn tại ngay cả khi bạn tắt container và bật lại sau đó. Nếu các pod đang hoạt động cần lưu trữ các dữ liệu cố định khác, bạn có thể triển khai và sử dụng PVC riêng.

API Gateway đóng vai trò là cổng vào của ứng dụng bằng cách tạo HTTP endpoint và nhận các requests từ phía người dùng. Trong - Ảnh 3.

Tiếp theo, bạn sẽ thực hiện triển khai service, để các service khác cũng có thể gọi đến PostgreSQL, giống như Kong API Gateway.

API Gateway đóng vai trò là cổng vào của ứng dụng bằng cách tạo HTTP endpoint và nhận các requests từ phía người dùng. Trong - Ảnh 4.

Triển khai json-api-service và users-service microservices

Bạn có thể thực hiện triển khai 2 microservices bao gồm một file đặc tả deployment và một file cho services. Hiện tại, users-service sẽ không cần đến nodeport mà chỉ sử dụng service bình thường.

Dưới đây là mẫu cho json-api-service:

API Gateway đóng vai trò là cổng vào của ứng dụng bằng cách tạo HTTP endpoint và nhận các requests từ phía người dùng. Trong - Ảnh 5.

Triển khai Ingress cho các microservices nhằm định tuyến bên trong cụm

API Gateway đóng vai trò là cổng vào của ứng dụng bằng cách tạo HTTP endpoint và nhận các requests từ phía người dùng. Trong - Ảnh 6.

Với json-api-service, bạn cũng thực hiện triển khai tương tự như trên.

Triển khai Kong và Konga để quản lý API Gateway thông qua UI

Để triển khai Kong resources mà không sử dụng đến database, bạn có thể tham khảo file YAML tại đây.

Nếu sử dụng database, bạn cần chuẩn bị database và migration database để khởi tạo database trước khi chạy Kong và Konga.

apiVersion: apps/v1 kind: Deployment metadata: labels: app: kong-migration name: kong-migration namespace: kong spec: replicas: 1 selector: matchLabels: app: kong-migration template: metadata: annotations: kuma.io/gateway: enabled prometheus.io/port: "8100" prometheus.io/scrape: "true" traffic.sidecar.istio.io/includeInboundPorts: "" labels: app: kong-migration spec: containers: - env: - name: KONG_DATABASE value: "postgres" - name: KONG_PG_DATABASE value: "kong" - name: KONG_PG_HOST value: "postgres-db" - name: KONG_PG_USER value: "postgres" - name: KONG_PG_PASSWORD value: "kong" image: kong:2.5 command: ["/bin/sh", "-c", "kong migrations bootstrap && kong migrations up && kong migrations finish"] name: kong-migration

Để chạy Kong cùng database: kubectl apply -f kong/kong_all_in_one_custom.yaml

Sau khi database và Kong API đã lên, chúng ta thực hiện triển khai Konga:

kubectl apply -f konga/konga_deployment.yaml kubectl apply -f konga/konga_service.yaml

Proxy các port cho Konga và thực hiện services routing

Bạn cần kiểm tra các pod đang chạy ở all namespace để đảm bảo các pod đã tiến hành chạy, từ đó expose các port của Kong và Konga: kubectl get pods --all-namespace

  • Forward port cho Kong để truy cập API Gateway bằng port 8080

kubectl port-forward -n kong service/kong-proxy 8080:80

  • Forward port cho Konga để truy cập Konga UI bằng port 1337

kubectl port-forward -n kong service/konga-svc 1337:1337

Ở bước tạo services, khi sử dụng Ingress, các service được định danh DNS cơ bản. Nếu triển khai foo-service, DNS sẽ có dạng là foo-service.default.3000.svc. Các services có thể gọi qua nhau thông qua các DNS trên, với Kong API Gateway cũng tương tự như vậy.

Format của ingressed name base này sẽ có dạng như sau: .< namespace >.< port>.svc

Bạn có thể tham khảo source code cụ thể tại đây.

Thông qua bài viết trên, Bizfly Cloud hy vọng bạn đã nắm được các bước triển khai API Gateway lên môi trường Kubernetes bằng Kong API Gateway, Konga và PostgreSQL. Chúc bạn thành công!

>> Tìm hiểu thêm về dịch vụ API Gateway của Bizfly Cloud tại: https://bizflycloud.vn/api-gateway

Bizfly Cloud là nhà cung cấp dịch vụ điện toán đám mây với chi phí thấp, được vận hành bởi VCCorp.

Bizfly Cloud là một trong 4 doanh nghiệp nòng cốt trong "Chiến dịch thúc đẩy chuyển đổi số bằng công nghệ điện toán đám mây Việt Nam" của Bộ TT&TT; đáp ứng đầy đủ toàn bộ tiêu chí, chỉ tiêu kỹ thuật của nền tảng điện toán đám mây phục vụ Chính phủ điện tử/chính quyền điện tử.

Độc giả quan tâm đến các giải pháp của Bizfly Cloud có thể truy cập tại đây.

DÙNG THỬ MIỄN PHÍ và NHẬN ƯU ĐÃI 3 THÁNG tại: Manage.bizflycloud.vn

SHARE