Cara Memproksi Layanan Eksternal di Apache APISIX Ingress Controller
Yeqi Peng
January 13, 2023
Dalam tutorial ini, kami akan memperkenalkan cara mengonfigurasi layanan eksternal dalam sumber daya ApisixUpstream.
Ini berguna ketika layanan Anda bergantung pada layanan pihak ketiga atau layanan dari kluster K8s lainnya. Ini juga memberikan cara untuk mengelola ApisixRoute Anda dengan layanan ExternalName yang dibagikan, tanpa perlu memodifikasi banyak ApisixRoute ketika nama layanan yang dirujuk diperbarui.
Prasyarat
- kluster Kubernetes yang tersedia
- instalasi APISIX dan APISIX Ingress Controller yang tersedia
Kami berasumsi bahwa APISIX Anda diinstal di namespace apisix.
Pengenalan
APISIX Ingress mendukung konfigurasi layanan eksternal sebagai backend, baik untuk layanan ExternalName K8s maupun domain langsung.
Dalam kasus ini, kami tidak mengonfigurasi bidang backends dalam sumber daya ApisixRoute. Sebagai gantinya, kami akan menggunakan bidang upstreams untuk merujuk ke sumber daya ApisixUpstream dengan bidang externalNodes yang dikonfigurasi.
Contohnya:
# httpbin-route.yaml apiVersion: apisix.apache.org/v2 kind: ApisixRoute metadata: name: httpbin-route spec: http: - name: rule1 match: hosts: - local.httpbin.org paths: - /* # backends: # Kami tidak akan menggunakan bidang `backends` # - serviceName: httpbin # servicePort: 80 upstreams: - name: httpbin-upstream
Konfigurasi ini memberi tahu pengontrol ingress untuk tidak menyelesaikan host upstream melalui layanan K8s, tetapi menggunakan konfigurasi yang didefinisikan dalam ApisixUpstream yang dirujuk.
ApisixUpstream yang dirujuk HARUS memiliki bidang externalNodes yang dikonfigurasi. Contohnya:
# httpbin-upstream.yaml apiVersion: apisix.apache.org/v2 kind: ApisixUpstream metadata: name: httpbin-upstream spec: externalNodes: - type: Domain name: httpbin.org
Dalam contoh yaml ini, kami mengonfigurasi httpbin.org sebagai backend. Tipe Domain menunjukkan bahwa ini adalah layanan pihak ketiga, dan nama domain apa pun didukung di sini.
Jika Anda ingin menggunakan layanan nama eksternal dalam kluster K8s, tipenya harus Service dan namanya harus nama layanan. Dengan mengonfigurasi ApisixUpstream dengan tipe Service, pengontrol ingress akan secara otomatis melacak konten layanan ExternalName dan perubahannya.
Upstream Domain Eksternal
apiVersion: apisix.apache.org/v2 kind: ApisixRoute metadata: name: httpbin-route spec: http: - name: rule1 match: hosts: - local.httpbin.org paths: - /* upstreams: - name: httpbin-upstream --- apiVersion: apisix.apache.org/v2 kind: ApisixUpstream metadata: name: httpbin-upstream spec: externalNodes: - type: Domain name: httpbin.org
Setelah menerapkan konfigurasi di atas, kita dapat mencoba mengakses httpbin.org langsung melalui APISIX.
kubectl exec -it -n apisix APISIX_POD_NAME -- curl -i -H "Host: local.httpbin.org" http://127.0.0.1:9080/get
Jika semuanya berfungsi, Anda akan melihat hasil seperti ini:
HTTP/1.1 200 OK Content-Type: application/json Content-Length: 321 Connection: keep-alive Date: Thu, 15 Dec 2022 10:47:30 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Server: APISIX/3.0.0 { "args": {}, "headers": { "Accept": "*/*", "Host": "local.httpbin.org", "User-Agent": "curl/7.29.0", "X-Amzn-Trace-Id": "Root=xxxxx", "X-Forwarded-Host": "local.httpbin.org" }, "origin": "127.0.0.1, xxxxxxxxx", "url": "http://local.httpbin.org/get" }
Header Server: APISIX/3.0.0 menunjukkan bahwa permintaan telah dikirim dari APISIX. Dan responsnya berisi X-Amzn-Trace-Id yang menunjukkan bahwa permintaan ditangani oleh layanan httpbin online.
Upstream Layanan Nama Eksternal
Mari kita deploy aplikasi httpbin sederhana di namespace test sebagai backend untuk layanan nama eksternal yang akan kita buat nanti.
kubectl create ns test kubectl -n test run httpbin --image-pull-policy IfNotPresent --image=kennethreitz/httpbin --port 80 kubectl -n test expose pod/httpbin --port 80
Kemudian gunakan konfigurasi berikut untuk membuat layanan ExternalName di namespace apisix.
apiVersion: v1 kind: Service metadata: name: ext-httpbin spec: type: ExternalName externalName: httpbin.test.svc
Sekarang kita dapat membuat ApisixRoute dan ApisixUpstream untuk layanan ExternalName.
apiVersion: apisix.apache.org/v2 kind: ApisixRoute metadata: name: ext-route spec: http: - name: rule1 match: hosts: - ext.httpbin.org paths: - /* upstreams: - name: ext-upstream --- apiVersion: apisix.apache.org/v2 kind: ApisixUpstream metadata: name: ext-upstream spec: externalNodes: - type: Service name: ext-httpbin
Setelah konfigurasi disinkronkan, coba akses dengan perintah berikut.
Satu-satunya argumen yang berubah adalah header yang kita lewati.
kubectl exec -it -n apisix APISIX_POD_NAME -- curl -i -H "Host: ext.httpbin.org" http://127.0.0.1:9080/get
Outputnya seharusnya seperti:
HTTP/1.1 200 OK Content-Type: application/json Content-Length: 234 Connection: keep-alive Date: Thu, 15 Dec 2022 10:54:21 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Server: APISIX/3.0.0 { "args": {}, "headers": { "Accept": "*/*", "Host": "ext.httpbin.org", "User-Agent": "curl/7.29.0", "X-Forwarded-Host": "ext.httpbin.org" }, "origin": "127.0.0.1", "url": "http://ext.httpbin.org/get" }
Kita dapat melihat responsnya mirip dengan yang sebelumnya, tetapi beberapa bidang tidak ada. Itu karena permintaan dikirim ke layanan httpbin lokal kita, bukan yang online.
Domain dalam Layanan Nama Eksternal
Layanan nama eksternal juga dapat menyimpan nama domain apa pun di luar kluster K8s.
Mari kita perbarui konfigurasi layanan eksternal yang kita terapkan di bagian sebelumnya.
apiVersion: v1 kind: Service metadata: name: ext-httpbin spec: type: ExternalName externalName: httpbin.org
Coba akses kembali, dan outputnya harus berisi beberapa origin dan header X-Amzn-Trace-Id, yang berarti kita mengakses layanan httpbin.org online.
Kesimpulan
Dalam tutorial ini, kami memperluas batas fungsional APISIX Ingress Controller dengan memproksi permintaan ke layanan eksternal. Ini memungkinkan pengguna untuk dengan mudah mengintegrasikan layanan pihak ketiga, seperti layanan autentikasi atau layanan lintas kluster.
Untuk informasi lebih lanjut tentang API gateway, silakan kunjungi blog kami atau hubungi kami.