Tinjauan pengembangan Skaffold untuk Kubernetes

Tinjauan pengembangan Skaffold untuk Kubernetes

Satu setengah tahun yang lalu, pada tanggal 5 Maret 2018, Google merilis versi alfa pertama dari proyek Sumber Terbuka untuk CI/CD yang disebut Perancah, yang tujuannya adalah untuk menciptakan “pengembangan Kubernetes yang sederhana dan berulang” sehingga pengembang dapat fokus pada pengembangan daripada administrasi. Apa yang menarik dari Skaffold? Ternyata, ia memiliki beberapa trik yang dapat menjadikannya alat yang ampuh bagi pengembang, dan bahkan mungkin insinyur operasi. Mari berkenalan dengan proyek dan kemampuannya.

NB: Ngomong-ngomong, kita sudah membicarakan secara singkat tentang Skaffold secara umum ulasan alat pengembang, yang hidupnya terhubung dengan Kubernetes.

Teori. Tujuan dan kemampuan

Jadi, secara umum, Skaffold memecahkan masalah otomatisasi siklus CI/CD (pada tahap build, push, deploy), menawarkan umpan balik yang cepat kepada pengembang, yaitu kemampuan untuk dengan cepat menerima hasil perubahan kode selanjutnya - dalam bentuk aplikasi terbaru yang berjalan di cluster Kubernetes. Dan itu dapat bekerja di sirkuit yang berbeda (pengembangan, tahap, produksi...), yang mana Skaffold membantu menjelaskan jalur pipa yang sesuai untuk peluncuran.

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

Mari kita lihat fungsi dan fitur utamanya. Yang pertama meliputi yang berikut:

  • Skaffold menawarkan alat untuk membuat alur CI/CD.
  • Memungkinkan Anda memantau perubahan kode sumber di latar belakang dan menjalankan proses otomatis merakit kode ke dalam image container, memublikasikan image ini di Docker Registry, dan menerapkannya ke cluster Kubernetes.
  • Menyinkronkan file di repositori dengan direktori kerja di container.
  • Secara otomatis menguji menggunakan uji struktur wadah.
  • Port ke depan.
  • Membaca log aplikasi yang berjalan dalam sebuah container.
  • Membantu dalam men-debug aplikasi yang ditulis dalam Java, Node.js, Python, Go.

Sekarang tentang fitur-fiturnya:

  • Skaffold sendiri tidak memiliki komponen sisi cluster. Artinya, tidak perlu mengkonfigurasi Kubernetes lebih lanjut untuk menggunakan utilitas ini.
  • Saluran pipa yang berbeda untuk aplikasi Anda. Apakah Anda perlu meluncurkan kode ke Minikube lokal saat Anda sedang mengembangkan, lalu ke tahap atau produksi? Untuk tujuan ini ada profil dan konfigurasi pengguna, variabel lingkungan, dan tanda, yang memungkinkan Anda mendeskripsikan pipeline berbeda untuk satu aplikasi.
  • CLI. Hanya utilitas konsol dan konfigurasi di YAML. Di Internet Anda dapat menemukan referensi tentang upaya pembuatan GUI eksperimentalNamun, saat ini kemungkinan besar hal ini hanya berarti bahwa seseorang membutuhkannya, tetapi sebenarnya tidak.
  • Modularitas. Skaffold bukanlah pemanen yang berdiri sendiri, namun berusaha menggunakan modul individual atau solusi yang ada untuk tugas tertentu.

Ilustrasi yang terakhir:

  • Pada tahap perakitan Anda dapat menggunakan:
    • buruh pelabuhan membangun secara lokal, dalam 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 khusus dijalankan secara lokal. Jika Anda perlu menjalankan solusi build lain (yang lebih fleksibel/familiar/...), hal ini dijelaskan dalam skrip sehingga Skaffold meluncurkannya (contoh dari dokumentasi). Ini memungkinkan Anda untuk menggunakan kolektor mana pun yang dapat dipanggil menggunakan skrip;
  • Pada tahap pengujian, yang telah disebutkan uji struktur wadah;
  • Untuk penerapan, berikut ini disediakan:
    • Kubectl;
    • Kemudi;
    • menyesuaikan.

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

Tinjauan pengembangan Skaffold untuk Kubernetes

Seperti apa karya Skaffold secara umum?

  1. Utilitas memonitor perubahan dalam direktori kode sumber. Jika ada modifikasi yang dilakukan pada file, file tersebut akan disinkronkan dengan pod aplikasi di cluster Kubernetes. Jika memungkinkan, tanpa memasang kembali gambar tersebut. Jika tidak, gambar baru akan dibuat.
  2. Gambar yang dirakit diperiksa menggunakan uji struktur wadah, diberi tag dan dikirim ke Docker Registry.
  3. Setelah ini, gambar tersebut di-deploy – di-deploy di cluster Kubernetes.
  4. Jika peluncuran diinisialisasi menggunakan perintah skaffold dev, lalu kami mulai menerima log dari aplikasi, dan Skaffold menunggu perubahan untuk mengulangi semua tindakan lagi.

Tinjauan pengembangan Skaffold untuk Kubernetes
Ilustrasi tahapan utama pengoperasian Skaffold

Praktik. Mencoba Skaffold

Untuk mendemonstrasikan penggunaan Skaffold, saya akan mengambil contoh dari Repositori proyek GitHub... Ngomong-ngomong, di sana Anda dapat menemukan banyak contoh lain yang mempertimbangkan berbagai hal spesifik. Saya akan melakukan semua tindakan secara lokal di Minikube. Instalasinya sederhana dan memakan waktu beberapa menit, dan Anda memerlukan kubectl untuk memulai.

