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.