APISIX Service Mesh dengan Istio dan Amesh

Navendu Pottekkat

Navendu Pottekkat

June 16, 2023

Technology

Apache APISIX terutama digunakan untuk menangani lalu lintas utara-selatan dan sering berada di batas antara aplikasi klien dan layanan backend.

Dengan APISIX Ingress Controller, APISIX juga dapat mengontrol lalu lintas masuk-keluar di kluster Kubernetes dengan konfigurasi native.

Namun, seiring dengan adopsi mikroservis oleh organisasi, muncul tantangan baru untuk menangani lalu lintas timur-barat antara mikroservis tersebut.

Service mesh seperti Istio menyelesaikan ini dengan menghapus tanggung jawab jaringan dari pengembang mikroservis dan menyediakan lapisan jaringan L4/L7 tambahan.

Dengan library baru Amesh dan Istio, Apache APISIX juga dapat digunakan sebagai service mesh, khususnya sebagai data plane untuk Istio, membawa semua kemampuan manajemen lalu lintasnya ke komunikasi antar-layanan.

Dalam artikel ini, kita akan membahas apa itu Amesh, bagaimana pengembangannya, dan bagaimana penggunaannya untuk membawa APISIX ke dalam service mesh.

Istio dan Protokol xDS

Istio adalah salah satu service mesh yang paling banyak digunakan.

Di balik layar, Istio menggunakan Envoy sebagai reverse proxy dalam sidecar container-nya.

Istio service mesh

Istio mengelola lalu lintas dengan mengonfigurasi sidecar secara dinamis menggunakan API xDS Envoy.

API xDS adalah cara untuk mengonfigurasi Envoy dengan perubahan inkremental alih-alih konfigurasi sederhana dengan file statis.

Meskipun API ini awalnya ditujukan untuk mengonfigurasi Envoy, API ini telah berkembang menjadi API data plane universal. Setiap proxy data plane dapat mengimplementasikan API ini, dan setiap control plane dapat menggunakan API ini untuk bekerja dengan proxy data plane tersebut.

Di Istio, ini berarti Anda dapat mengganti data plane Envoy default dengan data plane apa pun yang mengimplementasikan API xDS. Jadi, Anda dapat mengganti Envoy dengan APISIX untuk mendapatkan kemampuan manajemen lalu lintasnya dalam service mesh.

Namun, APISIX tidak mendukung API xDS secara langsung. Dan di sinilah Amesh hadir.

Amesh

Amesh adalah library yang menerjemahkan data dari control plane Istio ke konfigurasi APISIX.

APISIX service mesh

APISIX menggantikan Envoy sebagai data plane untuk Istio.

Istio berkomunikasi dengan data plane melalui API xDS. Amesh mendukung API ini dan kemudian mengonversinya ke konfigurasi APISIX.

Ini mirip dengan cara kerja APISIX dan APISIX Ingress controller. Ingress controller mengonversi konfigurasi yang didefinisikan menggunakan Ingress atau Gateway API ke format APISIX.

Karena API xDS didukung oleh lebih banyak service mesh seperti Linkerd dan Open Service Mesh, APISIX juga dapat bekerja dengan mereka menggunakan library Amesh. Amesh masih dalam tahap pengembangan awal dan saat ini bekerja dengan Istio v1.13.1.

Dengan Amesh + APISIX, Anda dapat menggunakan Istio seperti biasa. Setelah Anda mengonfigurasi aturan lalu lintas dengan virtual service Istio, APISIX dapat mengimplementasikan aturan tersebut.

Kemampuan ekstensi APISIX datang melalui 80+ plugin. Untuk menggunakan plugin APISIX dengan Istio, kami menerapkan komponen control plane Amesh yang disebut Amesh controller.

Amesh controller mengambil konfigurasi plugin yang didefinisikan dengan CRD AmeshPluginConfig dan mengonversinya ke konfigurasi plugin APISIX.

Semua ini akan memungkinkan kita untuk memanfaatkan kemampuan penuh APISIX dalam sidecar container.

APISIX + Istio Mesh

Mari kita terapkan semua yang telah kita pelajari.

Kita akan membangun image Amesh, mengonfigurasi Istio untuk menggunakan sidecar APISIX, menerapkan Istio, dan menguji semuanya dengan menjalankan aplikasi contoh.

Membangun Image

Kita akan membangun tiga image:

  • amesh-iptables: digunakan untuk membuat init container untuk mengatur beberapa aturan iptables. Aturan ini untuk mengarahkan semua lalu lintas melalui APISIX.
  • amesh-sidecar: digunakan untuk membuat sidecar container.
  • amesh-controller: digunakan untuk membuat komponen control plane Amesh controller. Controller ini digunakan untuk mengonfigurasi plugin APISIX.

Pertama, clone repo Amesh:

git clone https://github.com/api7/Amesh.git cd Amesh

Anda dapat membangun dan mendorong image ini ke registry Anda sendiri.

Tambahkan alamat registry Anda dalam variabel lingkungan sebelum menjalankan build, seperti yang ditunjukkan di bawah ini:

export REGISTRY="docker.io/navendu" make prepare-images

Jika Anda tidak ingin membangun image sendiri, Anda dapat menggunakan image berikut:

docker pull navendup/amesh-iptables:dev docker pull navendup/amesh-sidecar:dev docker pull navendup/amesh-controller:latest

Menerapkan Amesh Controller dan Menginstal CRD

Kita akan menggunakan Helm untuk menerapkan semuanya ke kluster Kubernetes. Saya menggunakan minikube dalam contoh ini.

Kita akan mulai dengan membuat namespace baru istio-system:

kubectl create namespace istio-system

Untuk menerapkan Amesh controller, jalankan:

helm install amesh-controller -n istio-system \ ./controller/charts/amesh-controller

Anda juga perlu menginstal CRD untuk bekerja dengan Amesh controller:

kubectl apply -k controller/config/crd/

Mengonfigurasi dan Menerapkan Istio + APISIX

Sebelum menerapkan service mesh, kita akan mengatur beberapa variabel lingkungan:

export ISTIO_RELEASE=1.13.1 export REGISTRY="docker.io/navendup"

Kemudian kita akan menggunakan Helm untuk menerapkan service mesh:

helm install amesh \ --namespace istio-system \ --set pilot.image=istio/pilot:"$ISTIO_RELEASE" \ --set global.proxy.privileged=true \ --set global.proxy_init.image="$REGISTRY"/amesh-iptables:dev \ --set global.proxy.image="$REGISTRY"/amesh-sidecar:dev \ --set global.imagePullPolicy=IfNotPresent \ --set global.hub="docker.io/istio" \ --set global.tag="$ISTIO_RELEASE" \ ./charts/amesh

Sekarang kita telah menerapkan service mesh dan Amesh controller. Selanjutnya, mari kita terapkan aplikasi contoh untuk menguji service mesh kita.

Menerapkan Bookinfo

Kita akan menggunakan aplikasi contoh Bookinfo dari Istio.

Pertama, kita akan menambahkan label ke namespace default untuk secara otomatis menyuntikkan sidecar ke pod apa pun di namespace tersebut:

kubectl label ns default istio-injection=enabled

Kemudian kita dapat menerapkan Bookinfo dengan menjalankan:

kubectl apply -f e2e/bookinfo/bookinfo.yaml

Ini akan memulai aplikasi Bookinfo, dan setiap pod akan memiliki sidecar APISIX:

$ kubectl get pods NAME READY STATUS RESTARTS AGE details-v1-79f774bdb9-cbn87 2/2 Running 0 55s productpage-v1-6b746f74dc-tntc8 2/2 Running 0 55s ratings-v1-b6994bb9-r5j45 2/2 Running 0 55s reviews-v1-545db77b95-n657s 2/2 Running 0 55s reviews-v2-7bf8c9648f-zn97s 2/2 Running 0 55s reviews-v3-84779c7bbc-wn8k2 2/2 Running 0 55s

Menguji Mesh

Untuk mengakses aplikasi Bookinfo, kita memerlukan ingress gateway.

Anda dapat menggunakan APISIX untuk ingress gateway ini, tetapi itu untuk waktu lain. Untuk saat ini, kita bisa menggunakan port-forward untuk mengakses layanan product-page:

kubectl port-forward productpage-v1-6b746f74dc-tntc8 9080:9080

Sekarang jika kita membuka localhost:9080, kita akan dapat melihat aplikasi contoh kita.

Bookinfo homepage

Setiap kali Anda me-refresh halaman, ulasan diambil dari versi layanan ulasan yang berbeda (kita telah menerapkan tiga versi).

Sekarang mari kita terapkan aturan menggunakan virtual service yang mengarahkan semua lalu lintas ke versi v1 dari layanan.

Aturan ini cukup jelas, dan akan terlihat seperti ini:

apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: productpage spec: hosts: - productpage http: - route: - destination: host: productpage subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - route: - destination: host: ratings subset: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: details spec: hosts: - details http: - route: - destination: host: details subset: v1 ---

Anda dapat menerapkannya ke kluster Anda dengan menjalankan:

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.18/samples/bookinfo/networking/virtual-service-all-v1.yaml

Sekarang jika kita kembali ke aplikasi kita dan me-refresh, itu akan berhenti beralih di antara beberapa versi layanan ulasan dan hanya akan mengarahkan ke versi v1.

Bookinfo v1 only

Perhatikan bagaimana tampilan bagian ulasan berubah di sini. Ini akan tetap sama bahkan jika Anda me-refresh halaman.

Untuk merangkum, kita mengonfigurasi aturan di Istio, dan Istio mengimplementasikannya menggunakan sidecar container dengan Apache APISIX. Keren!

Amesh Beyond

Amesh adalah proyek eksperimental, dan masih dalam tahap awal.

Versi masa depan proyek ini bertujuan untuk mendukung lebih banyak fitur melalui virtual service.

Anda dapat berkontribusi untuk meningkatkan proyek ini atau melacak versi baru di GitHub.

Tags: