Ulasan Skaffold untuk Pengembangan Kubernetes



Setahun setengah yang lalu, pada 5 Maret 2018, Google merilis versi alpha pertama dari proyek Open Source untuk CI / CD yang disebut Skaffold , yang tujuannya adalah untuk menciptakan "pengembangan sederhana dan dapat direproduksi untuk Kubernetes" sehingga pengembang dapat fokus secara khusus pada pengembangan, dan bukan pada administrasi. Apa yang mungkin menarik bagi Skaffold? Ternyata, ia memiliki beberapa kartu truf di lengan bajunya, berkat itu ia dapat menjadi alat yang kuat untuk pengembang, dan mungkin seorang insinyur operasi. Kami akan berkenalan dengan proyek dan kemampuannya.

NB : Ngomong-ngomong, kami sudah berbicara secara singkat tentang Skaffold dalam ikhtisar umum alat kami untuk pengembang yang kehidupannya terhubung dengan Kubernetes.

Teori Tujuan dan fitur


Jadi, secara umum, Skaffold memecahkan masalah mengotomatisasi siklus CI / CD (pada tahap build, push, deploy), menawarkan umpan balik yang cepat kepada pengembang, mis. kemampuan untuk dengan cepat mendapatkan hasil dari perubahan kode selanjutnya - dalam bentuk aplikasi yang diperbarui yang berjalan di kluster Kubernetes. Dan itu dapat bekerja dalam kontur yang berbeda (dev, panggung, produksi ...), yang Skaffold membantu untuk menggambarkan saluran pipa yang tepat untuk peluncuran.

Kode sumber untuk Skaffold ditulis dalam Go, dan didistribusikan di bawah Lisensi Apache 2.0 gratis ( GitHub ).

Pertimbangkan fungsi dan fitur utama. Yang pertama termasuk yang berikut:

  • Skaffold menawarkan alat untuk membuat pipa CI / CD.
  • Memungkinkan Anda untuk memantau perubahan kode sumber di latar belakang dan memulai proses otomatis kode bangunan ke dalam gambar wadah, menerbitkan gambar-gambar ini ke Docker Registry dan menyebarkannya ke kluster Kubernetes.
  • Menyinkronkan file dalam repositori dengan direktori yang berfungsi dalam wadah.
  • Tes secara otomatis menggunakan uji struktur wadah.
  • Port ke depan.
  • Membaca log aplikasi yang berjalan dalam wadah.
  • Membantu dalam men-debug aplikasi yang ditulis dalam Java, Node.js, Python, Go.

Sekarang tentang fitur:

  • Skaffold sendiri tidak memiliki komponen sisi-kluster . Artinya, Anda tidak perlu mengkonfigurasi Kubernetes tambahan untuk menggunakan utilitas ini.
  • Jalur pipa yang berbeda untuk aplikasi Anda . Perlu meluncurkan kode di Minikube lokal saat Anda mengembangkan, dan kemudian di atas panggung atau produksi? Untuk melakukan ini, profil dan konfigurasi pengguna, variabel lingkungan dan flag disediakan, yang memungkinkan Anda untuk menggambarkan saluran pipa yang berbeda untuk satu aplikasi.
  • CLI Hanya utilitas konsol dan konfigurasi di YAML. Pada jaringan Anda dapat menemukan referensi ke upaya untuk membuat GUI eksperimental , tetapi saat ini mungkin hanya berarti bahwa seseorang membutuhkannya, tetapi tidak juga.
  • Modularitas . Skaffold bukan kombinasi independen, tetapi berupaya menggunakan modul terpisah atau solusi yang ada untuk tugas tertentu.

Ilustrasi yang terakhir:

  • Pada tahap perakitan, Anda dapat menggunakan:
    • buruh pelabuhan membangun secara lokal, dalam sebuah cluster menggunakan kaniko atau di Google Cloud Build;
    • Bazel secara lokal;
    • Jib Maven dan Jib Gradle secara lokal atau di Google Cloud Build;
    • skrip build kustom dijalankan secara lokal. Jika Anda perlu menjalankan solusi lain (lebih fleksibel / familiar / ...) untuk perakitan, dijelaskan dalam skrip sehingga Skaffold menjalankannya ( contoh dari dokumentasi ). Ini memungkinkan Anda untuk menggunakan kolektor apa pun yang dapat dipanggil menggunakan skrip;
  • Pada tahap pengujian, uji struktur wadah yang telah disebutkan didukung;
  • Untuk penyebaran disediakan:
    • Kubectl;
    • Helm;
    • menyesuaikan

Berkat ini, Skaffold dapat disebut semacam kerangka kerja untuk membangun CI / CD . Berikut adalah contoh alur kerja saat menggunakannya (dari dokumentasi proyek):



