Apa itu Kubernetes? Panduan untuk Kontainerisasi dan Penerapan
Diterbitkan: 2022-03-11Beberapa waktu yang lalu, kami menggunakan aplikasi web monolit: basis kode besar yang tumbuh dalam fungsi dan fitur baru hingga berubah menjadi raksasa yang besar, bergerak lambat, dan sulit dikelola. Sekarang, semakin banyak pengembang, arsitek, dan pakar DevOps yang berpendapat bahwa lebih baik menggunakan layanan mikro daripada monolit raksasa. Biasanya, menggunakan arsitektur berbasis layanan mikro berarti membagi monolit Anda menjadi setidaknya dua aplikasi: aplikasi front-end dan aplikasi back-end (API). Setelah keputusan untuk menggunakan layanan mikro, muncul pertanyaan: Di lingkungan apa yang lebih baik untuk menjalankan layanan mikro? Apa yang harus saya pilih untuk membuat layanan saya stabil serta mudah dikelola dan diterapkan? Jawaban singkatnya adalah: Gunakan Docker!
Dalam artikel ini, saya akan memperkenalkan Anda ke container, menjelaskan Kubernetes, dan mengajari Anda cara membuat container dan men-deploy aplikasi ke cluster Kubernetes menggunakan CircleCI.
Buruh pelabuhan? Apa itu Doker?
Docker adalah alat yang dirancang untuk membuat DevOps (dan hidup Anda) lebih mudah. Dengan Docker, pengembang dapat membuat, menerapkan, dan menjalankan aplikasi dalam wadah . Wadah memungkinkan pengembang untuk mengemas aplikasi dengan semua bagian yang dibutuhkannya, seperti perpustakaan dan dependensi lainnya, dan mengirimkan semuanya sebagai satu paket.
Menggunakan wadah, pengembang dapat dengan mudah (kembali) menerapkan gambar ke OS apa pun. Cukup instal Docker, jalankan perintah, dan aplikasi Anda aktif dan berjalan. Oh, dan jangan khawatir tentang inkonsistensi dengan versi baru perpustakaan di OS host. Selain itu, Anda dapat meluncurkan lebih banyak wadah di host yang sama—apakah itu aplikasi yang sama atau lainnya? Tidak masalah.
Sepertinya Docker adalah alat yang luar biasa. Tetapi bagaimana dan di mana saya harus meluncurkan kontainer?
Ada banyak opsi tentang bagaimana dan di mana menjalankan container: AWS Elastic Container Service (AWS Fargate atau instans yang dicadangkan dengan penskalaan otomatis horizontal dan vertikal); instance cloud dengan gambar Docker yang telah ditentukan sebelumnya di Azure atau Google Cloud (dengan template, grup instance, dan penskalaan otomatis); di server Anda sendiri dengan Docker; atau, tentu saja, Kubernetes! Kubernetes dibuat khusus untuk virtualisasi dan container oleh para insinyur Google pada tahun 2014.
Kubernet? Apa itu?
Kubernetes adalah sistem sumber terbuka yang memungkinkan Anda menjalankan container, mengelolanya, mengotomatiskan penerapan, menskalakan penerapan, membuat dan mengonfigurasi ingress, menerapkan aplikasi stateless atau stateful, dan banyak hal lainnya. Pada dasarnya, Anda dapat meluncurkan satu atau beberapa instance dan menginstal Kubernetes untuk mengoperasikannya sebagai cluster Kubernetes. Kemudian dapatkan titik akhir API dari cluster Kubernetes, konfigurasikan kubectl
(alat untuk mengelola cluster Kubernetes) dan Kubernetes siap untuk ditayangkan.
Jadi mengapa saya harus menggunakannya?
Dengan Kubernetes, Anda dapat memanfaatkan sumber daya komputasi secara maksimal. Dengan Kubernetes, Anda akan menjadi kapten kapal Anda (infrastruktur) dengan Kubernetes mengisi layar Anda. Dengan Kubernetes, layanan Anda akan menjadi HA. Dan yang paling penting, dengan Kubernetes, Anda akan menghemat banyak uang.
Terlihat menjanjikan! Apalagi jika itu akan menghemat uang! Mari kita bicarakan lebih lanjut!
Kubernetes semakin populer hari demi hari. Mari kita masuk lebih dalam dan menyelidiki apa yang ada di bawah tenda.
Di Balik Terpal: Apa itu Kubernetes?
Kubernetes adalah nama untuk keseluruhan sistem, tetapi seperti mobil Anda, ada banyak bagian kecil yang bekerja sama dalam harmoni yang sempurna untuk membuat Kubernetes berfungsi. Mari kita pelajari apa itu mereka.
Master Node – Panel kontrol untuk seluruh cluster Kubernetes. Komponen master dapat dijalankan pada setiap node di cluster. Komponen kuncinya adalah:
- Server API: Titik masuk untuk semua perintah REST, satu-satunya komponen Master Node yang dapat diakses pengguna.
- Datastore: Penyimpanan nilai kunci yang kuat, konsisten, dan sangat tersedia yang digunakan oleh cluster Kubernetes.
- Penjadwal: Mengawasi pod yang baru dibuat dan menetapkannya ke node. Penyebaran pod dan layanan ke node terjadi karena penjadwal.
- Manajer pengontrol: Menjalankan semua pengontrol yang menangani tugas rutin di cluster.
- Node pekerja: Agen node primer, juga disebut node antek. Pod dijalankan di sini. Node pekerja berisi semua layanan yang diperlukan untuk mengelola jaringan antar kontainer, berkomunikasi dengan node master, dan menetapkan sumber daya ke kontainer yang dijadwalkan.
- Docker: Berjalan di setiap node pekerja dan mengunduh gambar dan memulai wadah.
- Kubelet: Memantau status pod dan memastikan container aktif dan berjalan. Itu juga berkomunikasi dengan penyimpanan data, mendapatkan informasi tentang layanan dan menulis detail tentang yang baru dibuat.
- Kube-proxy: Proxy jaringan dan penyeimbang beban untuk layanan pada satu node pekerja. Ini bertanggung jawab untuk perutean lalu lintas.
- Kubectl: Alat CLI bagi pengguna untuk berkomunikasi dengan server API Kubernetes.
Apa itu pod dan layanan?
Pod adalah unit terkecil dari cluster Kubernetes, seperti satu bata di dinding sebuah bangunan besar. Pod adalah sekumpulan kontainer yang perlu dijalankan bersama dan dapat berbagi sumber daya (ruang nama Linux, cgroup, alamat IP). Pod tidak dimaksudkan untuk hidup lama.
Layanan adalah abstraksi di atas sejumlah pod, biasanya membutuhkan proxy di atas agar layanan lain dapat berkomunikasi dengannya melalui alamat IP virtual.
Contoh Penerapan Sederhana
Saya akan menggunakan aplikasi Ruby on Rails sederhana dan GKE sebagai platform untuk menjalankan Kubernetes. Sebenarnya, Anda dapat menggunakan Kubernetes di AWS atau Azure atau bahkan membuat cluster di perangkat keras Anda sendiri atau menjalankan Kubernetes secara lokal menggunakan minikube
—semua opsi yang akan Anda temukan di halaman ini.
File sumber untuk aplikasi ini dapat ditemukan di repositori GitHub ini.
Untuk membuat aplikasi Rails baru, jalankan:
rails new blog
Untuk mengkonfigurasi koneksi MySQL untuk produksi di file config/database.yml file
:
production: adapter: mysql2 encoding: utf8 pool: 5 port: 3306 database: <%= ENV['DATABASE_NAME'] %> host: 127.0.0.1 username: <%= ENV['DATABASE_USERNAME'] %> password: <%= ENV['DATABASE_PASSWORD'] %>
Untuk membuat model Artikel, pengontrol, tampilan, dan migrasi, jalankan:
rails g scaffold Article title:string description:text
Untuk menambahkan permata ke Gemfile:
gem 'mysql2', '< 0.6.0', '>= 0.4.4' gem 'health_check'
Untuk membuat gambar Docker, ambil Dockerfile saya dan jalankan:
docker build -t REPO_NAME/IMAGE_NAME:TAG . && docker push REPO_NAME/IMAGE_NAME:TAG
Saatnya membuat cluster Kubernetes. Buka halaman GKE dan buat cluster Kubernetes. Saat cluster dibuat, klik “Connect button” dan salin perintah—pastikan Anda memiliki alat gCloud CLI (caranya) dan kubectl terinstal dan terkonfigurasi. Jalankan perintah yang disalin pada PC Anda dan periksa koneksi ke cluster Kubernetes; jalankan kubectl cluster-info
.
Aplikasi siap untuk diterapkan ke cluster k8s. Mari kita membuat database MySQL. Buka halaman SQL di konsol gCloud dan buat instance MySQL DB untuk aplikasi tersebut. Saat instance siap, buat pengguna dan DB dan salin nama koneksi instance .

