Hampir tidak salah untuk mengatakan yang terbaik dari orang
dapatkan sukacita melalui penderitaan.
Ludwig van Beethoven

Saya Sergey, saya bekerja di Yandex.Money di tim riset kinerja. Saya ingin memberi tahu Anda awal dari sebuah cerita tentang jalan kami menggunakan orkestrasi - bagaimana kami memilih instrumen dan apa yang kami perhitungkan. Semua peristiwa dari artikel berlangsung secara real time, sehingga Anda, pembaca yang budiman, mengikuti perkembangan situasi yang hampir hidup.
Mengapa kita membutuhkan konduktor di tim?
Siapa konduktor? Dari fr. diriger - mengelola, mengarahkan, memimpin - di dunia musik - ini adalah seseorang, pemimpin pembelajaran dan kinerja musik ansambel. Dalam kasus kami, tempat ini ditempati oleh sistem orkestrasi dan otomatisasi.
Peran mereka tidak berbeda dengan peran konduktor dalam musik - mereka diperlukan untuk membantu tim, mengarahkan dan mengatur permainannya.
Sebagai aturan, sebuah tim memiliki serangkaian kapasitas tertentu - sebut saja mereka server di mana mereka melaksanakan proyek mereka.
Pendekatan untuk mendapatkan dan mengoperasikan server ini beragam. Beberapa contoh:
- Tim membuat permintaan, misalnya, kepada kelompok operasi, untuk memberi mereka sumber daya dengan parameter tertentu.
- Kelompok operasi memberi mereka jumlah yang diperlukan - cloud atau bare metal ("bare metal") - dan berjanji untuk mempertahankannya dalam kondisi yang baik sesuai dengan SLA. Penyesuaian juga dilakukan oleh tim operasi.
- Tim hanya menerima sumber daya cloud atau bare metal dari grup operasi, ia melakukan pengaturannya sendiri.
- Tim itu sendiri โmembeliโ sumber daya dan mendukung / mengonfigurasinya sepenuhnya secara independen.
Tim kami menggunakan server yang perlu didukung - memperbarui OS, menginstal paket baru, dll.
Bagi kami sendiri, kami membedakan mereka menjadi dua jenis utama:
- kelompok tangki
- kelompok layanan.
Grup tangki terdiri dari host dengan Yandex.Tank.
Grup layanan mencakup segala sesuatu yang berkaitan dengan pemeliharaan - ini adalah berbagai layanan untuk memberikan dukungan untuk siklus rilis, menghasilkan laporan otomatis, dll.
Pada satu titik, semuanya menjadi tidak nyaman untuk mengelola semua ini secara manual, dan kami berpikir untuk mengotomatiskan seluruh proses, mulai dari "memuat" server dan berakhir dengan pengembangan, tata letak, dan peluncuran layanan internal kami.
Mengapa seorang konduktor diperlukan, bahkan jika orkestra itu sendiri dapat bermain?
Untuk memulainya, kami menguasai Ansible dan mulai โmenuangkanโ server bare metal kami agar tidak terlalu bergantung pada administrator sistem - semua orang menang di sini, kami memperoleh keterampilan baru dan membebaskan administrator dari bagian pekerjaan yang selalu mereka miliki tanpa kami. Kami berusaha keras untuk mengembangkan tim kami di luar spesialisasi dan otonomi kami sebanyak mungkin.
Perusahaan telah bekerja dengan Ansible untuk waktu yang lama sudah diatur dan diatur, sehingga kami dengan mudah mengintegrasikan solusi kami ke dalam proses ini.
Hosting sekarang terdiri dari tiga peran yang dimungkinkan:
- peran pertama menginstal OS,
- gulungan pengaturan dasar untuk tuan rumah, otorisasi LDAP, misalnya,
- dan yang ketiga menginstal Yandex.Tank dan dependensi terkait dalam wadah buruh pelabuhan.
Mari kita beralih ke layanan yang kita gunakan di dalam tim.
Untuk tugas kami, kami sama-sama menggunakan Kotlin dan Python, dan sedikit lagi Golang. Untuk menyatukan pengembangan dan penyebaran layanan kami, kami memutuskan untuk mengemasnya dalam wadah buruh pelabuhan. Ini memberikan kebebasan untuk memilih bahasa pemrograman dan pada saat yang sama mengatur format pengiriman seragam dari aplikasinya.
Beberapa layanan yang berinteraksi dengan kami hanya tersedia melalui ipv6, jadi saya harus mencari cara membuat ipv6 untuk wadah.
Menurut dokumentasi untuk ipv6 di situs web Docker resmi, ipv6 diaktifkan dengan menambahkan parameter ke daemon.json:
{ "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64" }
Dalam hal ini, penyedia harus mengeluarkan subnet ipv6, yang akan Anda fixed-cidr-v6.
di fixed-cidr-v6.
Namun, kami memilih opsi lain - ipv6 NAT, dan inilah alasannya:
- Sekarang buruh pelabuhan tidak dapat digunakan hanya dengan ipv6.
- Kehadiran alamat yang dapat dialihkan secara global di setiap wadah berarti bahwa semua port (bahkan yang tidak dipublikasikan) tersedia untuk semua orang jika penyaringan tambahan tidak dilakukan.
- proxy userland untuk portpublikasi, iptables hanya untuk ipv4 .
ipv6 NAT adalah wadah buruh pelabuhan yang dengan sendirinya mengelola aturan di ip6table dan mengeditnya saat wadah baru ditambahkan.
Agar solusi ini berfungsi dengan benar, sejumlah manipulasi harus dilakukan. Pastikan untuk menginisialisasi ip6table_nat pada sistem. Kehadiran modul yang terinstal di sistem tidak menjamin bahwa pada saat startup modul akan dimuat ke dalam kernel. Kami menemukan ini ketika kami mendapatkan kesalahan ini ketika memulai sebuah wadah dengan NAT pada host baru:
2019/01/22 14:59:54 running [/sbin/ip6tables -t filter -N DOCKER --wait]: exit status 3: modprobe: can't change directory to '/lib/modules': No such file or directory ip6tables v1.6.2: can't initialize ip6tables table `filter': Table does not exist (do you need to insmod?)
Masalahnya dipecahkan setelah menambahkan inisialisasi ke peran Ansible menggunakan modul modprobe dan memuatnya pada startup menggunakan lineinfile:
- name: Add ip6table_nat module modprobe: name: ip6table_nat state: present - name: Add ip6table_nat to boot lineinfile: path: /etc/modules line: 'ip6table_nat'
Ngomong-ngomong, ada artikel bagus tentang Haber, yang secara singkat dan jelas menjelaskan kelebihan dan kekurangan metode tertentu untuk bekerja dengan ipv6 di buruh pelabuhan.
Tetapi kembali ke pertanyaan kami yang diajukan di awal:
Mengapa seorang konduktor diperlukan, bahkan jika orkestra itu sendiri dapat bermain?
Sekarang semua orang tahu cara bermain di tim kami:
- proses "mengisi" server dibuat,
- pengembangan dan penyebaran layanan disatukan.
Muncul pertanyaan yang masuk akal - bagaimana cara menyebarkan, memperbarui, mengontrol layanan kami dalam wadah buruh pelabuhan secara efisien dan seotomatis mungkin?
Terlepas dari kenyataan bahwa setiap anggota orkestra mengetahui bagiannya sendiri, ia dapat tersesat, menjauh dari ide aslinya. Di sini kita sampai pada fakta bahwa tanpa konduktor orkestra kita tidak akan secara efektif berlatih dan bermain secara harmonis. Konduktor bertanggung jawab atas semua parameter kinerja, untuk memastikan bahwa semuanya disatukan oleh kecepatan dan suasana hati yang tunggal.
Bagaimana cara mendapatkan konduktor yang baik dengan investasi minimal?
Tema orkestrasi dikembangkan dengan baik di pasar. Tetapi pertama-tama, mari kita bicara tentang alat pendukung yang dapat membantu konduktor.
Konsul adalah sistem yang menyediakan dua fungsi utama:
- penemuan layanan
- penyimpanan nilai kunci terdistribusi.
Di orkestra kami, Konsul akan bertanggung jawab untuk mendaftarkan layanan dan menyimpan konfigurasi mereka. Ada dua opsi pendaftaran:
- Aktif - ini adalah saat layanan itu sendiri mendaftar sendiri menggunakan HTTP API;
- Pasif - layanan harus didaftarkan secara manual.
Vault adalah repositori yang menstandarkan dan menyatukan penyimpanan yang aman dan bekerja dengan rahasia - kata sandi, sertifikat.
Berikut adalah manfaat yang akan kami peroleh dengan menggunakan alat ini:
- Pusat tunggal untuk membuat dan menyimpan rahasia, mengelola siklus hidup mereka melalui API HTTP.
- Transit Secrets Engine - enkripsi-dekripsi data tanpa menyimpannya. Kemampuan untuk mengirimkan data dalam bentuk terenkripsi melalui saluran komunikasi yang tidak aman.
- Kebijakan akses yang nyaman untuk dikonfigurasi.
- Akses audit ke rahasia.
- Kemampuan untuk membuat CA (Otoritas Sertifikat) Anda sendiri untuk mengelola sertifikat yang ditandatangani sendiri dalam infrastruktur Anda.
Mempertimbangkan semua persyaratan kami, dua opsi cocok dengan peran konduktor - Kubernetes dan Nomad.
Kubernetes
Berapa banyak artikel dan buku yang telah ditulis tentang dia (yang ini, misalnya), laporan telah diberitahu bahwa saya akan menulis secara singkat - ini adalah prosesor universal yang dapat melakukan hampir semua hal. Membayar untuk itu tidak selalu mudah untuk diatur dan mendukung sebuah cluster di Kubernetes.
Pengembara
Alat ini dari HashiCorp, sebuah perusahaan yang dikenal dengan konsul dan kubah yang disebutkan di atas.
Nomad bagi kami agaknya mudah diinstal dan dikonfigurasikan daripada Kubernetes. Satu file biner berfungsi baik dalam mode server dan klien. Pada saat yang sama, Nomad mencakup seluruh daftar tugas yang kami ingin menyelesaikannya: manajemen klaster, penjadwal cepat, dukungan multidatacenter. Plus, ketika menggunakan konsul dan lemari besi, kami mendapatkan integrasi yang lebih ketat untuk mengatur layanan kami.
Apa yang sekarang sedang bekerja:
- menyiapkan server untuk penyebaran Konsul,
- konfigurasi cluster nomad akan dimasukkan dalam Konsul, yang nomad mana yang akan digunakan secara otomatis,
- Secara paralel, kami akan memasang lemari besi untuk menyimpan rahasia.
Pertanyaan di aula adalah apakah layak memiliki konduktor untuk tugas-tugas seperti itu, atau apakah orkestra baik tanpa itu? Beri tahu kami di komentar apa pendapat Anda tentang ini.
Berlangganan ke blog kami dan tetap terhubung - kami akan segera memberi tahu Anda apa yang terjadi pada akhirnya dan apakah kami mengkonfigurasi cluster nomad, seperti yang kami inginkan.
Kunjungi ruang obrolan telegram kami yang nyaman di mana Anda selalu dapat meminta saran, membantu kolega dan hanya berbicara tentang penelitian kinerja dan banyak lagi.