Seperti apa pekerjaan Skaffold secara umum?

  1. Utilitas memonitor perubahan dalam direktori sumber. Jika modifikasi dibuat untuk file, mereka disinkronkan dengan pod aplikasi di kluster Kubernetes. Jika memungkinkan, tanpa memasang kembali gambar. Kalau tidak, gambar baru akan.
  2. Gambar yang dikumpulkan diperiksa menggunakan uji struktur wadah, ditandai dan dikirim ke Docker Registry.
  3. Setelah itu, gambar dikerahkan - ditempatkan di cluster Kubernetes.
  4. Jika peluncuran diinisialisasi menggunakan perintah skaffold dev , maka kami mulai menerima log dari aplikasi, dan Skaffold mengharapkan perubahan untuk mengulangi semua langkah lagi.



Ilustrasi tonggak perancah

Berlatih. Mencoba Skaffold


Untuk mendemonstrasikan penggunaan Skaffold, saya akan mengambil contoh dari repositori GitHub proyek . Ngomong-ngomong, di sana Anda dapat menemukan banyak contoh lain yang mempertimbangkan berbagai spesifik. Semua tindakan akan dilakukan secara lokal di Minikube. Instalasi sederhana dan membutuhkan beberapa menit, dan kubectl diperlukan untuk memulai.

Pasang Skaffold:

 curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 chmod +x skaffold sudo mv skaffold /usr/local/bin skaffold version v0.37.1 

Mari kita tiru repositori Skaffold dengan contoh-contoh yang diperlukan:

 git clone https://github.com/GoogleContainerTools/skaffold cd skaffold/examples/microservices 

Saya memilih contoh dengan dua pod, yang masing-masing berisi satu aplikasi kecil di Go. Satu aplikasi adalah frontend (leeroy-web), permintaan pengalihan ke aplikasi kedua adalah backend (leeroy-app). Mari kita lihat tampilannya:

 ~/skaffold/examples/microservices # tree . ├── leeroy-app │ ├── app.go │ ├── Dockerfile │ └── kubernetes │ └── deployment.yaml ├── leeroy-web │ ├── Dockerfile │ ├── kubernetes │ │ └── deployment.yaml │ └── web.go ├── README.adoc └── skaffold.yaml 4 directories, 8 files 

leeroy-app dan leeroy-web mengandung kode Go dan Dockerfiles sederhana untuk membuat kode ini secara lokal:

 ~/skaffold/examples/microservices # cat leeroy-app/Dockerfile FROM golang:1.12.9-alpine3.10 as builder COPY app.go . RUN go build -o /app . FROM alpine:3.10 CMD ["./app"] COPY --from=builder /app . 

Saya tidak akan memberikan kode aplikasi - cukup untuk mengetahui bahwa leeroy-web menerima permintaan dan leeroy-app dengan leeroy-app . Oleh karena itu, dalam file Deployment.yaml ada Layanan hanya untuk app (untuk routing internal). Port web pod akan dilemparkan kepada kami untuk akses cepat ke aplikasi.

Seperti apa skaffold.yaml :

 ~/skaffold/examples/microservices # cat skaffold.yaml apiVersion: skaffold/v1beta13 kind: Config build: artifacts: - image: leeroy-web context: ./leeroy-web/ - image: leeroy-app context: ./leeroy-app/ deploy: kubectl: manifests: - ./leeroy-web/kubernetes/* - ./leeroy-app/kubernetes/* portForward: - resourceType: deployment resourceName: leeroy-web port: 8080 localPort: 9000 

Semua langkah yang disebutkan di atas dijelaskan di sini. Selain konfigurasi ini, ada juga file dengan pengaturan global - ~/.skaffold/config . Itu dapat diedit secara manual atau melalui CLI - misalnya, seperti ini:

 skaffold config set --global local-cluster true 

Perintah ini menetapkan variabel global local-cluster menjadi true , setelah itu Skaffold tidak akan berusaha 'mendorong' gambar ke dalam registri jauh. Jika Anda mengembangkan secara lokal, Anda dapat menggunakan perintah ini untuk menambahkan gambar secara lokal juga.

Kembali ke skaffold.yaml :

  • Pada tahap build , kami menunjukkan bahwa Anda perlu mengumpulkan dan menyimpan gambar secara lokal. Setelah perakitan dimulai untuk pertama kalinya, kita akan melihat yang berikut:

     // .. Minikube      , //   ,    # minikube ssh $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE leeroy-app 7d55a50803590b2ff62e47e6f240723451f3ef6f8c89aeb83b34e661aa287d2e 7d55a5080359 4 hours ago 13MB leeroy-app v0.37.1-171-g0270a0c-dirty 7d55a5080359 4 hours ago 13MB leeroy-web 5063bfb29d984db1ff70661f17d6efcc5537f2bbe6aa6907004ad1ab38879681 5063bfb29d98 5 hours ago 13.1MB leeroy-web v0.37.1-171-g0270a0c-dirty 5063bfb29d98 5 hours ago 13.1MB 

    Seperti yang Anda lihat, Skaffold menguji gambar secara independen. Omong-omong, beberapa kebijakan pemberian tag didukung.
  • Berikut ini ditentukan dalam context: ./leeroy-app/ konfigurasi context: ./leeroy-app/ , yaitu Konteks di mana gambar dirakit ditentukan.
  • Pada tahap penyebaran, ditentukan bahwa kami akan menggunakan kubectl dan masker untuk manifesto yang diinginkan.
  • PortForward : mirip dengan bagaimana kita biasanya meneruskan port menggunakan kubectl port-forward , kami memberikan instruksi Skaffold untuk memanggil perintah ini. Dalam hal ini, port lokal 9000 diteruskan ke 8080 dalam Penerapan dengan nama leeroy-web .