Selain itu, kita perlu membuat kunci akun layanan di halaman API & Layanan untuk mengakses DB MySQL dari wadah sespan. Anda dapat menemukan info lebih lanjut tentang proses itu di sini. Ganti nama file yang diunduh menjadi service-account.json
. Kami akan kembali lagi nanti ke file itu.
Kami siap untuk men-deploy aplikasi kami ke Kubernetes, tetapi pertama-tama, kami harus membuat rahasia untuk aplikasi kami—objek rahasia di Kubernetes yang dibuat untuk menyimpan data sensitif. Unggah file service-account.json
yang diunduh sebelumnya:
kubectl create secret generic mysql-instance-credentials \ --from-file=credentials.json=service-account.json
Buat rahasia untuk aplikasi:
kubectl create secret generic simple-app-secrets \ --from-literal=username=$MYSQL_PASSWORD \ --from-literal=password=$MYSQL_PASSWORD \ --from-literal=database-name=$MYSQL_DB_NAME \ --from-literal=secretkey=$SECRET_RAILS_KEY
Jangan lupa untuk mengganti nilai atau mengatur variabel lingkungan dengan nilai Anda.
Sebelum membuat penerapan, mari kita lihat file penerapan. Saya menggabungkan tiga file menjadi satu; bagian pertama adalah layanan yang akan mengekspos port 80 dan meneruskan semua koneksi yang datang ke port 80 ke 3000. Layanan ini memiliki pemilih yang dengannya layanan mengetahui pod mana yang harus meneruskan koneksi.
Bagian selanjutnya dari file adalah deployment, yang menjelaskan strategi deployment—container yang akan diluncurkan di dalam pod, variabel lingkungan, resource, probe, mount untuk setiap container, dan informasi lainnya.
Bagian terakhir adalah Horizontal Pod Autoscaler. HPA memiliki konfigurasi yang cukup sederhana. Ingatlah bahwa jika Anda tidak menyetel sumber daya untuk penampung di bagian penerapan, HPA tidak akan berfungsi.
Anda dapat mengonfigurasi Vertical Autoscaler untuk cluster Kubernetes Anda di halaman edit GKE. Ini juga memiliki konfigurasi yang cukup sederhana.
Saatnya mengirimkannya ke cluster GKE! Pertama-tama, kita harus menjalankan migrasi melalui pekerjaan. Menjalankan:
kubectl apply -f rake-tasks-job.yaml
– Pekerjaan ini akan berguna untuk proses CI/CD.
kubectl apply -f deployment.yaml
– untuk membuat layanan, penerapan, dan HPA.
Kemudian periksa pod Anda dengan menjalankan perintah: kubectl get pods -w
NAME READY STATUS RESTARTS AGE sample-799bf9fd9c-86cqf 2/2 Running 0 1m sample-799bf9fd9c-887vv 2/2 Running 0 1m sample-799bf9fd9c-pkscp 2/2 Running 0 1m
Sekarang mari kita buat sebuah ingress untuk aplikasi:
- Buat IP statis:
gcloud compute addresses create sample-ip --global
- Buat ingress (file):
kubectl apply -f ingress.yaml
- Periksa apakah ingress telah dibuat dan ambil IP:
kubectl get ingress -w
- Buat domain/subdomain untuk aplikasi Anda.
CI/CD
Mari membuat pipa CI/CD menggunakan CircleCI. Sebenarnya, mudah untuk membuat pipa CI/CD menggunakan CircleCI, tetapi perlu diingat, proses penyebaran otomatis yang cepat dan kotor tanpa tes seperti ini akan bekerja untuk proyek-proyek kecil, tapi tolong jangan lakukan ini untuk sesuatu yang serius karena , jika ada kode baru yang bermasalah dalam produksi, Anda akan kehilangan uang. Itulah mengapa Anda harus berpikir tentang merancang proses penerapan yang kuat, meluncurkan tugas canary sebelum peluncuran penuh, memeriksa kesalahan dalam log setelah canary dimulai, dan seterusnya.
Saat ini, kami memiliki proyek kecil dan sederhana, jadi mari kita buat proses penerapan CI/CD yang sepenuhnya otomatis, tanpa pengujian. Pertama, Anda harus mengintegrasikan CircleCI dengan repositori Anda—Anda dapat menemukan semua petunjuknya di sini. Kemudian kita harus membuat file konfigurasi dengan instruksi untuk sistem CircleCI. Konfigurasi terlihat cukup sederhana. Poin utamanya adalah ada dua cabang di repo GitHub: master
dan production
.
- Cabang master adalah untuk pengembangan, untuk kode baru. Saat seseorang memasukkan kode baru ke cabang master, CircleCI memulai alur kerja untuk cabang master—membangun dan menguji kode.
- Cabang produksi adalah untuk menyebarkan versi baru ke lingkungan produksi. Alur kerja untuk cabang produksi adalah sebagai berikut: dorong kode baru (atau lebih baik lagi, buka PR dari cabang master ke produksi) untuk memicu proses pembuatan dan penerapan baru; selama build, CircleCI membuat image Docker baru, mendorongnya ke GCR dan membuat peluncuran baru untuk penerapan; jika peluncuran gagal, CircleCI memicu proses rollback.
Sebelum menjalankan build apa pun, Anda harus mengonfigurasi proyek di CircleCI. Buat akun layanan baru di API dan halaman Layanan di GCloud dengan peran ini: akses penuh ke GCR dan GKE, buka file JSON yang diunduh dan salin konten, lalu buat variabel lingkungan baru di pengaturan proyek di CircleCI dengan nama GCLOUD_SERVICE_KEY
dan rekatkan konten file akun layanan sebagai nilai. Selain itu, Anda perlu membuat env vars berikutnya: GOOGLE_PROJECT_ID
(Anda dapat menemukannya di beranda konsol GCloud), GOOGLE_COMPUTE_ZONE
(zona untuk cluster GKE Anda), dan GOOGLE_CLUSTER_NAME
(nama cluster GKE).
Langkah terakhir (deploy) di CircleCI akan terlihat seperti:
kubectl patch deployment sample -p '{"spec":{"template":{"spec":{"containers":[{"name":"sample","image":"gcr.io/test-d6bf8/simple:'"$CIRCLE_SHA1"'"}]}}}}' if ! kubectl rollout status deploy/sample; then echo "DEPLOY FAILED, ROLLING BACK TO PREVIOUS" kubectl rollout undo deploy/sample # Deploy failed -> notify slack else echo "Deploy succeeded, current version: ${CIRCLE_SHA1}" # Deploy succeeded -> notify slack fi deployment.extensions/sample patched Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 2 of 3 updated replicas are available... Waiting for deployment "sample" rollout to finish: 2 of 3 updated replicas are available... deployment "sample" successfully rolled out Deploy succeeded, current version: 512eabb11c463c5431a1af4ed0b9ebd23597edd9
Kesimpulan
Sepertinya proses membuat cluster Kubernetes baru tidak terlalu sulit! Dan proses CI/CD benar-benar luar biasa!
Ya! Kubernetes luar biasa! Dengan Kubernetes, sistem Anda akan lebih stabil, mudah dikelola, dan akan menjadikan Anda kapten sistem Anda. Belum lagi, Kubernetes sedikit mempermainkan sistem dan akan memberikan +100 poin untuk pemasaran Anda!
Sekarang setelah Anda memiliki dasar-dasarnya, Anda dapat melangkah lebih jauh dan mengubahnya menjadi konfigurasi yang lebih canggih. Saya berencana untuk membahas lebih banyak di artikel mendatang, tetapi sementara itu, inilah tantangannya: Buat cluster Kubernetes yang kuat untuk aplikasi Anda dengan DB stateful yang terletak di dalam cluster (termasuk Pod sespan untuk membuat cadangan), instal Jenkins di dalam cluster Kubernetes yang sama untuk pipeline CI/CD, dan biarkan Jenkins menggunakan pod sebagai slave untuk build. Gunakan certmanager untuk menambahkan/mendapatkan sertifikat SSL untuk ingress Anda. Buat sistem pemantauan dan peringatan untuk aplikasi Anda menggunakan Stackdriver.
Kubernetes hebat karena mudah diskalakan, tidak ada penguncian vendor, dan, karena Anda membayar untuk instans, Anda menghemat uang. Namun, tidak semua orang adalah pakar Kubernetes atau memiliki waktu untuk menyiapkan cluster baru—untuk pandangan alternatif, sesama Toptaler Amin Shah Gilani membuat kasus untuk menggunakan Heroku, GitLab CI, dan sejumlah besar otomatisasi yang sudah dia ketahui untuk menulis lebih banyak kode dan melakukan lebih sedikit tugas operasi di Cara Membuat Pipeline Penerapan Awal yang Efektif .
- Lakukan Matematika: Penskalaan Otomatis Aplikasi Microservices dengan Orchestrator
- K8s/Kubernetes: AWS vs. GCP vs. Azure
- Perbandingan Mesh Layanan Kubernetes