Gunakan APISIX, Prometheus, dan KEDA untuk Menyesuaikan Skala Aplikasi Secara Elastis di Kubernetes

Jintao Zhang

Jintao Zhang

February 17, 2023

Technology

Pendahuluan

Jumlah lalu lintas yang masuk ke suatu aplikasi bervariasi dari waktu ke waktu. Misalnya, aplikasi belanja online jauh lebih sibuk selama musim liburan dibandingkan hari-hari biasa. Kemampuan untuk menyesuaikan kapasitas aplikasi berdasarkan lalu lintas akan memberikan pengalaman dan layanan pengguna yang jauh lebih baik.

Apache APISIX adalah API gateway cloud-native berkinerja tinggi yang dapat menyediakan metrik bermakna untuk menentukan apakah aplikasi perlu diskalakan. Ini adalah middleware yang memproses semua lalu lintas yang dikirim ke aplikasi upstream dan karenanya dapat mengumpulkan data lalu lintas selama proses tersebut.

Untuk melakukan penskalaan elastis, KEDA akan digunakan sebagai kontroler, dan Prometheus akan digunakan untuk mengambil metrik yang disediakan oleh APISIX.

menggunakan KEDA untuk autoscaling

Cara Menggunakan Prometheus Scaler di KEDA

KEDA adalah autoscaler berbasis event di Kubernetes, yang dapat mengonfigurasi berbagai scaler. Dalam artikel ini, Prometheus scaler akan digunakan untuk mendapatkan metrik yang diekspos oleh APISIX.

Menerapkan KEDA

Penerapan KEDA relatif sederhana, cukup tambahkan repo Helm yang sesuai dan instal.

(MoeLove) ➜ helm repo add kedacore https://kedacore.github.io/charts "kedacore" telah ditambahkan ke repositori Anda (MoeLove) ➜ helm repo update kedacore Tunggu sebentar sambil kami mengambil yang terbaru dari repositori chart Anda... ...Berhasil mendapatkan pembaruan dari repositori chart "kedacore" Pembaruan Selesai. ⎈Selamat Helm!⎈ (MoeLove) ➜ helm install keda kedacore/keda --namespace keda --create-namespace NAME: keda LAST DEPLOYED: Kamis 19 Jan 00:01:00 2023 NAMESPACE: keda STATUS: deployed REVISION: 1 TEST SUITE: None

Setelah instalasi, Pod memiliki status Running, menandakan bahwa itu telah diinstal.

(MoeLove) ➜ kubectl -n keda get pods NAME READY STATUS RESTARTS AGE keda-operator-metrics-apiserver-6d4db7dcff-ck9qg 1/1 Running 0 36s keda-operator-5dd4748dcd-k8jjz 1/1 Running 0 36s

Menerapkan Prometheus

Di sini kami menggunakan Prometheus Operator untuk menerapkan Prometheus. Prometheus Operator dapat membantu kami dengan cepat menerapkan instance Prometheus di Kubernetes dan menambahkan aturan pemantauan melalui konfigurasi deklaratif.

Selesaikan instalasi Prometheus Operator melalui langkah-langkah berikut.

(MoeLove) ➜ https://github.com/prometheus-operator/prometheus-operator/releases/download/v0.62.0/bundle.yaml (MoeLove) ➜ kubectl apply --server-side -f bundle.yaml customresourcedefinition.apiextensions.k8s.io/alertmanagerconfigs.monitoring.coreos.com serverside-applied customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com serverside-applied customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com serverside-applied customresourcedefinition.apiextensions.k8s.io/probes.monitoring.coreos.com serverside-applied customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com serverside-applied customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com serverside-applied customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com serverside-applied customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com serverside-applied clusterrolebinding.rbac.authorization.k8s.io/prometheus-operator serverside-applied clusterrole.rbac.authorization.k8s.io/prometheus-operator serverside-applied deployment.apps/prometheus-operator serverside-applied serviceaccount/prometheus-operator serverside-applied service/prometheus-operator serverside-applied

Kemudian gunakan yang berikut sebagai konfigurasi untuk Prometheus dan terapkan ke cluster Kubernetes.

--- apiVersion: v1 kind: ServiceAccount metadata: name: prometheus --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus rules: - apiGroups: [""] resources: - nodes - nodes/metrics - services - endpoints - pods verbs: ["get", "list", "watch"] - apiGroups: [""] resources: - configmaps verbs: ["get"] - apiGroups: - networking.k8s.io resources: - ingresses verbs: ["get", "list", "watch"] - nonResourceURLs: ["/metrics"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: prometheus roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus subjects: - kind: ServiceAccount name: prometheus namespace: default --- apiVersion: monitoring.coreos.com/v1 kind: Prometheus metadata: name: prometheus spec: serviceAccountName: prometheus serviceMonitorSelector: matchLabels: app: apisix serviceMonitorNamespaceSelector: matchLabels: team: apisix resources: requests: memory: 400Mi enableAdminAPI: false --- apiVersion: v1 kind: Service metadata: name: prometheus spec: type: LoadBalancer ports: - name: web port: 9090 protocol: TCP targetPort: web selector: prometheus: prometheus

Setelah diterapkan ke cluster Kubernetes, Anda dapat melihat bahwa instance Prometheus dibuat di bawah namespace default. Karena kami mengonfigurasi Prometheus dengan TYPE LoadBalancer, pengguna dapat langsung mengakses Prometheus melalui IP publik dari LoadBalancer.

(MoeLove) ➜ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 96m prometheus-operator ClusterIP None <none> 8080/TCP 92m prometheus-operated ClusterIP None <none> 9090/TCP 41m prometheus LoadBalancer 10.43.125.194 216.6.66.66 9090:30099/TCP 41m

Cara Menerapkan API Gateway dan Mengaktifkan Pemantauan

Selanjutnya, terapkan APISIX Ingress controller dan gunakan Prometheus untuk pengumpulan metrik.

Metodenya serupa untuk pengguna yang hanya menggunakan APISIX alih-alih APISIX Ingress Controller. Kami tidak akan menjelaskannya secara terpisah di sini.

Di sini, Helm digunakan untuk penerapan, dan APISIX Ingress controller serta APISIX dapat secara bersamaan diterapkan ke cluster.

(MoeLove) ➜ helm repo add apisix https://charts.apiseven.com "apisix" sudah ada dengan konfigurasi yang sama, melewati (MoeLove) ➜ helm repo update apisix Tunggu sebentar sambil kami mengambil yang terbaru dari repositori chart Anda... ...Berhasil mendapatkan pembaruan dari repositori chart "apisix" Pembaruan Selesai. ⎈Selamat Helm!⎈ (MoeLove) ➜ helm upgrade --install apisix apisix/apisix --create-namespace --namespace apisix --set gateway.type=LoadBalancer --set ingress-controller.enabled=true --set ingress-controller.config.apisix.serviceNamespace=apisix Release "apisix" telah ditingkatkan. Selamat Helm! NAME: apisix LAST DEPLOYED: Kamis 19 Jan 02:11:23 2023 NAMESPACE: apisix STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: 1. Dapatkan URL aplikasi dengan menjalankan perintah ini: CATATAN: Mungkin perlu beberapa menit untuk IP LoadBalancer tersedia. Anda dapat melihat statusnya dengan menjalankan 'kubectl get --namespace apisix svc -w apisix-gateway' export SERVICE_IP=$(kubectl get svc --namespace apisix apisix-gateway --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}") echo http://$SERVICE_IP:80

Selanjutnya, aktifkan plugin Prometheus dari APISIX. Silakan merujuk ke dua dokumen berikut untuk metode konfigurasi spesifik dan parameter terkait.

Setelah diaktifkan, Prometheus dapat menangkap metrik yang diekspos oleh APISIX dengan membuat sumber daya ServiceMonitor.

apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: example-app labels: app: apisix spec: selector: matchLabels: app: apisix endpoints: - port: web

Verifikasi Kemampuan Penskalaan Elastis Aplikasi

Pertama, buat aplikasi.

(MoeLove) ➜ kubectl create deploy httpbin --image=kennethreitz/httpbin --port=80 deployment.apps/httpbin created (MoeLove) ➜ kubectl expose deploy httpbin --port 80

Buat aturan routing berikut dan terapkan ke cluster Kubernetes untuk memproksi permintaan melalui APISIX.

apiVersion: apisix.apache.org/v2 kind: ApisixRoute metadata: name: httpserver-route spec: http: - name: rule1 match: hosts: - local.httpbin.org paths: - /* backends: - serviceName: httpbin servicePort: 80

Selanjutnya, buat ScaledObject KEDA dan konfigurasikan pengaturan terkait Prometheus.

apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: prometheus-scaledobject namespace: default spec: scaleTargetRef: name: httpbin triggers: - type: prometheus metadata: serverAddress: http://prometheus.default.svc:9090 metricName: apisix_http_status threshold: '10' query: sum(rate(apisix_http_status{route="httpserver-route"}[1m]))

Konfigurasi di atas berarti bahwa sum(rate(apisix_http_status{route="httpserver-route"}[1m])) digunakan sebagai ekspresi kueri, dan jika hasilnya dapat mencapai 10, ekspansi akan dimulai. (Konfigurasi di sini hanya untuk tujuan demonstrasi, silakan modifikasi sesuai dengan situasi Anda sendiri). Kemudian, kami membuat permintaan terus-menerus ke layanan httpbin melalui curl.

Kemudian, jika kami memeriksa pod aplikasi, Anda dapat melihat bahwa itu telah diskalakan otomatis menjadi dua oleh KEDA.

(MoeLove) ➜ kubectl get pods NAME READY STATUS RESTARTS AGE httpbin-d46d778d7-chtdw 1/1 Running 0 12m httpbin-d46d778d7-xanbj 1/1 Running 0 10s

Ketika aplikasi menganggur setelah beberapa waktu, kami akan menemukan bahwa jumlah pod telah menyusut secara otomatis kembali ke satu instance.

(MoeLove) ➜ kubectl get pods NAME READY STATUS RESTARTS AGE httpbin-d46d778d7-chtdw 1/1 Running 0 32m

Ringkasan

KEDA menggunakan Prometheus sebagai scaler untuk mengumpulkan metrik yang diekspos oleh APISIX. Karena semua lalu lintas melewati APISIX terlebih dahulu, mendapatkan statistik di sisi APISIX akan jauh lebih sederhana dan lebih nyaman.

Ketika volume permintaan bisnis meningkat, aplikasi akan secara otomatis diperluas, dan ketika volume permintaan bisnis turun, aplikasi akan secara otomatis menyusut.

Metode ini dapat meringankan operasi ekspansi/pengurangan manual di banyak lingkungan produksi untuk memastikan pengalaman pengguna terbaik.

Tags: