KT-Connect ("KT" adalah singkatan dari "Kubernetes Toolkit") adalah alat utilitas yang membantu Anda bekerja lebih efisien dengan lingkungan pengembangan Kubernetes. Proxy KT-Connect memanfaatkan fitur manajemen lalu lintas di konsol Alibaba Cloud Service Mesh (ASM) untuk men-debug aplikasi lokal serta mempercepat pengembangan dan pengujian lokal. Topik ini menjelaskan cara mengimplementasikan pengembangan dan pengujian lokal menggunakan KT-Connect dan ASM.
Latar Belakang
KT-Connect adalah alat open source yang dirancang untuk menyederhanakan proses pengembangan di kluster Kubernetes. Alat ini memungkinkan Anda menerapkan pod proxy di kluster Kubernetes untuk mengarahkan ulang lalu lintas yang ditujukan ke layanan tertentu ke aplikasi lokal, sehingga memungkinkan akses timbal balik antara lingkungan lokal dan kluster Kubernetes. Fitur inti KT-Connect meliputi:
Mendukung akses ke kluster Kubernetes dari aplikasi lokal.
KT-Connect membuat semua sumber daya kluster dapat diakses dari aplikasi lokal tanpa modifikasi apa pun.
Mendukung resolusi nama domain internal untuk layanan Kubernetes secara lokal.
Langsung menyelesaikan nama layanan menjadi alamat IP kluster tempat layanan berada, memberikan pengalaman cloud-native sejati untuk pengembangan lokal.
Mendukung pengalihan lalu lintas yang ditentukan untuk layanan kluster ke layanan di lingkungan lokal.
Mengarahkan permintaan ke layanan tertentu dalam kluster ke aplikasi lokal, sehingga semua aplikasi lokal dapat langsung diakses dari layanan kluster.
Mendukung kolaborasi dalam lingkungan pengujian antara beberapa pengguna tanpa gangguan.
Anda dapat mengonfigurasi aturan routing untuk mengarahkan hanya permintaan tertentu ke aplikasi lokal tanpa memengaruhi ketersediaan lingkungan.
Mendukung lingkungan pengembangan Windows/MacOS/Linux.
Berbagai sistem operasi dengan metode penggunaan yang sama memungkinkan pengembang untuk mengakses layanan kluster Kubernetes.
Prasyarat
Sebuah gateway ingress telah diterapkan. Untuk informasi lebih lanjut, lihat Buat Gateway Ingress.
Sebuah aplikasi telah diterapkan di kluster yang ditambahkan ke instance ASM. Untuk informasi lebih lanjut, lihat Terapkan Aplikasi di Kluster ACK yang Ditambahkan ke Instance ASM.
Persiapan
Contoh ini mendemonstrasikan skenario berikut:
Terapkan aplikasi helloworld v1 di kluster dan konfigurasikan kebijakan lalu lintas untuk aplikasi tersebut.
Gunakan Docker untuk menerapkan aplikasi helloworld v2 di lingkungan lokal. Jalankan perintah ktctl untuk menerapkan pod proxy di kluster guna mengaktifkan koneksi ke kluster dari lingkungan lokal.
Perbarui kebijakan routing untuk mengarahkan lalu lintas ke aplikasi v1 di kluster dan aplikasi v2 di lingkungan lokal berdasarkan header permintaan.
Instal dan konfigurasikan ktctl.
Buat namespace di kluster.
kubectl create ns mesh-demoAktifkan injeksi sidecar otomatis untuk namespace tersebut.
kubectl label ns mesh-demo istio-injection=enabled
Prosedur
Langkah 1: Terapkan aplikasi dan konfigurasikan kebijakan routing
Terapkan aplikasi di namespace
mesh-demo.kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: helloworld labels: app: helloworld version: v1 stage: online spec: replicas: 1 selector: matchLabels: app: helloworld version: v1 stage: online template: metadata: labels: app: helloworld version: v1 stage: online spec: containers: - name: helloworld env: - name: PODIP valueFrom: fieldRef: fieldPath: status.podIP - name: STAGE valueFrom: fieldRef: fieldPath: metadata.labels['stage'] - name: VERSION valueFrom: fieldRef: fieldPath: metadata.labels['version'] command: ["/http-echo"] args: - "-text" - "Selamat datang di helloworld stage: $(STAGE), versi: $(VERSION), ip: $(PODIP)" image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/asm-http-echo:1.0 imagePullPolicy: IfNotPresent ports: - containerPort: 5678 --- apiVersion: v1 kind: Service metadata: name: helloworld labels: app: helloworld service: helloworld spec: ports: - port: 8000 name: http targetPort: 5678 selector: app: helloworld EOFTerapkan kebijakan routing.
kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: helloworld-gateway spec: selector: istio: ingressgateway servers: - hosts: - 'helloworld.mesh.com' port: name: http number: 80 protocol: HTTP --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: helloworld spec: host: helloworld subsets: - name: v1 labels: version: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: helloworld spec: gateways: - helloworld-gateway hosts: - helloworld.mesh.com http: - route: - destination: host: helloworld subset: v1 EOFVerifikasi apakah kebijakan tersebut berlaku.
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') curl ${INGRESS_HOST} -H 'host: helloworld.mesh.com'Output yang Diharapkan:
Selamat datang di helloworld stage: online, versi: v1, ip: 172.23.16.246Output menunjukkan bahwa
stageadalahonlinedanversiadalahv1, sesuai yang diharapkan.
Langkah 2: Terapkan lingkungan pengembangan lokal
Terapkan aplikasi helloworld v2 menggunakan Docker.
docker run -itd --rm \ --name local-container \ -p 5678:5678 \ registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/asm-http-echo:1.0 \ -text "Selamat datang di helloworld stage: local, versi: v2, ip: 127.0.0.1"Terapkan proxy KT-Connect di kluster. Dengan cara ini, pod proxy dengan label
version=hzallditerapkan di namespacemesh-demo.ktctl -n mesh-demo mesh helloworld --expose 5678 --mode manualOutput yang Diharapkan:
4:22PM INF Menggunakan konteks kluster cluster-4KvcBF (kubernetes) 4:22PM INF KtConnect 0.3.7 mulai pada 59150 (darwin amd64) 4:22PM INF Mengambil waktu kluster ... 4:22PM INF Menggunakan mode manual 4:22PM INF Berhasil membuat config map helloworld-kt-mesh-hzall 4:22PM INF Menerapkan pod shadow helloworld-kt-mesh-hzall di namespace mesh-demo 4:22PM INF Menunggu pod helloworld-kt-mesh-hzall ... 4:22PM INF Menunggu pod helloworld-kt-mesh-hzall ... 4:22PM INF Pod helloworld-kt-mesh-hzall siap 4:22PM INF Mengarahkan pod helloworld-kt-mesh-hzall ke lokal melalui port 5678 4:22PM INF Port forward lokal:17982 -> pod helloworld-kt-mesh-hzall:22 berhasil 4:22PM INF Terowongan balik 0.0.0.0:5678 -> 127.0.0.1:5678 berhasil 4:22PM INF --------------------------------------------------------- 4:22PM INF Sekarang Anda dapat memperbarui aturan Istio dengan label 'version=hzall' 4:22PM INF ---------------------------------------------------------Lihat pod proxy.
kubectl get pod -n mesh-demoOutput yang Diharapkan:
NAME READY STATUS RESTARTS AGE helloworld-5cbdxxxxx-xxxxx 2/2 Running 0 116m helloworld-kt-mesh-hzall 2/2 Running 0 106mDi mana,
helloworld-kt-mesh-hzalladalah pod proxy yang diterapkan.
Langkah 3: Perbarui kebijakan routing dan verifikasi koneksi
Perbarui kebijakan routing. Arahkan permintaan dengan header permintaan
x-env=localke aplikasi helloworld v2 di lingkungan lokal, dan arahkan semua permintaan lainnya ke aplikasi helloworld v1 di kluster.kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: helloworld spec: host: helloworld subsets: - name: v1 labels: version: v1 - name: local labels: version: hzall --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: helloworld spec: gateways: - helloworld-gateway hosts: - helloworld.mesh.com http: - match: - headers: x-env: exact: local route: - destination: host: helloworld subset: local - route: - destination: host: helloworld subset: v1 EOFAkses aplikasi lokal:
curl ${INGRESS_HOST} -H 'host: helloworld.mesh.com' -H 'x-env: local'Output yang Diharapkan:
Selamat datang di helloworld stage: local, versi: v2, ip: 127.0.0.1Output menunjukkan bahwa
stageadalahlocaldanversiadalahv2. Ini menunjukkan bahwa konektivitas dua arah antara layanan di lingkungan lokal dan kluster berhasil dikonfigurasi, dan layanan lokal dapat diakses dari kluster.Akses aplikasi di kluster.
curl ${INGRESS_HOST} -H 'host: helloworld.mesh.com'Output yang Diharapkan:
Selamat datang di helloworld stage: online, versi: v1, ip: 172.23.16.246
(Opsional) Langkah 4: Bersihkan lingkungan
Hapus sumber daya uji yang dibuat untuk kluster.
kubectl delete ns mesh-demoHentikan aplikasi lokal.
docker stop local-container