Instal 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 mengkloning repositori Skaffold dengan contoh-contoh yang diperlukan:

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

Saya memilih contoh dengan dua pod, masing-masing berisi satu aplikasi Go kecil. Salah satu aplikasi adalah frontend (leeroy-web), yang mengalihkan permintaan ke aplikasi kedua - backend (leeroy-app). Mari kita lihat seperti apa:

~/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 berisi kode Go dan Dockerfile 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 aplikasinya - cukup mengetahuinya leeroy-web menerima permintaan dan memproksikannya leeroy-app. Oleh karena itu di dalam file Deployment.yaml ada Layanan hanya untuk app (untuk perutean internal). Pelabuhan pod web kami akan meneruskannya kepada diri kami sendiri untuk akses cepat ke aplikasi.

Terlihat seperti 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 tahapan 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 akan mengatur variabel global local-cluster ke dalam makna true, setelah itu Skaffold tidak akan mencoba memasukkan gambar ke registri jarak jauh. Jika Anda mengembangkan secara lokal, Anda dapat menggunakan perintah ini untuk membuat image secara lokal.

Kembali ke skaffold.yaml:

  • Diatas panggung build мы указываем, что собрать и сохранить образ нужно локально. После того, как впервые запустится сборка, увидим следующее:
    // т.к. 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 menandai sendiri gambar tersebut. Omong-omong, beberapa kebijakan penandaan didukung.

  • Selanjutnya dalam konfigurasi itu ditunjukkan context: ./leeroy-app/, yaitu. konteks di mana gambar dikumpulkan ditentukan.
  • Pada tahap penerapan, ditentukan bahwa kami akan menggunakan kubectl dan mask untuk manifes yang diperlukan.
  • PortForward: mirip dengan cara kita biasanya meneruskan port menggunakan kubectl port-forward, kami memberikan instruksi kepada Skaffold untuk memanggil perintah ini. Dalam hal ini, port lokal 9000 diteruskan ke 8080 di Deployment dengan nama leeroy-web.

Saatnya untuk meluncurkan skaffold dev: Tim akan membuat “putaran umpan balik” yang berkelanjutan, yaitu tidak hanya akan mengumpulkan semuanya dan menyebarkannya ke cluster, tetapi juga akan memberi tahu Anda tentang status pod saat ini, memantau perubahan, dan memperbarui status pod.

Berikut hasil peluncurannya skaffold dev --port-forward saat merakit kembali:

Tinjauan pengembangan Skaffold untuk Kubernetes

Pertama, Anda dapat melihat bahwa cache sedang digunakan. Selanjutnya, aplikasi dirakit, disebarkan, dan port diteruskan. Sejak ditentukan --port-forward, Skaffold meneruskan port tersebut ke web, seperti yang diminta, tapi di sini app dia melempar sesuai kebijaksanaannya sendiri (pilih yang terdekat dan gratis). Setelah ini, kami menerima log pertama dari aplikasi.

Mari kita periksa apakah itu berhasil?

~/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!!!

Memodifikasi file leeroy-app/app.go - beberapa detik berlalu... 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 menampilkan hal yang sama di konsol seperti sebelumnya, dengan pengecualian satu hal: itu hanya diluncurkan leeroy-app, dan tidak sekaligus.

Lebih banyak latihan

Perlu juga disebutkan bahwa saat membuat proyek baru, konfigurasi untuk Skaffold dapat di-bootstrap menggunakan perintah init, yang sangat nyaman. Selain itu, Anda dapat menulis beberapa konfigurasi: lakukan pengembangan pada konfigurasi default, lalu luncurkan ke tahap dengan perintah run (proses yang sama seperti dev, hanya tidak memantau perubahan), menggunakan konfigurasi yang berbeda.

Di katacoda ada panduan Lebih mudah lagi dengan sebuah contoh. Namun ia menawarkan kotak pasir siap pakai dengan Kubernetes, aplikasi, dan Skaffold. Pilihan yang bagus jika Anda tertarik untuk mencoba sendiri dasar-dasarnya.

Salah satu kemungkinan penggunaan Skaffold adalah melakukan pengembangan pada cluster jarak jauh. Tidak semua orang merasa nyaman menjalankan Minikube di perangkat keras mereka sendiri, kemudian meluncurkan aplikasi dan mengharapkannya berfungsi secara memadai... Dalam hal ini, Skaffold memecahkan masalah dengan sempurna, yang dapat dikonfirmasi, misalnya, oleh para insinyur Reddit, seperti yang kami miliki sudah dibahas писали di blog kita.

Dan di publikasi ini dari Weaveworks Anda dapat menemukan contoh pembuatan saluran pipa untuk produksi.

Kesimpulan

Skaffold adalah alat yang mudah digunakan untuk membangun pipeline yang melibatkan peluncuran aplikasi ke Kubernetes dan terutama berfokus pada kebutuhan pengembangan. Ini membuatnya cukup mudah untuk membuat saluran “pendek” yang memperhitungkan kebutuhan dasar pengembang, tetapi jika diinginkan, Anda dapat mengatur proses yang lebih besar. Sebagai salah satu contoh nyata penggunaan Skaffold dalam proses CI/CD diberikan seperti itu proyek uji dari 10 layanan mikro menggunakan kemampuan Kubernetes, gRPC, Istio, dan OpenCensus Tracing.

Skaffold sudah memiliki hampir 8000+ bintang di GitHub, dikembangkan oleh Google dan merupakan bagian darinya Alat GoogleContainer — secara umum, saat ini ada banyak alasan untuk percaya bahwa proyek ini akan berkembang dengan bahagia selamanya.

PS

Baca juga di blog kami:

Sumber: www.habr.com

Tambah komentar