ProHoster > blog > administrasi > Cara menjalankan Istio menggunakan Kubernetes dalam produksi. Bagian 1
Cara menjalankan Istio menggunakan Kubernetes dalam produksi. Bagian 1
Apa Istio? Inilah yang disebut Service mesh, sebuah teknologi yang menambahkan lapisan abstraksi melalui jaringan. Kami mencegat semua atau sebagian lalu lintas di kluster dan melakukan serangkaian operasi tertentu dengannya. Yang mana? Misalnya, kami melakukan perutean pintar, atau kami menerapkan pendekatan pemutus sirkuit, kami dapat mengatur "penyebaran kenari", mengalihkan sebagian lalu lintas ke versi baru layanan, atau kami dapat membatasi interaksi eksternal dan mengontrol semua perjalanan dari klaster ke jaringan eksternal. Dimungkinkan untuk menetapkan aturan kebijakan untuk mengontrol perjalanan antara layanan mikro yang berbeda. Terakhir, kita bisa mendapatkan seluruh peta interaksi jaringan dan membuat kumpulan metrik terpadu benar-benar transparan untuk aplikasi.
Anda dapat membaca tentang mekanisme kerja di dokumentasi resmi. Istio adalah alat yang sangat ampuh yang memungkinkan Anda menyelesaikan banyak tugas dan masalah. Pada artikel ini, saya ingin menjawab pertanyaan utama yang biasanya muncul saat memulai dengan Istio. Ini akan membantu Anda menghadapinya lebih cepat.
Prinsip operasi
Istio terdiri dari dua area utama - bidang kontrol dan bidang data. Bidang kontrol berisi komponen utama yang memastikan operasi yang benar dari yang lain. Pada versi saat ini (1.0) control plane memiliki tiga komponen utama: Pilot, Mixer, Citadel. Kami tidak akan mempertimbangkan Citadel, ini diperlukan untuk menghasilkan sertifikat guna memastikan TLS timbal balik antar layanan. Mari kita lihat lebih dekat perangkat dan tujuan dari Pilot dan Mixer.
Pilot adalah komponen kontrol utama yang mendistribusikan semua informasi tentang apa yang kita miliki di cluster - layanan, titik akhir dan aturan perutean mereka (misalnya, aturan untuk penyebaran Canary atau aturan pemutus sirkuit).
Mixer adalah komponen bidang kontrol opsional yang menyediakan kemampuan untuk mengumpulkan metrik, log, dan informasi apa pun tentang interaksi jaringan. Dia juga memantau kepatuhan terhadap aturan Kebijakan dan kepatuhan terhadap batas tarif.
Pesawat data diimplementasikan menggunakan wadah proxy sespan. Kuat digunakan secara default. wakil utusan. Itu bisa diganti dengan implementasi lain, seperti nginx (nginmesh).
Agar Istio bekerja sepenuhnya transparan terhadap aplikasi, ada sistem injeksi otomatis. Implementasi terbaru cocok untuk versi Kubernetes 1.9+ (webhook penerimaan mutasi). Untuk Kubernetes versi 1.7, 1.8 dimungkinkan untuk menggunakan Penginisialisasi.
Kontainer sespan terhubung ke Pilot menggunakan protokol GRPC, yang memungkinkan Anda mengoptimalkan model push untuk perubahan yang terjadi di klaster. GRPC telah digunakan di Envoy sejak versi 1.6, di Istio telah digunakan sejak versi 0.8 dan merupakan agen percontohan - pembungkus golang di atas utusan yang mengonfigurasi opsi peluncuran.
Pilot dan Mixer adalah komponen tanpa kewarganegaraan, semua status disimpan dalam memori. Konfigurasi untuk mereka diatur dalam bentuk Sumber Daya Kustom Kubernetes, yang disimpan di etcd.
Istio-agent mendapatkan alamat Pilot dan membuka aliran GRPC ke sana.
Seperti yang saya katakan, Istio mengimplementasikan semua fungsi yang sepenuhnya transparan untuk aplikasi. Mari kita lihat caranya. Algoritmanya adalah ini:
Menyebarkan versi baru layanan.
Bergantung pada pendekatan injecting container sidecar, container istio-init dan container istio-agent (envoy) ditambahkan pada tahap penerapan konfigurasi, atau keduanya sudah dapat dimasukkan secara manual ke dalam deskripsi entitas Pod Kubernetes.
Kontainer istio-init adalah skrip yang menerapkan aturan iptables ke pod. Ada dua opsi untuk mengonfigurasi lalu lintas agar dibungkus dalam wadah istio-agent: gunakan aturan pengalihan iptables, atau PROKSI. Pada saat penulisan, pendekatan default adalah dengan aturan redirect. Di istio-init, dimungkinkan untuk mengonfigurasi lalu lintas mana yang harus dicegat dan dikirim ke istio-agent. Misalnya, untuk mencegat semua lalu lintas masuk dan keluar, Anda perlu mengatur parameternya -i ΠΈ -b ke dalam makna *. Anda dapat menentukan port tertentu untuk dicegat. Agar tidak mencegat subnet tertentu, Anda dapat menentukannya menggunakan flag -x.
Setelah init container dijalankan, yang utama diluncurkan, termasuk pilot-agent (utusan). Itu terhubung ke Pilot yang sudah dikerahkan melalui GRPC dan menerima informasi tentang semua layanan yang ada dan kebijakan perutean di kluster. Menurut data yang diterima, dia mengonfigurasi cluster dan menetapkannya langsung ke titik akhir aplikasi kami di cluster Kubernetes. Penting juga untuk mencatat poin penting: utusan secara dinamis mengonfigurasi pendengar (IP, pasangan port) yang mulai didengarkan. Oleh karena itu, ketika permintaan masuk ke pod, dialihkan menggunakan aturan redirect iptables di sidecar, utusan sudah berhasil memproses koneksi ini dan memahami ke mana harus mem-proxy lalu lintas lebih lanjut. Juga pada tahap ini, informasi dikirim ke Mixer, yang akan kita lihat nanti, dan rentang penelusuran dikirim.
Hasilnya, kami mendapatkan seluruh jaringan server proxy utusan yang dapat kami konfigurasikan dari satu titik (Pilot). Semua permintaan masuk dan keluar melalui utusan. Selain itu, hanya lalu lintas TCP yang dicegat. Artinya, IP layanan Kubernetes diselesaikan menggunakan kube-dns melalui UDP tanpa perubahan. Kemudian, setelah penyelesaian, permintaan keluar dicegat dan diproses oleh utusan, yang telah memutuskan ke titik akhir mana permintaan harus dikirim (atau tidak dikirim, dalam hal kebijakan akses atau pemutus sirkuit algoritme).
Kami menemukan Pilot, sekarang kami perlu memahami cara kerja Mixer dan mengapa itu diperlukan. Anda dapat membaca dokumentasi resmi untuk itu di sini.
Mixer dalam bentuknya yang sekarang terdiri dari dua komponen: istio-telemetry, istio-policy (sebelum versi 0.8 merupakan salah satu komponen istio-mixer). Keduanya merupakan pencampur yang masing-masing bertanggung jawab atas tugasnya masing-masing. Telemetri Istio menerima informasi tentang siapa pergi ke mana dan dengan parameter apa dari wadah Laporan sespan melalui GRPC. Istio-policy menerima permintaan Periksa untuk memverifikasi bahwa aturan Kebijakan dipenuhi. Pemeriksaan kebijakan, tentu saja, tidak dilakukan untuk setiap permintaan, tetapi di-cache pada klien (di sespan) untuk waktu tertentu. Pemeriksaan laporan dikirim sebagai permintaan batch. Mari kita lihat cara mengonfigurasi dan parameter apa yang harus dikirim nanti.
Mixer seharusnya menjadi komponen yang sangat tersedia yang memastikan pekerjaan tanpa gangguan pada perakitan dan pemrosesan data telemetri. Sistem ini diperoleh sebagai buffer multi-level. Awalnya, data di-buffer di sisi sidecar container, kemudian di sisi mixer, dan kemudian dikirim ke apa yang disebut backend mixer. Akibatnya, jika salah satu komponen sistem gagal, buffer tumbuh dan dibilas setelah sistem dipulihkan. Backend mixer adalah titik akhir untuk mengirim data telemetri: statsd, newrelic, dll. Anda dapat menulis backend Anda sendiri, ini cukup sederhana, dan kami akan melihat cara melakukannya.
Singkatnya, skema untuk bekerja dengan istio-telemetri adalah sebagai berikut.
Layanan 1 mengirimkan permintaan ke layanan 2.
Saat meninggalkan layanan 1, permintaan dibungkus dengan sespannya sendiri.
Utusan sespan memantau bagaimana permintaan masuk ke layanan 2 dan menyiapkan informasi yang diperlukan.
Kemudian mengirimkannya ke istio-telemetri menggunakan permintaan Laporan.
Istio-telemetri menentukan apakah Laporan ini harus dikirim ke backend, ke mana dan data apa yang harus dikirim.
Istio-telemetri mengirimkan data Laporan ke backend jika diperlukan.
Sekarang mari kita lihat bagaimana menerapkan Istio dalam sistem, yang hanya terdiri dari komponen utama (Pilot dan utusan sespan).
Pertama, mari kita lihat konfigurasi utama (mesh) yang dibaca Pilot:
Agar semuanya berhasil dimulai, Anda perlu membuat ServiceAccount, ClusterRole, ClusterRoleBinding, CRD untuk Pilot, yang deskripsinya dapat ditemukan di sini.
Akibatnya, layanan tempat kami menyuntikkan sespan dengan utusan harus dimulai dengan sukses, menerima semua penemuan dari pilot, dan memproses permintaan.
Penting untuk dipahami bahwa semua komponen bidang kontrol adalah aplikasi tanpa kewarganegaraan dan dapat diskalakan secara horizontal tanpa masalah. Semua data disimpan di etcd dalam bentuk deskripsi kustom sumber daya Kubernetes.
Selain itu, Istio (masih dalam tahap percobaan) memiliki kemampuan untuk berjalan di luar cluster dan kemampuan untuk mengamati dan meraba-raba penemuan layanan di antara beberapa cluster Kubernetes. Anda dapat membaca lebih lanjut tentang ini di sini.
Untuk penginstalan multi-cluster, perhatikan batasan berikut:
Pod CIDR dan Service CIDR harus unik di semua cluster dan tidak boleh tumpang tindih.
Semua Pod CIDR harus dapat diakses dari semua Pod CIDR antar cluster.
Semua server API Kubernetes harus dapat diakses satu sama lain.
Ini adalah informasi awal untuk membantu Anda memulai dengan Istio. Namun, masih banyak jebakan. Misalnya, fitur merutekan lalu lintas eksternal (di luar cluster), pendekatan untuk men-debug sidecars, membuat profil, menyiapkan mixer, dan menulis backend mixer khusus, menyiapkan mekanisme penelusuran dan pengoperasiannya menggunakan utusan.
Semua ini akan kami pertimbangkan dalam publikasi berikut. Ajukan pertanyaan Anda, saya akan mencoba untuk menutupinya.