GNU/Linux >> Belajar Linux >  >> Ubuntu

19 Praktik Terbaik Kubernetes untuk Membangun Cluster yang Efisien

Pendahuluan

Kubernetes menawarkan tingkat fleksibilitas yang luar biasa untuk mengatur sekelompok besar container terdistribusi.

Banyaknya fitur dan opsi yang tersedia dapat menghadirkan tantangan. Menerapkan praktik terbaik membantu Anda menghindari potensi rintangan dan menciptakan lingkungan yang aman dan efisien sejak awal.

Gunakan praktik terbaik Kubernetes outlined untuk membangun container yang dioptimalkan, menyederhanakan penerapan, mengelola layanan yang andal, dan mengelola cluster yang lengkap.

Mengamankan dan Mengoptimalkan Penampung

Kontainer memberikan isolasi jauh lebih sedikit daripada Mesin Virtual. Anda harus selalu memverifikasi gambar penampung dan mempertahankan kontrol ketat atas izin pengguna.

Menggunakan gambar kontainer kecil meningkatkan efisiensi, menghemat sumber daya, dan mengurangi permukaan serangan bagi calon penyerang.

Hanya Gunakan Gambar Penampung Tepercaya

Gambar kontainer siap pakai sangat mudah diakses dan sangat berguna. Namun, gambar publik dapat dengan cepat menjadi usang, berisi eksploitasi, bug, atau bahkan perangkat lunak berbahaya yang menyebar dengan cepat ke seluruh cluster Kubernetes.

Hanya gunakan gambar dari repositori tepercaya dan selalu pindai gambar untuk kemungkinan kerentanan. Banyak alat online, seperti Anchore atau Clair, memberikan analisis statis cepat dari gambar kontainer dan memberi tahu Anda tentang potensi ancaman dan masalah. Luangkan beberapa saat untuk memindai gambar container sebelum menerapkannya dan menghindari konsekuensi yang berpotensi menimbulkan bencana.

Pengguna Non-Root dan Sistem File Hanya-Baca

Ubah konteks keamanan bawaan menjadi memaksa semua penampung hanya berjalan dengan pengguna non-root dan dengan sistem file hanya-baca.

Hindari menjalankan container sebagai pengguna root. Pelanggaran keamanan dapat dengan cepat meningkat jika pengguna dapat memberikan izin tambahan kepada dirinya sendiri.

Jika sistem file diatur ke hanya-baca, ada sedikit peluang untuk merusak konten penampung. Alih-alih mengedit file sistem, seluruh penampung harus dihapus dan yang baru diletakkan di tempatnya.

Buat Gambar Kecil dan Berlapis

Gambar kecil mempercepat pembuatan Anda dan membutuhkan lebih sedikit penyimpanan. Melapisi gambar secara efisien dapat mengurangi ukuran gambar secara signifikan. Coba buat gambar Anda dari awal untuk mencapai hasil yang optimal.

Gunakan beberapa pernyataan FROM dalam satu Dockerfile jika Anda membutuhkan banyak komponen berbeda. Fitur ini membuat bagian, masing-masing mereferensikan gambar dasar yang berbeda. Gambar akhir tidak lagi menyimpan lapisan sebelumnya, hanya komponen yang Anda butuhkan dari masing-masing lapisan, membuat wadah Docker jauh lebih ramping.

Setiap lapisan ditarik berdasarkan FROM perintah yang terletak di wadah yang dikerahkan.

Batasi Akses Pengguna dengan RBAC

Kontrol akses berbasis peran (RBAC) memastikan bahwa tidak ada pengguna yang memiliki izin lebih dari yang mereka butuhkan untuk menyelesaikan tugas mereka. Anda dapat mengaktifkan RBAC dengan menambahkan tanda berikut saat memulai server API:

--authorization-mode=RBAC

RBAC menggunakan rbac.authorization.k8s.io Grup API untuk mendorong keputusan otorisasi melalui Kubernetes API.

Log Stdout dan Stderr

Ini adalah praktik umum untuk mengirim log aplikasi ke stdout (output standar), dan log kesalahan ke stderr (kesalahan standar). Setelah aplikasi menulis ke stdout dan stderr, mesin penampung, seperti Docker, mengalihkan dan menyimpan catatan dalam file JSON.

Kontainer, pod, dan node Kubernetes adalah entitas dinamis. Log harus konsisten dan selalu tersedia. Oleh karena itu, direkomendasikan untuk menyimpan log seluruh cluster Anda di sistem penyimpanan backend yang terpisah.

Kubernetes dapat diintegrasikan dengan berbagai solusi logging yang ada, seperti ELK Stack.

Rampingkan Penerapan

Deployment Kubernetes membuat template yang memastikan pod aktif dan berjalan, diperbarui secara berkala, atau dibatalkan seperti yang ditentukan oleh pengguna.

Menggunakan label, flag, container tertaut, dan DaemonSet yang jelas dapat memberi Anda kontrol yang sangat baik atas proses penerapan.

Menggunakan catatan Bendera

Saat Anda menambahkan --record flag, kubectl . yang dieksekusi perintah disimpan sebagai anotasi. Dengan memeriksa riwayat peluncuran penerapan, Anda dapat dengan mudah melacak pembaruan di PERUBAHAN-PENYEBAB kolom.

Kembalikan ke revisi apa pun dengan mendeklarasikan nomor revisi dalam perintah undo.

kubectl rollout undo deployment example-deployment --to-revision=1

Tanpa --record bendera, akan sulit untuk mengidentifikasi revisi spesifik.

Label Deskriptif

Coba gunakan sebanyak mungkin label deskriptif. Label adalah key:value pair yang memungkinkan pengguna untuk mengelompokkan dan mengatur pod dalam subset yang berarti. Sebagian besar fitur, plugin, dan solusi pihak ketiga memerlukan label untuk dapat mengidentifikasi pod dan mengontrol proses otomatis.

Misalnya, Kubernetes DaemonSets bergantung pada label dan node-selector untuk mengelola penerapan pod dalam sebuah cluster.

Membuat Banyak Proses Dalam Pod

Gunakan kemampuan penautan wadah Kubernetes alih-alih mencoba menyelesaikan setiap masalah di dalam wadah. Ini secara efektif menyebarkan beberapa kontainer pada satu pod Kubernetes. Contoh yang baik adalah mengalihdayakan fitur keamanan ke sidecar proxy wadah.

Container yang digabungkan dapat mendukung atau meningkatkan fungsionalitas inti container utama atau membantu container utama beradaptasi dengan lingkungan penerapannya.

Gunakan Init Container

Satu atau lebih wadah init biasanya melakukan tugas utilitas atau pemeriksaan keamanan yang tidak ingin Anda sertakan dalam wadah aplikasi utama. Anda dapat menggunakan wadah init untuk memastikan bahwa layanan sudah siap sebelum memulai wadah utama pod.

Setiap wadah init harus berhasil dijalankan sampai selesai sebelum wadah init berikutnya dimulai. Kontainer init dapat menunda permulaan kontainer utama pod sampai prasyarat terpenuhi. Tanpa prasyarat ini, Kubernetes memulai ulang pod. Setelah prasyarat terpenuhi, penampung init akan berhenti sendiri dan memungkinkan penampung utama untuk memulai.

Hindari Menggunakan Tag Terbaru

Hindari penggunaan tag atau :latest tag saat men-deploy container di lingkungan produksi. Tag terbaru membuat sulit untuk menentukan versi gambar mana yang sedang berjalan.

Cara efektif untuk memastikan penampung selalu menggunakan versi gambar yang sama adalah dengan menggunakan intisari gambar unik sebagai tag. Dalam contoh ini, versi gambar Redis di-deploy menggunakan intisari uniknya:

[email protected]:675hgjfn48324cf93ffg43269ee113168c194352dde3eds876677c5cb

Kubernetes tidak secara otomatis memperbarui versi gambar kecuali Anda mengubah nilai intisari.

Menyiapkan Pemeriksaan Kesiapan dan Keaktifan

Kehidupan dan penyelidikan kesiapan membantu Kubernetes memantau dan menafsirkan kesehatan aplikasi Anda. Jika Anda menentukan pemeriksaan keaktifan dan proses memenuhi persyaratan, Kubernetes akan menghentikan container dan memulai instance baru untuk menggantikannya.

Probe kesiapan melakukan audit pada tingkat pod dan menilai apakah pod dapat menerima lalu lintas. Jika pod tidak merespons, pemeriksaan kesiapan memicu proses untuk memulai ulang pod.

Dokumentasi untuk mengonfigurasi pemeriksaan kesiapan dan keaktifan tersedia di situs web resmi Kubernetes.

Coba Berbagai Jenis Layanan

Dengan mempelajari cara memanfaatkan jenis layanan yang berbeda, Anda dapat mengelola lalu lintas pod internal dan eksternal secara efektif. Tujuan Anda adalah menciptakan lingkungan jaringan yang stabil dengan mengelola titik akhir yang andal seperti IP, port, dan DNS.

Port Statis dengan NodePort

Paparkan pod ke pengguna eksternal dengan mengatur jenis layanan ke NodePort. Jika Anda menentukan nilai di nodePort field, Kubernetes mencadangkan nomor port itu di semua node dan meneruskan semua lalu lintas masuk yang dimaksudkan untuk pod yang merupakan bagian dari layanan. Layanan ini dapat diakses menggunakan IP cluster internal dan IP node dengan port yang dicadangkan.

Pengguna dapat menghubungi layanan NodePort dari luar cluster dengan meminta:

NodeIP:NodePort

Selalu gunakan nomor port dalam rentang yang dikonfigurasi untuk NodePort (30000-32767). Jika transaksi API gagal, Anda perlu memecahkan masalah kemungkinan tabrakan port.

Ingress vs LoadBalancer

Jenis LoadBalancer mengekspos layanan secara eksternal menggunakan penyeimbang beban penyedia Anda. Setiap layanan yang Anda ekspos menggunakan jenis LoadBalancer menerima IP-nya. Jika Anda memiliki banyak layanan, Anda mungkin mengalami biaya tambahan yang tidak direncanakan berdasarkan jumlah layanan yang terpapar.

Persyaratan konfigurasi standar adalah menyediakan pengontrol ingress dengan alamat IP publik statis yang ada. Alamat IP publik statis tetap ada jika pengontrol masuknya dihapus. Pendekatan ini memungkinkan Anda untuk menggunakan catatan DNS dan konfigurasi jaringan saat ini secara konsisten sepanjang siklus hidup aplikasi Anda.

Petakan Layanan Eksternal ke DNS

Jenis ExternalName tidak memetakan layanan ke pemilih tetapi menggunakan nama DNS. Gunakan namaeksternal parameter untuk memetakan layanan dengan menggunakan data CNAME. Data CNAME adalah nama domain yang sepenuhnya memenuhi syarat dan bukan IP numerik.

Klien yang terhubung ke layanan akan melewati proxy layanan dan terhubung ke sumber daya eksternal secara langsung. Dalam contoh ini, pnap-service dipetakan ke admin.phoenixnap.com sumber daya eksternal.

Akses ke layanan pnap bekerja dengan cara yang sama seperti layanan lainnya. Perbedaan penting adalah bahwa pengalihan sekarang terjadi pada tingkat DNS.

Desain Aplikasi

Penerapan container otomatis dengan Kubernetes memastikan bahwa sebagian besar operasi sekarang berjalan tanpa masukan manusia langsung. Rancang aplikasi dan gambar container Anda agar dapat saling dipertukarkan dan tidak memerlukan manajemen mikro yang konstan.

Fokus pada Layanan Individu

Coba pisahkan aplikasi Anda menjadi beberapa layanan dan hindari menggabungkan terlalu banyak fungsi dalam satu wadah. Jauh lebih mudah untuk menskalakan aplikasi secara horizontal dan menggunakan kembali wadah jika mereka fokus melakukan satu fungsi.

Saat membuat aplikasi, anggap container Anda adalah entitas jangka pendek yang akan dihentikan dan dimulai ulang secara berkala.

Gunakan Diagram Helm

Helm, manajer paket aplikasi Kubernetes, dapat menyederhanakan proses instalasi dan menyebarkan sumber daya ke seluruh cluster dengan sangat cepat. Paket aplikasi Helm disebut Charts.

Aplikasi seperti MySQL, PostgreSQL, MongoDB, Redis, WordPress adalah solusi permintaan. Daripada membuat dan mengedit beberapa file konfigurasi yang rumit, Anda dapat menerapkan Diagram Helm yang sudah tersedia.

Gunakan perintah berikut untuk membuat Deployment, Services, PersistentVolumeClaims, dan Secret yang diperlukan untuk menjalankan Kafka Manager di cluster Anda.

helm install --name my-messenger stable/kafka-manager

Anda tidak perlu lagi menganalisis komponen tertentu dan mempelajari cara mengonfigurasinya untuk menjalankan Kafka dengan benar.

Gunakan Afinitas Node dan Pod

Fitur afinitas digunakan untuk mendefinisikan afinitas node dan afinitas antar-pod. Afinitas node memungkinkan Anda untuk menentukan node tempat pod memenuhi syarat untuk dijadwalkan dengan menggunakan label node yang ada.

  • wajibDuringSchedulingIgnoredDuringExecution – Menetapkan batasan wajib yang harus dipenuhi agar pod dijadwalkan ke node.
  • preferredDuringSchedulingIgnoredDuringExecution – Mendefinisikan preferensi yang diprioritaskan oleh penjadwal tetapi tidak menjamin.

Jika label node berubah saat runtime, dan aturan afinitas pod tidak lagi terpenuhi, pod tidak dihapus dari node. nodeSelector parameter membatasi pod ke node tertentu dengan menggunakan label. Dalam contoh ini, pod Grafana akan dijadwalkan hanya pada node yang memiliki ssd label.

Fitur afinitas/anti-afinitas pod memperluas jenis batasan yang dapat Anda ekspresikan. Alih-alih menggunakan label node, Anda dapat menggunakan label pod yang ada untuk menggambarkan node tempat pod dapat dijadwalkan. Fitur ini memungkinkan Anda untuk menetapkan aturan sehingga setiap pod dijadwalkan berdasarkan label dari pod lain.

Node dan Toleransi Node

Kubernetes secara otomatis mencoba men-deploy pod ke lokasi dengan beban kerja terkecil. Afinitas Node dan Pod memungkinkan Anda untuk mengontrol ke node mana pod akan di-deploy. Taints dapat mencegah penyebaran pod ke node tertentu tanpa mengubah pod yang ada. Pod yang ingin Anda gunakan pada node yang tercemar harus memilih untuk menggunakan node tersebut.

  • Kotoran – Mencegah pod baru agar tidak dijadwalkan pada node, menentukan preferensi node, dan menghapus pod yang ada dari sebuah node.
  • Toleransi – Aktifkan pod untuk dijadwalkan hanya pada node dengan Taint yang ada dan cocok.

Taints dan Tolerations menghasilkan hasil yang optimal saat digunakan bersama untuk memastikan bahwa pod dijadwalkan ke node yang sesuai.

Mengelompokkan Sumber Daya dengan Namespaces

Gunakan ruang nama Kubernetes untuk mempartisi cluster besar menjadi grup yang lebih kecil dan mudah diidentifikasi. Ruang nama memungkinkan Anda membuat lingkungan pengujian, QA, produksi, atau pengembangan terpisah dan mengalokasikan sumber daya yang memadai dalam ruang nama yang unik. Nama resource Kubernetes hanya perlu unik dalam satu namespace. Ruang nama yang berbeda dapat memiliki sumber daya dengan nama yang sama.

Jika beberapa pengguna memiliki akses ke cluster yang sama, Anda dapat membatasi pengguna dan mengizinkan mereka untuk bertindak dalam batas namespace tertentu. Memisahkan pengguna adalah cara yang bagus untuk membatasi sumber daya dan menghindari potensi konflik penamaan atau versi.

Namespace adalah resource Kubernetes dan sangat mudah dibuat. Buat file YAML yang mendefinisikan nama namespace dan gunakan kubectl untuk mempostingnya ke server API Kubernetes. Selanjutnya Anda dapat menggunakan namespace untuk mengelola penerapan sumber daya tambahan.


Ubuntu
  1. Pemantauan Docker Containers:Manfaat, Praktik Terbaik, dan Alat yang Harus Dimiliki

  2. Praktik terbaik untuk konfigurasi aturan firewall

  3. Praktik Pengkodean Terbaik untuk Pemrograman Sistem Linux dalam Bahasa C – Bagian 1

  1. Reboot Survival – Praktik Terbaik

  2. Praktik Terbaik Keamanan OpenSSH

  3. Alternatif Skype Terbaik untuk Linux

  1. 7 Alat Linux Terbaik Untuk Seniman Digital

  2. Aplikasi Foto Terbaik Untuk Linux

  3. Praktik terbaik untuk mengamankan notebook secara fisik