Apa yang dianggap sebagai praktik yang baik dengan K8S untuk mengelola banyak lingkungan (QA, Pementasan, Produksi, Pengembangan, dll)?
Sebagai contoh, katakanlah sebuah tim sedang mengerjakan produk yang memerlukan penerapan beberapa API, bersama dengan aplikasi front-end. Biasanya, ini membutuhkan setidaknya 2 lingkungan:
- Staging: Untuk iterasi / pengujian dan validasi sebelum merilis ke klien
- Produksi: Ini adalah lingkungan yang dapat diakses klien. Harus berisi fitur yang stabil dan teruji dengan baik.
Jadi, dengan asumsi tim menggunakan Kubernetes, praktik apa yang baik untuk menghosting lingkungan ini? Sejauh ini kami telah mempertimbangkan dua opsi:
- Gunakan cluster K8s untuk setiap lingkungan
- Gunakan hanya satu cluster K8 dan simpan di namespace yang berbeda.
(1) Tampaknya pilihan paling aman karena meminimalkan risiko potensi kesalahan manusia dan kegagalan mesin, yang dapat membahayakan lingkungan produksi. Namun, ini disertai dengan biaya mesin master yang lebih banyak dan juga biaya manajemen infrastruktur yang lebih banyak.
(2) Sepertinya ini menyederhanakan infrastruktur dan manajemen penyebaran karena hanya ada satu cluster tunggal tetapi menimbulkan beberapa pertanyaan seperti:
- Bagaimana cara memastikan bahwa kesalahan manusia dapat berdampak pada lingkungan produksi?
- Bagaimana cara memastikan bahwa beban tinggi di lingkungan pementasan tidak akan menyebabkan hilangnya kinerja di lingkungan produksi?
Mungkin ada beberapa masalah lain, jadi saya menghubungi komunitas K8 di StackOverflow untuk mendapatkan pemahaman yang lebih baik tentang bagaimana orang menghadapi tantangan semacam ini.
sumber
Jawaban:
Pertimbangan Beberapa Cluster
Lihatlah posting blog ini dari Vadim Eisenberg ( IBM / Istio ): Daftar Periksa: pro dan kontra penggunaan beberapa klaster Kubernetes, dan bagaimana mendistribusikan beban kerja di antara mereka .
Saya ingin menyoroti beberapa pro / kontra:
Mempertimbangkan lingkungan yang tidak terlalu mahal, dengan pemeliharaan rata-rata, namun tetap memastikan isolasi keamanan untuk aplikasi produksi, saya akan merekomendasikan:
Paritas Lingkungan
Merupakan praktik yang baik untuk menjaga pengembangan, pementasan, dan produksi semirip mungkin:
Gabungkan alat CI / CD yang kuat dengan helm . Anda dapat menggunakan fleksibilitas nilai helm untuk menyetel konfigurasi default, hanya menimpa konfigurasi yang berbeda dari satu lingkungan ke lingkungan lain.
CI / CD GitLab dengan AutoDevops memiliki integrasi yang kuat dengan Kubernetes, yang memungkinkan Anda untuk mengelola beberapa cluster Kubernetes dengan dukungan helm.
Mengelola banyak cluster (
kubectl
interaksi)Untuk mengatasinya:
asdf
untuk mengelola banyakkubectl
versiKUBECONFIG
env var untuk beralih di antara beberapakubeconfig
filekube-ps1
untuk melacak konteks / namespace Anda saat inikubectx
dankubens
untuk mengubah cepat antara cluster / namespaceSaya memiliki artikel yang menunjukkan bagaimana melakukannya: Menggunakan versi kubectl yang berbeda dengan beberapa cluster Kubernetes
Saya juga merekomendasikan bacaan berikut:
sumber
Pasti menggunakan cluster terpisah untuk pengembangan dan membuat gambar buruh pelabuhan sehingga cluster staging / produksi Anda dapat dikunci secara keamanan. Apakah Anda menggunakan cluster terpisah untuk
staging + production
Anda yang memutuskan berdasarkan risiko / biaya - tentu saja memisahkannya akan membantu menghindaristaging
pengaruhproduction
.Saya juga sangat merekomendasikan penggunaan GitOps untuk mempromosikan versi aplikasi Anda di antara lingkungan Anda.
Untuk meminimalkan kesalahan manusia, saya juga menyarankan Anda melihat ke dalam otomatisasi sebanyak yang Anda bisa untuk CI / CD dan promosi Anda.
Berikut adalah demo cara mengotomatiskan CI / CD dengan beberapa lingkungan di Kubernetes menggunakan GitOps untuk promosi antara lingkungan dan Pratinjau Lingkungan pada Permintaan Tarik yang dilakukan langsung di GKE meskipun Jenkins X mendukung sebagian besar cluster kubernetes
sumber
Itu tergantung pada apa yang ingin Anda uji di setiap skenario. Secara umum saya akan mencoba untuk menghindari menjalankan skenario pengujian pada cluster produksi untuk menghindari efek samping yang tidak perlu (dampak kinerja, dll.).
Jika niat Anda adalah menguji dengan sistem pementasan yang persis meniru sistem produksi, saya akan merekomendasikan untuk menjalankan replika cluster lengkap yang tepat dan mematikannya setelah Anda selesai menguji dan memindahkan penerapan ke produksi.
Jika tujuan Anda adalah menguji sistem pementasan yang memungkinkan pengujian aplikasi untuk diterapkan, saya akan menjalankan cluster pementasan yang lebih kecil secara permanen dan memperbarui penerapan (dengan juga versi penyebaran yang diperkecil) sebagaimana diperlukan untuk pengujian berkelanjutan.
Untuk mengontrol cluster yang berbeda, saya lebih suka memiliki mesin ci / cd terpisah yang bukan bagian dari cluster tetapi digunakan untuk menjalankan dan mematikan cluster serta melakukan pekerjaan penerapan, memulai pengujian, dll. Hal ini memungkinkan untuk menyiapkan dan mematikan cluster sebagai bagian dari skenario pengujian otomatis.
sumber
Jelas bahwa dengan menjaga cluster produksi tetap berjalan dari staging, risiko potensi kesalahan yang memengaruhi layanan produksi berkurang. Namun hal ini menimbulkan biaya lebih banyak infrastruktur / manajemen konfigurasi, karena ini membutuhkan setidaknya:
Jangan lupa juga bahwa mungkin ada lebih dari satu lingkungan. Misalnya saya pernah bekerja di perusahaan yang setidaknya ada 3 lingkungan:
Menurut saya kluster sementara / sesuai permintaan masuk akal, tetapi hanya untuk kasus penggunaan tertentu (pengujian beban / kinerja atau integrasi yang sangat «besar» / pengujian ujung-ke-ujung) tetapi untuk lingkungan yang lebih persisten / lengket, saya melihat overhead yang mungkin dikurangi dengan menjalankannya dalam satu cluster.
Saya rasa saya ingin menjangkau komunitas k8s untuk melihat pola apa yang digunakan untuk skenario seperti yang saya jelaskan.
sumber
Kecuali jika kepatuhan atau persyaratan lain menentukan sebaliknya, saya mendukung satu cluster untuk semua lingkungan. Dengan pendekatan ini, poin perhatiannya adalah:
Pastikan Anda juga mengelompokkan node per lingkungan menggunakan label. Anda kemudian dapat menggunakan
nodeSelector
sumber daya on untuk memastikan bahwa mereka berjalan di node tertentu. Ini akan mengurangi kemungkinan (kelebihan) konsumsi sumber daya yang tumpah antar lingkungan.Perlakukan namespace Anda sebagai subnet dan larang semua lalu lintas keluar / masuk secara default. Lihat https://kubernetes.io/docs/concepts/services-networking/network-policies/ .
Memiliki strategi untuk mengelola akun layanan.
ClusterRoleBindings
menyiratkan sesuatu yang berbeda jika cluster menghosting lebih dari satu lingkungan.Gunakan perhatian saat menggunakan alat seperti Helm. Beberapa bagan secara terang-terangan memasang akun layanan dengan izin seluruh kluster, tetapi izin ke akun layanan harus dibatasi pada lingkungan tempat mereka berada.
sumber
Menggunakan beberapa cluster adalah norma, di daftar paling atas untuk menegakkan pemisahan yang kuat antara produksi dan "non-produksi".
Dalam semangat itu, perhatikan bahwa GitLab 13.2 (Juli 2020) sekarang mencakup:
Lihat dokumentasi dan masalah /
sumber
Saya pikir menjalankan satu cluster masuk akal karena mengurangi overhead, pemantauan. Tapi, Anda harus memastikan untuk menempatkan kebijakan jaringan, kontrol akses pada tempatnya.
Kebijakan jaringan - untuk melarang beban kerja dev / qa environment berinteraksi dengan prod / staging store.
Kontrol akses - yang memiliki akses ke sumber daya lingkungan yang berbeda menggunakan ClusterRoles, Roles, dll.
sumber