Cara Memproksi Layanan Eksternal di Apache APISIX Ingress Controller

Yeqi Peng

January 13, 2023

Products

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.

Tags: