Praktik terbaik Kubernetes. Buat wadah kecil



Langkah pertama dalam penggelaran ke Kubernetes adalah menempatkan aplikasi Anda dalam sebuah wadah. Dalam seri ini, kita akan melihat bagaimana Anda dapat membuat gambar wadah kecil dan aman.
Berkat Docker, membuat gambar kontainer tidak pernah semudah ini. Tentukan gambar dasar, tambahkan perubahan Anda dan buat wadah.



Terlepas dari kenyataan bahwa teknik ini bagus untuk memulai, menggunakan gambar dasar secara default dapat menyebabkan pekerjaan tidak aman dengan gambar besar yang penuh kerentanan.

Selain itu, sebagian besar gambar di Docker menggunakan Debian atau Ubuntu sebagai gambar dasar, dan meskipun ini memberikan kompatibilitas yang sangat baik dan adaptasi yang mudah (file Docker hanya membutuhkan dua baris kode), gambar dasar dapat menambahkan ratusan megabyte beban tambahan ke wadah Anda. Misalnya, file node.js sederhana dari aplikasi Go hello-world membutuhkan sekitar 700 megabita, sedangkan ukuran aplikasi Anda sendiri hanya beberapa megabita.



Dengan demikian, semua beban tambahan ini adalah pemborosan ruang digital dan cache yang sangat baik untuk kerentanan dan kesalahan dalam sistem keamanan. Jadi mari kita lihat dua cara untuk mengurangi ukuran gambar kontainer.

Yang pertama adalah penggunaan gambar dasar ukuran kecil, yang kedua adalah penggunaan pola desain Pola Builder. Menggunakan gambar dasar yang lebih kecil mungkin merupakan cara termudah untuk mengurangi ukuran wadah Anda. Kemungkinan besar, bahasa Anda atau tumpukan yang Anda gunakan menyediakan gambar aplikasi asli yang jauh lebih kecil dari gambar default. Mari kita lihat node.js. wadah kami



Secara default, di Docker, ukuran simpul dasar: 8 gambar adalah 670 MB, dan ukuran simpul: 8-alpine hanya 65 MB, yaitu 10 kali lebih kecil. Menggunakan gambar dasar Alpine yang lebih kecil akan secara signifikan mengurangi ukuran wadah Anda. Alpine adalah distribusi Linux yang kecil dan ringan yang sangat populer di kalangan pengguna Docker karena kompatibel dengan banyak aplikasi, sambil mempertahankan ukuran wadah yang kecil. Berbeda dengan gambar "simpul" Docker standar, "simpul: alpine" menghapus banyak file dan program utilitas, hanya menyisakan yang cukup untuk menjalankan aplikasi Anda.

Untuk beralih ke gambar dasar yang lebih kecil, cukup perbarui file Docker untuk mulai bekerja dengan gambar dasar yang baru:



Sekarang, tidak seperti gambar onbuild lama, Anda perlu menyalin kode Anda ke dalam wadah dan menginstal segala dependensi. Dalam file Docker baru, wadah dimulai dengan node: alpine image, kemudian membuat direktori untuk kode, menginstal dependensi menggunakan manajer paket NPM, dan akhirnya memulai server.js.



Dengan pembaruan ini, sebuah wadah 10 kali lebih kecil. Jika bahasa atau tumpukan pemrograman Anda tidak memiliki kemampuan untuk mengurangi gambar dasar, gunakan Alpine Linux. Ini juga akan memberikan kemampuan untuk sepenuhnya mengelola isi wadah. Menggunakan gambar berukuran kecil dasar adalah cara yang bagus untuk dengan cepat membuat wadah kecil. Tetapi Anda dapat mencapai pengurangan yang lebih besar menggunakan Pattern Builder.



Dalam bahasa yang ditafsirkan, kode sumber pertama kali diteruskan ke juru bahasa dan kemudian langsung dieksekusi. Dalam bahasa yang dikompilasi, kode sumber dikonversi terlebih dahulu ke kode yang dikompilasi. Namun, kompilasi sering menggunakan alat yang tidak benar-benar diperlukan untuk menjalankan kode. Ini berarti bahwa Anda dapat sepenuhnya menghapus alat-alat ini dari wadah terakhir. Anda dapat menggunakan Pola Builder untuk ini.



Kode dibuat di wadah pertama dan dikompilasi. Kemudian, kode yang dikompilasi dikemas dalam wadah akhir tanpa kompiler dan alat yang diperlukan untuk mengkompilasi kode ini. Mari kita lewati aplikasi Go melalui proses ini. Pertama, kita akan pindah dari gambar onbuild ke Alpine Linux.



Dalam file Docker baru, wadah dimulai dengan golang: alpine image. Dia kemudian membuat direktori untuk kode, menyalinnya ke kode sumber, membuat kode sumber ini dan meluncurkan aplikasi. Wadah ini jauh lebih kecil daripada wadah onbuild, tetapi masih berisi kompiler dan alat Go lainnya yang tidak benar-benar kita butuhkan. Jadi mari kita ekstrak program yang dikompilasi dan meletakkannya di wadah kita sendiri.



Anda mungkin melihat sesuatu yang aneh dalam file Docker ini: ini berisi dua baris DARI. Bagian pertama dari 4 baris terlihat persis sama dengan file Docker sebelumnya, kecuali bahwa ia menggunakan kata kunci AS untuk memberi nama langkah ini. Di bagian berikutnya, ada baris FROM baru yang memungkinkan Anda untuk memulai gambar baru, dan bukannya golang: gambar alpine, kita akan menggunakan Raw alpine sebagai gambar dasar.

Raw Alpine Linux tidak memiliki sertifikat SSL yang diinstal, yang akan menyebabkan sebagian besar panggilan API HTTPS gagal, jadi mari kita instal beberapa sertifikat root CA.

Dan sekarang yang paling menarik: untuk menyalin kode yang dikompilasi dari wadah pertama ke yang kedua, Anda cukup menggunakan perintah COPY yang terletak di baris ke-5 dari bagian kedua. Ini akan menyalin hanya satu file aplikasi dan tidak akan mempengaruhi alat utilitas Go. File Docker multi-tahap baru akan berisi gambar kontainer berukuran hanya 12 megabyte, sedangkan gambar wadah asli adalah 700 megabyte, dan ini adalah perbedaan besar!
Dengan demikian, menggunakan gambar dasar kecil dan Pola Builder adalah cara yang bagus untuk membuat wadah yang jauh lebih kecil tanpa banyak pekerjaan.
Ada kemungkinan bahwa, tergantung pada tumpukan aplikasi, ada cara-cara tambahan untuk mengurangi ukuran gambar dan wadah, tetapi apakah wadah kecil benar-benar keuntungan yang dapat diukur? Mari kita lihat dua aspek di mana wadah kecil sangat efektif - kinerja dan keamanan.

Untuk mengevaluasi peningkatan kinerja, pertimbangkan durasi proses pembuatan wadah, masukkan ke dalam registri (dorong) dan kemudian ambil dari sana (tarik). Anda dapat melihat bahwa wadah yang lebih kecil memiliki keunggulan yang tidak dapat disangkal dibandingkan dengan wadah yang lebih besar.



Docker akan melakukan cache pada layer-layer tersebut, jadi build selanjutnya akan sangat cepat. Namun, dalam banyak sistem CI yang digunakan untuk membangun dan menguji wadah, lapisan tidak di-cache, sehingga ada penghematan waktu yang signifikan. Seperti yang Anda lihat, waktu untuk membangun sebuah wadah besar, tergantung pada kekuatan mesin Anda, adalah dari 34 hingga 54 detik, dan ketika menggunakan wadah yang dikurangi dengan Pola Builder, dari 23 menjadi 28 detik. Untuk operasi semacam ini, peningkatan produktivitas akan menjadi 40-50%. Jadi pikirkan berapa kali Anda membuat dan menguji kode Anda.

Setelah wadah dibuat, Anda harus memasukkan gambarnya (push container image) ke dalam registri wadah untuk menggunakan Kubernetes di cluster Anda. Saya sarankan menggunakan registri kontainer Google.



Dengan menggunakan Google Container Registry (GCR), Anda hanya membayar untuk penyimpanan dan jaringan mentah, dan tidak ada biaya manajemen wadah tambahan. Ini rahasia, aman dan sangat cepat. GCR menggunakan banyak trik untuk mempercepat operasi tarikan. Seperti yang Anda lihat, memasukkan gambar kontainer Docker Container Image menggunakan go: onbuild, tergantung pada kinerja komputer, akan membutuhkan waktu 15 hingga 48 detik, dan operasi yang sama dengan wadah yang lebih kecil akan memakan waktu 14 hingga 16 detik, dan untuk mesin yang kurang efisien keuntungan dalam kecepatan operasi meningkat sebesar 3 kali. Untuk mesin besar, waktunya kira-kira sama, karena GCR menggunakan cache global untuk basis data gambar yang umum, yaitu, Anda tidak perlu mengunduhnya sama sekali. Dalam komputer berdaya rendah, CPU adalah hambatan,oleh karena itu, keuntungan menggunakan wadah kecil di sini jauh lebih nyata.

Jika Anda menggunakan GCR, saya sangat merekomendasikan menggunakan Google Container Builder (GCB) sebagai bagian dari sistem build Anda.



Seperti yang Anda lihat, menggunakannya memungkinkan Anda untuk mencapai hasil yang jauh lebih baik dalam mengurangi durasi operasi Build + Push daripada bahkan dengan mesin yang produktif - dalam hal ini, proses membangun dan mengirim kontainer ke host hampir 2 kali lebih cepat. Selain itu, setiap hari Anda mendapatkan 120 menit perakitan gratis, yang dalam banyak kasus memenuhi kebutuhan membuat wadah.

Berikutnya adalah metrik kinerja paling penting - kecepatan di mana Anda mengambil atau mengunduh kontainer Tarik. Dan jika Anda tidak terlalu peduli dengan waktu yang dihabiskan untuk operasi push, maka durasi proses tarikan sangat mempengaruhi kinerja keseluruhan sistem. Misalkan Anda memiliki sekelompok tiga node dan salah satunya crash. Jika Anda menggunakan sistem manajemen, seperti Google Kubernetes Engine, itu akan secara otomatis mengganti node siaga dengan yang baru. Namun, simpul baru ini akan benar-benar kosong, dan Anda harus menyeret semua wadah ke dalamnya agar berfungsi. Jika operasi tarikan cukup lama, maka selama ini cluster Anda akan bekerja dengan kinerja lebih rendah.

Ada banyak kasus di mana ini bisa terjadi: menambahkan node baru ke cluster, memperbarui node, atau bahkan beralih ke wadah baru untuk ditempatkan. Dengan demikian, meminimalkan waktu ekstraksi tarikan menjadi faktor utama. Tidak dapat disangkal bahwa unduhan kontainer kecil jauh lebih cepat daripada yang besar. Jika Anda menggunakan banyak wadah di kluster Kubernetes, menghemat waktu bisa sangat signifikan.



Lihatlah perbandingannya: operasi tarikan saat bekerja dengan wadah kecil membutuhkan waktu 4-9 kali lebih sedikit tergantung pada kekuatan mesin dibandingkan operasi yang sama menggunakan go: onbuild. Menggunakan gambar-gambar dasar umum dari wadah kontainer kecil sangat mempercepat waktu dan kecepatan yang digunakan oleh node Kubernet baru dan online.

Mari kita lihat masalah keamanan. Wadah yang lebih kecil dianggap jauh lebih aman daripada wadah besar karena mereka memiliki permukaan serangan yang lebih kecil. Benarkah itu? Salah satu fitur paling berguna dari Google Container Registry adalah kemampuan untuk secara otomatis memindai kontainer Anda dari kerentanan. Beberapa bulan yang lalu, saya membuat kontainer onbuild dan multi-stage, jadi mari kita lihat apakah ada kerentanan di sana.



Hasilnya luar biasa: hanya 3 kerentanan sedang yang ditemukan dalam wadah kecil, dan 16 kerentanan kritis dan 376 kerentanan lainnya dalam wadah besar. Jika Anda melihat isi wadah besar, Anda dapat melihat bahwa sebagian besar masalah keamanan tidak ada hubungannya dengan aplikasi kami, tetapi terkait dengan program yang bahkan tidak kami gunakan. Jadi ketika orang berbicara tentang permukaan besar untuk serangan, mereka benar-benar bermaksud seperti itu.



Kesimpulannya jelas: buat wadah kecil karena mereka memberikan manfaat nyata dalam kinerja dan keamanan sistem Anda.

Praktik terbaik Kubernetes. Organisasi Kubernet dengan namespace


Sedikit iklan :)


Terima kasih untuk tetap bersama kami. Apakah Anda suka artikel kami? Ingin melihat materi yang lebih menarik? Dukung kami dengan melakukan pemesanan atau merekomendasikan kepada teman Anda, cloud VPS untuk pengembang dari $ 4,99 , analog unik dari server entry-level yang diciptakan oleh kami untuk Anda: Seluruh kebenaran tentang VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps mulai dari $ 19 atau cara membagi server? (opsi tersedia dengan RAID1 dan RAID10, hingga 24 core dan hingga 40GB DDR4).

Dell R730xd 2 kali lebih murah di pusat data Equinix Tier IV di Amsterdam? Hanya kami yang memiliki 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV dari $ 199 di Belanda!Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - mulai dari $ 99! Baca tentang Cara Membangun Infrastruktur Bldg. kelas c menggunakan server Dell R730xd E5-2650 v4 seharga 9.000 euro untuk satu sen?

All Articles