Saatnya untuk memulai skaffold dev : tim akan membuat "lingkaran umpan balik" yang sedang berlangsung, mis. tidak hanya mengumpulkan semua dan menginstal dalam sebuah cluster, tetapi juga menceritakan tentang status pod saat ini, akan memantau perubahan dan memperbarui status pod.

Berikut ini adalah hasil dari menjalankan skaffold dev --port-forward ketika memasang kembali:



Pertama, jelas bahwa cache sedang digunakan. Berikutnya - aplikasi dirakit, digunakan, port diteruskan. Karena --port-forward ditentukan, Skaffold meneruskan port ke web , seperti yang diminta, tetapi ia meneruskan app dengan kebijakannya sendiri (pilih yang gratisan terdekat). Setelah itu, kami mendapatkan log pertama dari aplikasi.

Periksa kinerja?

 ~/skaffold/examples/microservices # kubectl get po NAME READY STATUS RESTARTS AGE leeroy-app-6998dfcc95-2nxvf 1/1 Running 0 103s leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 103s ~/skaffold/examples/microservices # curl localhost:9000 leeroooooy app!!! 

Ubah file leeroy-app/app.go - dibutuhkan beberapa detik ... dan:

 ~/skaffold/examples/microservices # kubectl get po NAME READY STATUS RESTARTS AGE leeroy-app-ffd79d986-l6nwp 1/1 Running 0 11s leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 4m59s ~/skaffold/examples/microservices # curl localhost:9000 leeroooooy Habr!!! 

Pada saat yang sama, Skaffold sendiri membawa ke konsol hal yang sama seperti sebelumnya, dengan pengecualian satu poin: itu hanya leeroy-app , dan tidak semuanya sekaligus.

Lebih banyak latihan


Perlu disebutkan bahwa saat membuat proyek baru, konfigurasi untuk Skaffold dapat menjadi bootstrap menggunakan perintah init , yang sangat nyaman. Selain itu, Anda dapat menulis beberapa konfigurasi: kembangkan pada konfigurasi default, dan kemudian run ke atas panggung dengan run perintah (proses yang sama seperti dev , tidak mengikuti perubahan), menggunakan konfigurasi yang berbeda.

Katacoda memiliki tutorial dengan contoh yang lebih sederhana. Tetapi ia menawarkan kotak pasir siap pakai dengan Kubernetes, aplikasi dan Skaffold. Pilihan yang bagus jika Anda tertarik untuk mencoba sendiri dasar-dasarnya.

Salah satu use case yang mungkin untuk Skaffold adalah melakukan pengembangan pada cluster jarak jauh. Tidak semua orang merasa nyaman menjalankan Minikube pada perangkat keras mereka sendiri, dan kemudian meluncurkan aplikasi dan menunggu berfungsi dengan baik ... Dalam hal ini, Skaffold menyelesaikan tugas dengan sempurna, yang, misalnya, insinyur Reddit dapat konfirmasi, seperti yang telah kami tulis di blog kami.

Dan dalam publikasi ini dari Weaveworks Anda dapat menemukan contoh membuat pipa untuk produksi.

Kesimpulan


Skaffold adalah alat yang mudah digunakan untuk membangun jaringan pipa yang melibatkan peluncuran aplikasi ke Kubernet dan terutama berfokus pada kebutuhan pengembangan. Dengan itu, cukup mudah untuk membuat pipa "pendek" yang memperhitungkan kebutuhan dasar pengembang, namun, jika Anda mau, Anda dapat mengatur proses yang lebih besar. Salah satu contoh ilustratif menggunakan Skaffold dalam proses CI / CD adalah proyek uji 10 layanan mikro yang menggunakan kemampuan Kubernetes, gRPC, Istio dan OpenCensus Tracing.

Skaffold telah menerima hampir 8000+ bintang di GitHub, sedang dikembangkan oleh Google dan merupakan bagian dari GoogleContainerTools - secara umum, saat ini ada alasan untuk percaya bahwa proyek ini akan berkembang dengan bahagia selamanya.

PS


Baca juga di blog kami:

Source: https://habr.com/ru/post/id474692/


All Articles