Bagaimana APISIX Ingress Mendukung Plugin Kustom
API7.ai
October 11, 2022
Ingress & Ingress Controller
Ingress adalah salah satu objek API dari Kubernetes. Ini mengelola akses eksternal ke layanan dalam sebuah kluster, biasanya HTTP/HTTPS.
Klien dapat mengikuti aturan Ingress untuk mengarahkan permintaan klien ke layanan kluster Kubernetes atau Pod tertentu.

Berikut adalah contoh sumber daya Ingress:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: apisix-gateway spec: rules: - host: apisix.apache.org http: paths: - backend: service: name: apisix-gateway port: number: 80 path: / pathType: Exact
Contoh di atas mencakup konten berikut:
metadata.name: nama sumber daya Ingressspec.rules[].host: domain yang digunakan oleh akses eksternalspec.rules[].http.paths[].backend: menjelaskan informasi terkait layanan dalam klusterspec.rules[].http.paths[].path: menjelaskan jalur yang digunakan oleh akses eksternal ke layanan dalam klusterspec.rules[].http.paths[].pathType: menjelaskan jenis jalur untuk mengelola akses eksternal ke layanan dalam kluster
Berdasarkan contoh di atas, kita dapat melihat bahwa spesifikasi sumber daya Ingress relatif sederhana.
Ingress adalah definisi sumber daya di Kubernetes yang tidak dapat menangani lalu lintas apa pun secara mandiri. Jadi, jika kita ingin membuat sumber daya Ingress efektif, kita harus menggunakan controller untuk memproses sumber daya Ingress ini, yang dikenal sebagai Ingress controller.
Ingress controller akan terus memantau perubahan sumber daya apa pun dalam kluster Kubernetes dan mengubah aturan sumber daya Ingress menjadi aturan proxy lapisan data sehingga lapisan data dapat menangani lalu lintas.
Dalam lingkungan produksi yang sebenarnya, ada banyak jenis permintaan klien yang berbeda. Misalnya, sumber daya Ingress tidak dapat secara langsung menjelaskan beberapa fitur umum seperti autentikasi dan penulisan ulang URI. Jadi, bagaimana kita dapat memenuhi persyaratan ini?
Bagaimana Ingress-NGINX mendukung ekstensi?
Pertama, kita akan menggunakan contoh controller Ingress-NGINX dalam ekosistem Kubernetes untuk menunjukkan cara menggunakan ekstensi.
Kita dapat menggunakan Annotation untuk menjelaskan ekstensi yang diperlukan oleh sumber daya Ingress di Ingress-NGINX. Misalnya:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/cors-allow-origin: https://foo.com,https://bar.com nginx.ingress.kubernetes.io/cors-allow-headers: x-foo-1,x-foo-2 nginx.ingress.kubernetes.io/cors-allow-methods: GET,POST,PUT name: nginx-ingress spec: rules: - host: kubernetes.github.io http: paths: - path: /ingress pathType: Exact backend: service: name: nginx port: number: 80
Konfigurasi di atas mengaktifkan cors.
Menambahkan Annotations ke sumber daya Ingress relatif sederhana; namun, kita harus memperhatikan bahwa controller Ingress-NGINX perlu mendukung penuh Annotations ini; jika tidak, konfigurasi tidak akan berlaku. Jika kita perlu menggunakan beberapa fitur lain dari controller Ingress-NGINX yang belum dikembangkan, kita perlu melakukan beberapa pengembangan kustom.
Bagian berikut menjelaskan cara menggunakan controller Apache APISIX Ingress untuk memenuhi persyaratan ini.
Menggunakan plugin di APISIX Ingress
Apache APISIX Ingress menggunakan plugin untuk memenuhi berbagai kebutuhan pelanggan dalam menangani lalu lintas dan skenario tertentu. Saat ini, ada lebih dari 80 plugin yang siap digunakan, dan pengguna dapat mengembangkan plugin kustom untuk mendukung fitur baru.

