Service Mesh (ASM) memungkinkan Anda melakukan migrasi kluster dari Istio open source. Panduan ini menjelaskan cara melakukan migrasi canary in-place dari instalasi Istio open source yang sudah ada ke lapisan kontrol ASM terkelola.
Proses migrasi
Proses migrasi dari Istio ke ASM terdiri atas empat fase.
Selama fase Migrating, perilaku injeksi mengikuti aturan yang telah Anda konfigurasikan untuk Istio, dan Sidecar Istio diinjeksikan secara default. Di namespace yang memiliki injeksi sidecar aktif, Anda dapat memodifikasi label Pod workload untuk menginjeksikan proxy mesh ASM.
Prasyarat
-
Kluster K8s yang ingin Anda migrasikan harus memenuhi persyaratan berikut:
-
Versi kluster harus 1.21 atau lebih baru. Jika kluster Alibaba Cloud Container Service for Kubernetes (ACK) Anda menggunakan versi sebelumnya, lihat Upgrade manual kluster ACK.
-
Versi Istio open source yang diinstal di kluster harus 1.10 atau lebih baru.
-
-
Buat instans ASM baru, versi 1.24 atau lebih baru, untuk migrasi ini. Untuk informasi selengkapnya, lihat Buat instans ASM.
Prosedur
Langkah 1: Tambahkan kluster ke ASM
Tambahkan kluster K8s Anda ke instans ASM. Anda dapat menambahkan kluster Alibaba Cloud Container Service for Kubernetes (ACK) atau kluster self-built yang telah terdaftar di ACK. Untuk petunjuknya, lihat Tambahkan kluster ke instans ASM. Selama proses tersebut, pilih opsi Ignore istio-system namespace check. Jika kluster yang akan dimigrasikan belum terdaftar di ACK, gunakan fitur kluster terdaftar dari ACK One untuk mendaftarkannya terlebih dahulu.
Setelah kluster ditambahkan ke instans ASM, resource ASMMigrateFromIstio akan dibuat secara otomatis. Resource ini mengontrol seluruh proses migrasi. Jalankan perintah berikut untuk melihat isinya:
kubectl --kubeconfig=${ASM_KUBECONFIG} get asmmigratefromistio
Output yang diharapkan:
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMMigrateFromIstio
metadata:
name: default
spec:
desiredState: Init
retryCounter: 0
advancedOptions:
stopIstioSystemInjectionDisabling: false
status:
message: ""
retryCounter: 0
state: Init
Tabel berikut menjelaskan field kunci dalam resource ini.
|
Parameter |
Tipe |
Deskripsi |
Nilai |
|
spec.desiredState |
string |
Status target migrasi. Ubah field ini untuk memasuki fase migrasi tertentu. Penting
Nilainya hanya dapat diubah dalam urutan berikut: Init -> SetupIstioForMigrate -> Migrating -> Finished. |
|
|
spec.retryCounter |
int32 |
Saat Anda mengubah status, lapisan kontrol ASM menjalankan pemeriksaan untuk memastikan kriteria status baru terpenuhi. Pemeriksaan ini dipicu secara otomatis ketika Anda memodifikasi |
0 hingga 2147483647 |
|
spec.advancedOptions |
object |
Opsi lanjutan. |
|
|
spec.advancedOptions.disableIstioSystemLabelReconciliation |
bool |
Menentukan apakah lapisan kontrol ASM dicegah untuk merekonsiliasi label pada namespace |
|
|
status.retryCounter |
int32 |
Menunjukkan apakah |
Hanya baca |
|
status.state |
string |
Status saat ini dari migrasi. Setelah transisi status, jika operasi berhasil, nilai ini sesuai dengan nilai |
Hanya baca |
|
status.message |
string |
Jika transisi status gagal, field ini memberikan alasannya. Jika field ini tidak kosong, selesaikan masalah berdasarkan pesan tersebut, lalu ubah |
Hanya baca |
Ubah status ASMMigrateFromIstio
Untuk melanjutkan ke fase migrasi berikutnya, Anda harus mengubah status resource ASMMigrateFromIstio secara manual. Misalnya, untuk berpindah dari fase Init ke fase berikutnya, ubah status menjadi SetupIstioForMigrate.
Perintah berikut menunjukkan cara mengubah status untuk setiap fase.
-
SetupIstioForMigratekubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"SetupIstioForMigrate"}}' -
Migratingkubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"Migrating"}}' -
Finishedkubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"Finished"}}'
Ambil contoh status SetupIstioForMigrate. Jalankan perintah berikut untuk memverifikasi bahwa status telah berhasil diubah:
kubectl get asmmigratefromistio default -o yaml
Output yang diharapkan:
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMMigrateFromIstio
metadata:
name: default
spec:
desiredState: SetupIstioForMigrate
retryCounter: 0
status:
message: ""
retryCounter: 0
state: SetupIstioForMigrate
Perubahan status berhasil jika nilai status.state adalah SetupIstioForMigrate.
Jika field status.state tidak diperbarui seperti yang diharapkan, periksa field status.message untuk detail error. Setelah Anda menyelesaikan masalah tersebut, tambahkan nilai spec.retryCounter sebesar 1 untuk mencoba ulang operasi.
Konfigurasi untuk kluster gerbang timur-barat
Secara default, ASM menonaktifkan injeksi sidecar otomatis di namespace istio-system. Namun, jika kluster Anda menggunakan gerbang timur-barat Istio, Pod gerbang tersebut memerlukan MutatingWebhook untuk mengganti image-nya. Proses ini mensyaratkan agar injeksi sidecar tidak secara eksplisit dinonaktifkan untuk namespace tersebut. Oleh karena itu, jika Anda menggunakan gerbang timur-barat Istio, jalankan perintah berikut untuk mencegah lapisan kontrol ASM menonaktifkan injeksi di namespace istio-system.
kubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"advancedOptions":{"disableIstioSystemLabelReconciliation": true}}}'
Kemudian, hapus secara manual label yang telah diterapkan ASM ke namespace istio-system:
-
Edit konfigurasi namespace
istio-system.kubectl --kubeconfig=${ACK_KUBECONFIG_PATH} edit ns istio-system -
Hapus secara manual label
istio-injection: disable, lalu simpan perubahan dan keluar.
Langkah 2: Siapkan Istio untuk migrasi
-
Ubah status ke SetupIstioForMigrate.
PentingPerintah ini mengonfigurasi ulang Istiod untuk migrasi dan memicu restart bergulir.
-
Pada fase ini, ASM menambahkan konfigurasi berikut ke lapisan kontrol Istio. Hal ini memungkinkan Sidecar Istio dan proxy mesh ASM untuk menjalin komunikasi mTLS selama migrasi.
defaultConfig: proxyMetadata: PROXY_CONFIG_XDS_AGENT:"true"Anda harus me-restart secara manual semua workload yang memiliki Sidecar Istio terinjeksi agar konfigurasi ini diterapkan. Jalankan perintah berikut untuk memverifikasi bahwa konfigurasi telah diterapkan pada Pod tertentu:
kubectl get pod ${POD_NAME} -o yaml|grep PROXY_CONFIG_XDS_AGENTJika perintah menghasilkan output yang tidak kosong, workload telah dikonfigurasi dengan benar. Setelah semua workload dengan Sidecar Istio terinjeksi dikonfigurasi dengan benar, Anda dapat melanjutkan ke status
Migrating.
Langkah 3: Mulai migrasi
Pada fase ini, Anda beralih ke status Migrating. Anda kemudian dapat secara bertahap mengganti Sidecar Istio dengan proxy mesh ASM di seluruh workload Anda.
-
Ubah status ke Migrating. Setelah status berhasil diubah, pertama-tama terapkan semua resource API Istio Anda ke instans ASM. Kemudian, ikuti langkah-langkah di bawah ini untuk memigrasikan Sidecar Istio, gerbang masuk, gerbang keluar, dan gerbang timur-barat ke padanan ASM-nya.
-
(Opsional) Deploy gerbang cross-cluster ASM.
Di ASM, workload dengan proxy mesh terinjeksi secara otomatis menggunakan gerbang cross-cluster ASM untuk komunikasi antar-kluster, yang merupakan padanan dari gerbang timur-barat Istio. Jika Anda menggunakan gerbang timur-barat dalam pengaturan Istio Anda, Anda harus mendeploy gerbang cross-cluster ASM sebelum menginjeksikan proxy mesh ASM ke workload mana pun. Hal ini memastikan komunikasi antar-kluster tidak terganggu.
Di Konsol ASM, konfigurasikan nama jaringan untuk kluster agar sesuai dengan topologi jaringan Istio Anda saat ini. Untuk kluster yang telah memiliki gerbang timur-barat Istio terdeploy, aktifkan gerbang cross-cluster. Untuk informasi selengkapnya, lihat Konfigurasi pengaturan jaringan untuk kluster dan aktifkan proxy mesh cross-cluster.
Setelah gerbang cross-cluster diaktifkan, Service
LoadBalancerakan dibuat secara otomatis, yang mengenakan biaya untuk instans CLB yang mendasarinya. Klik OK untuk mengonfirmasi konfigurasi.CatatanKonfigurasi jaringan di ASM harus identik dengan konfigurasi di Istio. Misalnya, jika kluster A berada di
network-1dan kluster B berada dinetwork-2dalam pengaturan Istio Anda, Anda harus menggunakan nama jaringan yang sama di ASM. -
Migrasikan Sidecar Istio ke proxy mesh ASM.
$ kubectl --kubeconfig=${K8S_KUBECONFIG_PATH} -n ${NAMESPACE} patch ${DEPLOYMENT_NAME} --type='merge' -p '{"spec":{"template":{"metadata":{"labels":{"sidecar.asm.aliyun.com/inject":"true"}}}}}'PentingPerintah ini memodifikasi label workload, yang memicu restart bergulir. Apakah trafik terganggu atau tidak bergantung pada beberapa faktor, termasuk dukungan shutdown yang mulus pada protokol aplikasi (seperti HTTP, HTTP/2, dan gRPC), konfigurasi Sidecar Istio yang tepat untuk shutdown yang mulus, serta perilaku aplikasi yang sesuai (misalnya, apakah semua permintaan dapat diselesaikan dalam periode shutdown yang mulus). Untuk meminimalkan potensi gangguan, lakukan operasi ini pada jam sepi.
-
Migrasikan gerbang masuk Istio ke gerbang masuk ASM.
Untuk informasi selengkapnya, lihat Migrasikan gerbang masuk Istio self-built ke gerbang ASM.
-
Migrasikan gerbang keluar Istio ke gerbang keluar ASM. Jika gerbang keluar diaktifkan di kluster, ikuti langkah-langkah berikut untuk memigrasikannya:
-
Buat gerbang keluar di ASM. Untuk informasi selengkapnya, lihat Buat gerbang keluar. Buat resource lain yang diperlukan, seperti ServiceEntry untuk mendaftarkan layanan eksternal, aturan gateway untuk mengaktifkan port forwarding untuk gerbang keluar, dan layanan virtual untuk mengarahkan trafik ke gerbang keluar. Untuk informasi selengkapnya, lihat Kelola trafik ke layanan eksternal di ASM.
-
Modifikasi layanan virtual untuk layanan eksternal yang ingin Anda migrasikan agar mengarah ke gerbang keluar ASM dan atur bobot yang diinginkan.
File YAML berikut adalah contohnya. Untuk contoh lengkap, lihat Gerbang keluar untuk trafik HTTP.
apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: direct-cnn-through-egress-gateway spec: hosts: - edition.cnn.com gateways: - istio-egressgateway - mesh http: - match: - gateways: - mesh port: 80 route: - destination: host: istio-egressgateway.istio-system.svc.cluster.local port: number: 80 weight: 99 - destination: # Tambahkan destinasi baru yang mengarah ke gerbang keluar ASM dan sesuaikan bobotnya. host: asm-egressgateway.istio-system.svc.cluster.local # Mengasumsikan gerbang keluar ASM Anda bernama asm-egressgateway. port: number: 80 weight: 1Dalam contoh ini, trafik ke
edition.cnn.comdibagi antara gerbang keluar Istio dan gerbang keluar ASM dengan rasio 99:1. Anda dapat secara bertahap menyesuaikan rasio ini hingga seluruh trafik diarahkan ke gerbang keluar ASM. Pantau Log akses gerbang keluar Istio untuk memverifikasi bahwa tidak ada lagi trafik yang melewatinya.
-
Langkah 4: Finalisasi migrasi
Sebelum melanjutkan, pastikan Anda telah menyelesaikan semua tugas berikut:
-
Semua Sidecar Istio telah dihapus.
-
Tidak ada trafik yang melewati gerbang timur-barat, gerbang masuk, atau gerbang keluar Istio.
-
Semua konfigurasi API Istio telah diimpor ke ASM.
-
Workload yang diinjeksi proxy mesh ASM berperilaku sesuai harapan.
Setelah memastikan semua prasyarat terpenuhi, Anda dapat menguninstall Istio dari kluster menggunakan perintah istioctl yang sesuai dengan versi Istio Anda.
Versi istioctl yang berbeda memiliki perilaku yang berbeda. Untuk mencegah penghapusan resource secara tidak sengaja atau pembersihan yang tidak lengkap, Anda harus menggunakan tool istioctl yang sesuai dengan versi Istio yang diinstal di kluster Anda.
$ istioctl --kubeconfig=${K8S_KUBECONFIG_PATH} uninstall --purge
Setelah penguninstalan selesai, ubah status ke Finished. Jika transisi status gagal, periksa field status.message untuk informasi tentang resource Istio yang tersisa dan perlu dibersihkan secara manual. Setelah pembersihan selesai, tambahkan nilai spec.retryCounter sebesar 1 untuk mencoba ulang operasi. Migrasi selesai ketika field status.state bernilai Finished.