Halaman ini memberikan titik awal untuk membantu Anda merencanakan dan merancang pipeline GitOps CI/CD untuk Kubernetes, yang dapat membantu Anda mengoptimalkan Config Sync.
GitOps sendiri merupakan praktik terbaik universal untuk organisasi yang mengelola konfigurasi Kubernetes sebagai skala. Namun, dalam hal merancang solusi itu, Anda memiliki banyak pilihan. Memahami opsi Anda serta manfaat dan konsekuensi dari keputusan tersebut dapat membantu Anda menghindari penulisan ulang arsitektur di masa mendatang.
Anda tidak perlu menggunakan setiap praktik terbaik yang tercantum di halaman ini. Praktik terbaik mana yang Anda pilih untuk diterapkan akan bergantung pada situasi unik Anda. Tujuan halaman ini adalah untuk membantu Anda membuat keputusan yang tepat saat menyiapkan arsitektur GitOps.
Menggunakan repositori paket pribadi yang terpusat
Menggunakan repositori pusat untuk paket publik atau internal (seperti Helm atau kpt
)
dapat membantu tim menemukan paket dengan lebih mudah. Anda dapat menggunakan layanan seperti
Artifact Registry atau repositori Git.
Tim platform dapat menerapkan kebijakan tempat tim aplikasi dapat menggunakan paket hanya dari repositori pusat. Atau, mereka dapat menggunakan repositori pusat sebagai satu set paket yang telah diperiksa.
Anda dapat membatasi izin tulis ke repositori hanya untuk sejumlah kecil engineer. Bagian lain di organisasi dapat memiliki akses baca. Sebaiknya implementasikan proses untuk mempromosikan paket ke repositori pusat dan menyiarkan update.
Tabel berikut mencantumkan manfaat dan kekurangan menggunakan repositori paket pribadi terpusat:
Manfaat |
Kekurangan |
|
|
Membuat repositori basah
Buat repositori dengan output YAML yang sesuai dengan status cluster atau namespace yang diinginkan. Perubahan pada repositori yang basah atau terhidrasi sepenuhnya harus mudah ditinjau menggunakan operasi diff. Praktik yang baik adalah melakukan perubahan hanya pada repositori basah melalui proses peninjauan (misalnya, di GitHub, ini adalah permintaan pull).
Tabel berikut mencantumkan manfaat dan kekurangan membuat repositori basah:
Manfaat |
Kekurangan |
|
|
Geser ke kiri untuk memvalidasi konfigurasi
Menunggu hingga Config Sync mulai disinkronkan untuk memeriksa masalah dapat membuat
commit Git yang tidak diperlukan dan feedback loop yang panjang. Banyak masalah dapat ditemukan
sebelum konfigurasi diterapkan ke cluster dengan menggunakan fungsi validator kpt
seperti
kubeval.
Tabel berikut mencantumkan manfaat dan kekurangan memeriksa masalah sebelum menerapkan konfigurasi:
Manfaat |
Kekurangan |
|
|
Menggunakan folder, bukan cabang
Gunakan folder untuk varian konfigurasi, bukan cabang. Dengan folder,
Anda dapat menggunakan perintah tree
untuk melihat varian. Misalnya, dengan cabang, Anda
tidak dapat mengetahui apakah delta antara cabang prod dan cabang adalah perubahan yang akan datang
dalam konfigurasi atau perbedaan permanen antara seperti apa stage dan produksi
yang seharusnya.
Tabel berikut mencantumkan manfaat dan kekurangan menggunakan folder selain cabang:
Manfaat |
Kekurangan |
|
|
Minimalkan penggunaan ClusterSelectors
ClusterSelectors
memungkinkan Anda menerapkan bagian
konfigurasi tertentu ke subset cluster. Daripada mengonfigurasi RootSync atau RepoSync,
Anda dapat mengubah resource yang sedang diterapkan atau menambahkan label
ke cluster. Namun, seiring waktu, seiring bertambahnya jumlah ClusterSelectors
,
dapat menjadi rumit untuk memahami status akhir cluster.
Dengan Config Sync, Anda dapat menyinkronkan beberapa RootSyncs
dan RepoSyncs
sekaligus, yang berarti Anda dapat menambahkan konfigurasi yang relevan ke repositori terpisah, lalu menyinkronkannya ke cluster yang Anda inginkan.
Tabel berikut mencantumkan manfaat dan kekurangan jika tidak menggunakan ClusterSelectors
:
Manfaat |
Kekurangan |
|
|
Menghindari pengelolaan Tugas dengan Config Sync
Meskipun Config Sync dapat menerapkan Tugas untuk Anda, Tugas tidak cocok untuk deployment GitOps karena alasan berikut:
Kolom yang tidak dapat diubah: Banyak kolom Pekerjaan yang tidak dapat diubah. Untuk mengubah kolom yang tidak dapat diubah, objek harus dihapus dan dibuat ulang. Namun, Config Sync tidak akan menghapus objek Anda kecuali Anda menghapusnya dari sumber.
Menjalankan Tugas yang tidak diinginkan: Jika Anda menyinkronkan Tugas dengan Config Sync lalu Tugas tersebut dihapus dari cluster, Config Sync akan mempertimbangkan penyimpangan tersebut dari status yang Anda pilih dan membuat ulang Tugas tersebut. Jika Anda menetapkan Job time to live (TTL), Tugas akan otomatis dihapus dan Config Sync akan otomatis membuat ulang Tugas tersebut, memulai ulang Tugas, hingga Anda menghapus Tugas dari sumber tepercaya. Sering kali, hal ini bukanlah yang dimaksudkan, karena Config Sync menjalankan Tugas lagi.
Masalah rekonsiliasi: Config Sync biasanya menunggu objek untuk direkonsiliasi setelah diterapkan. Namun, Tugas akan dianggap direkonsiliasi saat sudah mulai berjalan. Ini berarti Config Sync tidak menunggu Tugas selesai sebelum melanjutkan untuk menerapkan objek lain. Namun, jika Tugas nanti gagal, hal tersebut dianggap sebagai kegagalan rekonsiliasi. Dalam beberapa kasus, hal ini dapat memblokir sinkronisasi resource lain dan menyebabkan error sampai Anda memperbaikinya. Dalam kasus lain, sinkronisasi mungkin berhasil dan hanya rekonsiliasi yang gagal.
Karena alasan ini, sebaiknya jangan sinkronkan Tugas dengan Config Sync.
Pada umumnya, Tugas dan tugas situasional lainnya harus dikelola oleh layanan yang menangani pengelolaan siklus prosesnya. Anda kemudian dapat mengelola layanan tersebut dengan Config Sync, bukan Tugas itu sendiri.
Tabel berikut mencantumkan manfaat dan kekurangan jika tidak menggunakan Config Sync untuk mengelola Tugas:
Manfaat |
Kekurangan |
|
|
Menggunakan repositori yang tidak terstruktur
Config Sync mendukung dua struktur untuk mengatur repositori: tidak terstruktur dan hierarkis. Metode ini direkomendasikan karena memungkinkan Anda mengatur repositori dengan cara yang paling nyaman bagi Anda.
Repositori hierarkis, sebagai perbandingan, menerapkan struktur khusus. Misalnya, CRD harus berada dalam direktori tertentu. Hal ini dapat menyebabkan masalah saat Anda
perlu berbagi konfigurasi. Misalnya, jika satu tim memublikasikan paket yang
berisi CRD, tim lain yang perlu menggunakan paket tersebut harus memindahkan
CRD ke direktori cluster
, sehingga menambah overhead ke proses.
Tabel berikut mencantumkan manfaat dan kelemahan menggunakan repositori yang tidak terstruktur:
Manfaat |
Kekurangan |
|
|
Untuk mempelajari cara mengonversi repositori hierarkis, lihat Mengonversi repositori hierarkis menjadi repositori tidak terstruktur.
Kode terpisah dan repositori konfigurasi
Saat meningkatkan skala repositori mono, diperlukan build khusus untuk setiap folder. Izin dan permasalahan bagi orang yang mengerjakan kode dan mengerjakan konfigurasi cluster umumnya berbeda. Dengan memisahkan kode dan repositori konfigurasi, setiap repositori dapat memiliki izin dan strukturnya sendiri.
Tabel berikut mencantumkan manfaat dan kekurangan memisahkan kode dan repositori konfigurasi:
Manfaat |
Kekurangan |
|
|
Menggunakan repositori terpisah untuk mengisolasi perubahan
Saat meningkatkan skala repositori mono, izin yang berbeda diperlukan pada folder yang berbeda. Oleh karena itu, memisahkan repositori memungkinkan batas keamanan antara keamanan, platform, dan konfigurasi aplikasi. Sebaiknya pisahkan repositori produksi dan non-produksi.
Tabel berikut mencantumkan manfaat dan kekurangan dari mengisolasi perubahan di repositori terpisah:
Manfaat |
Kekurangan |
|
|
Menyematkan versi paket
Baik menggunakan Helm maupun Git, Anda harus menyematkan versi paket konfigurasi ke sesuatu yang tidak akan dipindahkan secara tidak sengaja tanpa peluncuran eksplisit.
Tabel berikut mencantumkan manfaat dan kekurangan dari penyematan versi paket:
Manfaat |
Kekurangan |
|
|
Menggunakan Workload Identity
Anda dapat mengaktifkan Workload Identity di cluster GKE, yang memungkinkan workload Kubernetes mengakses layanan Google dengan cara yang aman dan mudah dikelola.
Tabel berikut mencantumkan manfaat dan kekurangan menggunakan Workload Identity:
Manfaat |
Kekurangan |
|
|
Arsitektur tingkat tinggi
Pada tingkat tinggi, Anda mungkin menginginkan setidaknya empat jenis repositori:
- Repositori paket tempat konfigurasi bersama disimpan. Diagram ini juga dapat berupa chart Helm yang disimpan di Artifact Registry.
- Repositori platform tempat tim platform menyimpan konfigurasi seluruh fleet untuk cluster dan namespace.
- Repositori konfigurasi aplikasi.
- Repositori kode aplikasi.
Diagram berikut menunjukkan tata letak repositori ini:
Diagram berikut menunjukkan alur konfigurasi dari kode aplikasi ke repositori konfigurasi aplikasi. Tim pengembangan mengirim kode untuk aplikasi dan konfigurasi aplikasi ke dalam repositori. Kode untuk aplikasi dan konfigurasi disimpan di tempat yang sama dan tim aplikasi memiliki kontrol atas repositori ini. Tim aplikasi kemudian dapat mengirim kode ke dalam build.