Ada banyak cara berbeda untuk mengembangkan plugin kustom:
- Pengguna dapat menggunakan Lua untuk mengembangkan plugin, dan plugin ini dapat berjalan secara internal di APISIX
- Pengguna juga dapat menggunakan bahasa pemrograman lain untuk mengembangkan plugin; mekanisme ini disebut "plugin runner", dan plugin yang dikembangkan dengan mekanisme ini disebut "External Plugin"
Silakan merujuk ke dokumen resmi tentang pengembangan plugin:
- Pengembangan Plugin: https://apisix.apache.org/docs/apisix/plugin-develop/
- Pengembangan External Plugin: https://apisix.apache.org/docs/apisix/external-plugin/
Kami akan memperkenalkan tiga cara untuk mengembangkan plugin menggunakan Lua di APISIX Ingress.
Mode CRD Murni
Controller APISIX Ingress mendukung spesifikasi CRD yang dirancang sendiri, dan Anda dapat langsung mengaktifkan plugin dalam aturan routing (baik plugin internal maupun plugin kustom). Misalnya:
apiVersion: apisix.apache.org/v2beta3 kind: ApisixRoute metadata: name: httpbin-route spec: http: - name: rule1 match: hosts: - apisix.apache.org paths: - /apisix-ingress backends: - serviceName: apisix-gateway servicePort: 80 plugins: - name: cors enable: true config: allow_origins: http://foo.bar.org allow_methods: "GET,POST" max_age: 3600 expose_headers: x-foo,x-baz allow_headers: x-from-ingress allow_credential: true
Pengguna dapat menggunakan konfigurasi di atas untuk membuat aturan routing, dan plugin cors akan diaktifkan dalam rute ini.
Cara ini adalah dukungan paling asli di APISIX Ingress, dan cocok dengan APISIX. Selain itu, ketika pengguna menambahkan plugin kustom baru, APISIX Ingress tidak perlu dikembangkan ulang sehingga pengguna dapat langsung menggunakannya.
Mode CRD + Ingress Annotations
Kita juga dapat menggunakan CRD + Ingress Annotations untuk memperluas fitur di APISIX Ingress, misalnya:
apiVersion: apisix.apache.org/v2 kind: ApisixPluginConfig metadata: name: cors-plugin spec: plugins: - name: cors enable: true config: allow_origins: http://foo.bar.org allow_methods: "GET,POST" max_age: 3600 expose_headers: x-foo,x-baz allow_headers: x-from-ingress allow_credential: true --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: apisix k8s.apisix.apache.org/plugin-config-name: cors-plugin name: apisix-ingress spec: rules: - host: apisix.apache.org http: paths: - path: /apisix-ingress pathType: Exact backend: service: name: apisix-gateway port: number: 80
Dengan menggunakan konfigurasi di atas, kita dapat secara independen membuat konfigurasi plugin yang disebut cors-plugin dan menggunakan k8s.apisix.apache.org/plugin-config-name: cors-plugin dari sumber daya Ingress untuk merujuknya. Efek aktual hampir sama dengan konfigurasi pertama; keduanya akan mengaktifkan plugin cors untuk rute yang sesuai.
Dalam mode ini, konfigurasi plugin dapat dianggap sebagai sumber daya independen, dan beberapa sumber daya Ingress juga dapat membaginya. Demikian pula, tidak perlu melakukan pengembangan kustom apa pun.
Mode Ingress Annotations
Karena keterbatasan semantik sumber daya Ingress, kita biasanya akan menggunakan annotations untuk menambahkan beberapa informasi tambahan untuk objek sumber daya, yang juga merupakan cara paling umum untuk memperluas kemampuan Ingress. Misalnya:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: apisix k8s.apisix.apache.org/enable-cors: "true" k8s.apisix.apache.org/cors-allow-origin: https://foo.com,https://bar.com k8s.apisix.apache.org/cors-allow-headers: x-foo-1,x-foo-2 k8s.apisix.apache.org/cors-allow-methods: GET,POST,PUT name: apisix-ingress spec: rules: - host: apisix.apache.org http: paths: - path: /apisix-ingress pathType: Exact backend: service: name: apisix-gateway port: number: 80
Konfigurasi di atas akan menambahkan beberapa informasi tambahan terkait cors ke dalam sumber daya Ingress. Controller APISIX Ingress kemudian dapat mengidentifikasi informasi ini dan mengubahnya menjadi konfigurasi lapisan data untuk memperluas fitur sumber daya Ingress.
Namun, dalam mode ini, kita harus memastikan bahwa controller APISIX Ingress sudah dapat memproses Annotations ini. Jika tidak, kita perlu melakukan beberapa pengembangan kustom.
Jika Anda perlu melakukan pengembangan kustom, silakan merujuk ke dokumen berikut:
- Cara menggunakan controller APISIX Ingress untuk mengembangkan: https://apisix.apache.org/docs/ingress-controller/contribute/
Kesimpulan
Artikel ini terutama memperkenalkan spesifikasi terkait sumber daya Ingress dan cara memperluas fitur untuk sumber daya Ingress. Misalnya, di Ingress-NGINX, kita biasanya hanya dapat menggunakan Annotations untuk memperluas fitur. Namun, di Apache APISIX Ingress, kita memiliki tiga mode konfigurasi untuk memenuhi persyaratan lanjutan dan lebih banyak skenario. Selain itu, pengguna tidak perlu melakukan pengembangan kustom untuk plugin kustom dalam kebanyakan kasus.