Berbagai lingkungan (Staging, QA, produksi, dll) dengan Kubernetes

121

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:

  1. Gunakan cluster K8s untuk setiap lingkungan
  2. 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.

Yoanis Gil
sumber
2
Bagaimana Anda akhirnya melakukan ini? Tolong bisakah Anda memberi tahu kami ... Saya juga belajar dan mencoba bekerja dengan cara terbaik. Kedengarannya seperti menyiapkan cluster terpisah mungkin adalah cara yang tepat untuk pergi ...
Piotr Kula
3
Kami akhirnya memiliki dua cluster, satu untuk pementasan dan satu lagi untuk produksi. Ada manajemen tambahan dari sudut pandang infrastruktur, tetapi dalam kasus kami, tingkat isolasi tidak sia-sia.
Yoanis Gil
1
@YoanisGil apakah ada jawaban di sini yang dapat Anda tandai sebagai diterima?
tdensmore
3
@tdensmore sebagian besar jawaban bagus dengan caranya sendiri. Masalahnya, tidak ada satu jawaban dan itu tergantung pada kasus penggunaan yang dimaksud. Saya pikir K8 dan komunitasnya telah berkembang pesat sejak saya pertama kali mengajukan pertanyaan ini (hampir 3 tahun sekarang) dan tampaknya ada setidaknya beberapa praktik terbaik minimal yang dapat diterapkan, terlepas dari berapa banyak cluster yang digunakan dan untuk tujuan apa ( Saya memikirkan ruang nama, kebijakan jaringan, pemilih node, seccomp, dll).
Yoanis Gil

Jawaban:

33

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:

Alasan memiliki beberapa cluster

  • Pemisahan produksi / pengembangan / pengujian: terutama untuk menguji versi baru Kubernetes, mesh layanan, dari software cluster lain
  • Kepatuhan: menurut beberapa peraturan, beberapa aplikasi harus berjalan di cluster terpisah / VPN terpisah
  • Isolasi yang lebih baik untuk keamanan
  • Cloud / on-prem: untuk membagi beban antara layanan on-premise

Alasan memiliki satu cluster

  • Kurangi biaya penyiapan, pemeliharaan, dan administrasi
  • Tingkatkan pemanfaatan
  • Pengurangan biaya

Mempertimbangkan lingkungan yang tidak terlalu mahal, dengan pemeliharaan rata-rata, namun tetap memastikan isolasi keamanan untuk aplikasi produksi, saya akan merekomendasikan:

  • 1 cluster untuk DEV dan STAGING (dipisahkan oleh namespace, bahkan mungkin terisolasi, menggunakan Kebijakan Jaringan, seperti di Calico )
  • 1 cluster untuk PROD

Paritas Lingkungan

Merupakan praktik yang baik untuk menjaga pengembangan, pementasan, dan produksi semirip mungkin:

Perbedaan antara layanan dukungan berarti bahwa ketidaksesuaian kecil muncul, menyebabkan kode yang berfungsi dan lulus pengujian dalam pengembangan atau pementasan gagal dalam produksi. Jenis kesalahan ini menciptakan gesekan yang menghalangi penerapan berkelanjutan.

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 ( kubectlinteraksi)

Saat Anda bekerja dengan beberapa cluster Kubernetes, mudah untuk mengacaukan konteks dan berjalan kubectldi cluster yang salah. Selain itu, Kubernetes memiliki batasan untuk membuat versi yang tidak sesuai antara klien ( kubectl) dan server (kubernetes master), jadi menjalankan perintah dalam konteks yang benar tidak berarti menjalankan versi klien yang benar.

Untuk mengatasinya:

  • Gunakan asdfuntuk mengelola banyak kubectlversi
  • SetelKUBECONFIG env var untuk beralih di antara beberapa kubeconfigfile
  • Gunakan kube-ps1untuk melacak konteks / namespace Anda saat ini
  • Gunakan kubectxdankubens untuk mengubah cepat antara cluster / namespace
  • Gunakan alias untuk menggabungkan semuanya

Saya memiliki artikel yang menunjukkan bagaimana melakukannya: Menggunakan versi kubectl yang berbeda dengan beberapa cluster Kubernetes

Saya juga merekomendasikan bacaan berikut:

Eduardo Baitello
sumber
26

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 + productionAnda yang memutuskan berdasarkan risiko / biaya - tentu saja memisahkannya akan membantu menghindari stagingpengaruh production.

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

James Strachan
sumber
1
Tautan tampaknya rusak
Tibin
19

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.

Oswin Noetzelmann
sumber
3
Ini masih diperdebatkan tetapi saya menemukan diskusi ini bermanfaat: groups.google.com/forum/#!topic/kubernetes-users/GPaGOGxCDD8
Indradhanush Gupta
1
Saya memberi suara positif karena menyebutkan dua jenis lingkungan pementasan.
John David
8

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:

  • setidaknya 3 master untuk cluster produksi dan setidaknya satu master untuk penahapan
  • 2 File konfigurasi Kubectl yang akan ditambahkan ke sistem CI / CD

Jangan lupa juga bahwa mungkin ada lebih dari satu lingkungan. Misalnya saya pernah bekerja di perusahaan yang setidaknya ada 3 lingkungan:

  • QA: Di sinilah kami melakukan penerapan harian dan tempat kami melakukan QA internal sebelum merilis ke klien)
  • QA Klien: Di sini kami menerapkan sebelum menerapkan ke produksi sehingga klien dapat memvalidasi lingkungan sebelum merilis ke produksi)
  • Produksi: Di ​​sinilah layanan produksi diterapkan.

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.

Yoanis Gil
sumber
6

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 nodeSelectorsumber 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. ClusterRoleBindingsmenyiratkan 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.

Cochise Ruhulessin
sumber
Bagaimana Anda bisa merencanakan kegagalan pemutakhiran cluster?
Tibin
2

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:

Penerapan beberapa cluster Kubernetes di Core

Penggunaan GitLab untuk men-deploy beberapa cluster Kubernetes dengan GitLab sebelumnya memerlukan lisensi Premium.
Komunitas kami berbicara, dan kami mendengarkan: menerapkan ke beberapa kluster berguna bahkan untuk kontributor individu.
Berdasarkan masukan Anda, mulai di GitLab 13.2, Anda dapat menerapkan ke beberapa grup dan cluster proyek di Core.

https://about.gitlab.com/images/13_2/MultipleProjectClusters.png

Lihat dokumentasi dan masalah /

VonC
sumber
1

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.

Akash Sharma
sumber