API7 Cloud Terintegrasi dengan Kubernetes Service Discovery
Yong Qian
February 24, 2023
Penghematan biaya, adaptabilitas, skalabilitas, keandalan — ledakan teknologi cloud dan kontainerisasi telah membawa banyak keuntungan dibandingkan arsitektur monolitik tradisional. Keuntungan-keuntungan ini membuatnya disukai oleh banyak pengguna perusahaan.
Yang mengikuti adalah bahwa perubahan dalam arsitektur juga membawa tantangan baru. Misalnya, secara tradisional, daftar IP upstream untuk proxy balik seringkali tidak berubah dan dapat langsung ditulis dalam file konfigurasi statis. Di era cloud dan kontainerisasi, daftar IP dari setiap layanan upstream terus berubah. Pemeliharaan file konfigurasi menjadi mimpi buruk jika Anda terus menggunakan file konfigurasi statis. Karena ketepatan waktu pembaruan file konfigurasi akan langsung memengaruhi penerusan lalu lintas, pengguna harus memperkenalkan perangkat lunak tambahan untuk menangani pembaruan otomatis file konfigurasi, yang secara signifikan meningkatkan kompleksitas arsitektur.
Untuk menyederhanakan proses ini, API7 Cloud menghadirkan fungsi service discovery, yang langsung terhubung ke Kubernetes API Server untuk mendapatkan data Endpoints secara real-time, membantu pengguna memproksi aplikasi yang di-deploy di cluster Kubernetes dengan mudah.
Service Discovery di API7 Cloud

Persiapan
Pertama, kita perlu men-deploy instance APISIX melalui cloud-cli. Lihat dokumentasi API7 Cloud: Men-deploy instance gateway.
Dalam contoh ini, kita akan menggunakan panduan deployment Kubernetes yang disediakan dalam dokumen untuk membuat berbagai sumber daya di bawah namespace apisix, yang perlu kita buat terlebih dahulu:
kubectl create namespace apisix cloud-cli deploy kubernetes \ --name my-apisix \ --namespace apisix \ --apisix-image apache/apisix:2.15.0-centos
Membuat Service Account
Service Account adalah sumber daya inti untuk mengimplementasikan RBAC (Role-based access control) di Kubernetes. API7 Cloud perlu memiliki izin list dan watch dari sumber daya Endpoints untuk mendapatkan daftar instance dari Service upstream.
Konfigurasi yaml yang sesuai adalah sebagai berikut:
# rbac.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: apisix-k8s-sd-watcher rules: - apiGroups: [""] resources: ["endpoints"] verbs: ["list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: apisix-k8s-sd-watcher-binding subjects: - kind: ServiceAccount name: apisix-k8s-sd-sa namespace: apisix roleRef: kind: ClusterRole name: apisix-k8s-sd-watcher apiGroup: rbac.authorization.k8s.io --- apiVersion: v1 kind: ServiceAccount metadata: name: apisix-k8s-sd-sa namespace: apisix
Buat Service Account dan dapatkan Token:
kubectl apply -f rbac.yaml SECRET_NAME=`kubectl get sa -n apisix apisix-k8s-sd-sa -ojsonpath='{.secrets[0].name}'` kubectl get secrets $SECRET_NAME -n apisix -ojsonpath='{.data.token}' | base64 -d
Membuat Service Registry di API7 Cloud
Pergi ke Control Plane -> Settings -> Service Registry, gunakan Token yang diperoleh pada langkah sebelumnya untuk membuat service registry bertipe Kubernetes di API7 Cloud (perhatikan bahwa alamat API Server perlu diisi berdasarkan kasus penggunaan Anda). Dalam contoh ini, APISIX juga di-deploy di cluster Kubernetes target, sehingga alamat API server yang kita gunakan adalah kubernetes.default.svc.cluster.local:

Men-deploy Layanan di Kubernetes
Untuk memverifikasi efektivitas service discovery Kubernetes, kami men-deploy tiga replika layanan HTTPBin dan membuat Service yang sesuai.
kubectl create deployment httpbin --image=kennethreitz/httpbin:latest --replicas=3 -n apisix kubectl create service clusterip httpbin --tcp=80:80 -n apisix

Membuat Aplikasi dan API di API7 Cloud
Setelah men-deploy aplikasi uji, pergi ke halaman API Management -> Applications di API7 Cloud dan klik tombol Create Application untuk membuat Aplikasi baru. Konfigurasi dasarnya adalah sebagai berikut:
sd.httpbin.orgsebagaiHost/sebagaiPath prefix
Bagian kritisnya adalah mengonfigurasi upstream untuk menggunakan Kubernetes dan registry yang baru saja kita buat untuk service discovery, bukan daftar IP statis:

Selanjutnya, kami membuat API /anything di Aplikasi untuk menguji proxy:

Menguji Proxy
Pertama, petakan port HTTP data plane ke mesin lokal melalui port-forward:
kubectl port-forward -n apisix svc/apisix-gateway 9080:80
Gunakan curl untuk meminta layanan target:
curl http://127.0.0.1:9080/anything -H 'Host: sd.httpbin.org' -i HTTP/1.1 200 OK Content-Type: application/json Content-Length: 373 Connection: keep-alive Date: Mon, 09 Jan 2023 08:33:44 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Server: APISIX