Kajian semula Skaffold untuk pembangunan Kubernetes

Kajian semula Skaffold untuk pembangunan Kubernetes

Setahun setengah yang lalu, pada 5 Mac 2018, Google mengeluarkan versi alfa pertama projek Sumber Terbukanya untuk CI/CD yang dipanggil Skaffold, yang matlamatnya adalah untuk mencipta "pembangunan Kubernetes yang mudah dan boleh diulang" supaya pembangun boleh menumpukan pada pembangunan dan bukannya pentadbiran. Apa yang menarik tentang Skaffold? Ternyata, ia mempunyai beberapa helah yang boleh menjadikannya alat yang berkuasa untuk pembangun, dan mungkin juga jurutera operasi. Mari kita berkenalan dengan projek dan keupayaannya.

NB: By the way, kami telah bercakap secara ringkas tentang Skaffold dalam umum kami semakan alat pembangun, yang hidupnya dihubungkan dengan Kubernetes.

Teori. Tujuan dan keupayaan

Jadi, secara amnya, Skaffold menyelesaikan masalah mengautomasikan kitaran CI/CD (pada peringkat binaan, tolak, pasang), menawarkan maklum balas segera pembangun, i.e. keupayaan untuk menerima dengan cepat hasil perubahan kod berikutnya - dalam bentuk aplikasi dikemas kini yang berjalan dalam kelompok Kubernetes. Dan ia boleh berfungsi dalam litar yang berbeza (dev, peringkat, pengeluaran...), yang mana Skaffold membantu untuk menerangkan saluran paip yang sepadan untuk pelancaran.

Kod sumber Skaffold ditulis dalam Go, diedarkan oleh di bawah Lesen Apache percuma 2.0 (GitHub).

Mari lihat fungsi dan ciri utama. Yang pertama termasuk yang berikut:

  • Skaffold menawarkan alat untuk mencipta saluran paip CI/CD.
  • Membolehkan anda memantau perubahan dalam kod sumber di latar belakang dan menjalankan proses automatik memasang kod ke dalam imej bekas, menerbitkan imej ini dalam Pendaftaran Docker dan mengaturnya ke gugusan Kubernetes.
  • Menyegerakkan fail dalam repositori dengan direktori kerja dalam bekas.
  • Uji secara automatik menggunakan ujian-struktur bekas.
  • Port ke hadapan.
  • Membaca log aplikasi yang berjalan dalam bekas.
  • Membantu dalam penyahpepijatan aplikasi yang ditulis dalam Java, Node.js, Python, Go.

Sekarang tentang ciri-ciri:

  • Skaffold sendiri tidak mempunyai komponen sisi kelompok. Iaitu, tidak perlu lagi mengkonfigurasi Kubernetes untuk menggunakan utiliti ini.
  • Saluran paip yang berbeza untuk permohonan anda. Adakah anda perlu melancarkan kod ke Minikube tempatan semasa anda sedang membangun, dan kemudian ke pentas atau pengeluaran? Untuk tujuan ini terdapat profil dan konfigurasi pengguna, pembolehubah persekitaran dan bendera, yang membolehkan anda menerangkan saluran paip yang berbeza untuk satu aplikasi.
  • CLI. Hanya utiliti konsol dan konfigurasi dalam YAML. Di Internet anda boleh mencari rujukan kepada percubaan untuk mencipta GUI percubaan, walau bagaimanapun, pada masa ini kemungkinan besar ini hanya bermakna seseorang memerlukannya, tetapi tidak sebenarnya.
  • Modulariti. Skaffold bukan penuai kendiri, tetapi berusaha untuk menggunakan modul individu atau penyelesaian sedia ada untuk tugas tertentu.

Ilustrasi yang terakhir:

  • Pada peringkat pemasangan anda boleh menggunakan:
    • docker build secara tempatan, dalam kelompok menggunakan kaniko atau dalam Google Cloud Build;
    • Bazel secara tempatan;
    • Jib Maven dan Jib Gradle secara setempat atau dalam Google Cloud Build;
    • skrip binaan tersuai dijalankan secara tempatan. Jika anda perlu menjalankan penyelesaian binaan lain (lebih fleksibel/biasa/...), ia diterangkan dalam skrip supaya Skaffold melancarkannya (contoh dari dokumentasi). Ini membolehkan anda menggunakan mana-mana pengumpul yang boleh dipanggil menggunakan skrip;
  • Pada peringkat ujian, yang telah disebutkan ujian-struktur bekas;
  • Untuk penempatan perkara berikut disediakan:
    • Kubectl;
    • Helm;
    • menyesuaikan.

Terima kasih kepada ini, Skaffold boleh dipanggil unik rangka kerja untuk membina CI/CD. Berikut ialah contoh aliran kerja apabila menggunakannya (daripada dokumentasi projek):

Kajian semula Skaffold untuk pembangunan Kubernetes

Apakah rupa kerja Skaffold dari segi umum?

  1. Utiliti memantau perubahan dalam direktori kod sumber. Jika pengubahsuaian dibuat pada fail, ia disegerakkan dengan pod aplikasi dalam kelompok Kubernetes. Jika boleh, tanpa memasang semula imej. Jika tidak, imej baharu dipasang.
  2. Imej yang dipasang disemak menggunakan ujian-struktur bekas, ditanda dan dihantar ke Pendaftaran Docker.
  3. Selepas ini, imej itu digunakan - digunakan dalam kelompok Kubernetes.
  4. Jika pelancaran dimulakan menggunakan arahan skaffold dev, kemudian kami mula menerima log daripada aplikasi, dan Skaffold menunggu perubahan untuk mengulangi semua tindakan sekali lagi.

Kajian semula Skaffold untuk pembangunan Kubernetes
Ilustrasi peringkat utama operasi Skaffold

berlatih. Mencuba Skaffold

Untuk menunjukkan penggunaan Skaffold, saya akan mengambil contoh daripada Repositori projek GitHub... Ngomong-ngomong, di sana Anda boleh menemui banyak contoh lain yang mengambil kira pelbagai spesifik. Saya akan melakukan semua tindakan secara tempatan dalam Minikube. Pemasangan adalah mudah dan mengambil masa beberapa minit, dan anda memerlukan kubectl untuk bermula.

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

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

Saya memilih contoh dengan dua pod, setiap satu mengandungi satu aplikasi Go kecil. Satu aplikasi ialah bahagian hadapan (leeroy-web), yang mengubah hala permintaan ke aplikasi kedua - bahagian belakang (leeroy-app). Mari lihat bagaimana rupanya:

~/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 mengandungi kod Go dan Dockerfiles mudah untuk membina kod ini secara tempatan:

~/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 kod aplikasi - cukup untuk mengetahuinya leeroy-web menerima permintaan dan memberikan proksi kepada mereka leeroy-app. Oleh itu dalam fail Deployment.yaml terdapat Perkhidmatan hanya untuk app (untuk penghalaan dalaman). Port pod web kami akan memajukannya kepada diri kami sendiri untuk akses cepat kepada aplikasi.

Nampaknya 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 peringkat yang dinyatakan di atas diterangkan di sini. Sebagai tambahan kepada konfigurasi ini, terdapat juga fail dengan tetapan global - ~/.skaffold/config. Ia boleh diedit secara manual atau melalui CLI - contohnya, seperti ini:

skaffold config set --global local-cluster true

Perintah ini akan menetapkan pembolehubah global local-cluster menjadi makna true, selepas itu Skaffold tidak akan cuba menolak imej ke daftar jauh. Jika anda membangun secara tempatan, anda boleh menggunakan arahan ini untuk membina imej secara setempat.

Kembali kepada skaffold.yaml:

  • Di atas pentas build kami menyatakan bahawa anda perlu mengumpul dan menyimpan imej secara setempat. Selepas binaan dijalankan buat kali pertama, kita akan melihat perkara 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 menandakan imej itu sendiri. By the way, beberapa dasar penandaan disokong.

  • Selanjutnya dalam konfigurasi ia ditunjukkan context: ./leeroy-app/, iaitu konteks di mana imej dikumpulkan ditentukan.
  • Pada peringkat penggunaan, ditentukan bahawa kami akan menggunakan kubectl dan topeng untuk manifes yang diperlukan.
  • PortForward: sama seperti cara kami biasanya memajukan port menggunakan kubectl port-forward, kami memberi arahan kepada Skaffold untuk memanggil arahan ini. Dalam kes ini, port tempatan 9000 dimajukan ke 8080 dalam Deployment dengan nama leeroy-web.

Sudah tiba masanya untuk dilancarkan skaffold dev: Pasukan akan membuat "gelung maklum balas" yang berterusan, i.e. ia bukan sahaja akan mengumpul segala-galanya dan mengerahkannya ke kluster, tetapi juga akan memberitahu anda tentang keadaan pod pada masa ini, memantau perubahan dan mengemas kini keadaan pod.

Berikut adalah hasil pelancaran skaffold dev --port-forward apabila memasang semula:

Kajian semula Skaffold untuk pembangunan Kubernetes

Pertama, anda boleh melihat bahawa cache sedang digunakan. Seterusnya, aplikasi dipasang, digunakan, dan port dimajukan. Sejak dinyatakan --port-forward, Skaffold memajukan port ke web, seperti yang ditanya, tetapi di sini app dia melontar mengikut budi bicaranya sendiri (memilih yang percuma yang terdekat). Selepas ini, kami menerima log pertama daripada aplikasi.

Mari semak sama ada ia berfungsi?

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

Mengubah suai fail leeroy-app/app.go - beberapa saat 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 masa yang sama, Skaffold sendiri memaparkan perkara yang sama dalam konsol seperti sebelum ini, kecuali satu titik: ia hanya dilancarkan leeroy-app, dan bukan sekali gus.

Lebih banyak latihan

Perlu juga disebut bahawa apabila membuat projek baharu, konfigurasi untuk Skaffold boleh di-bootstrap menggunakan arahan init, yang sangat mudah. Di samping itu, anda boleh menulis beberapa konfigurasi: menjalankan pembangunan pada konfigurasi lalai, dan kemudian melancarkan ke pentas dengan arahan run (proses yang sama seperti dev, hanya tidak memantau perubahan), menggunakan konfigurasi yang berbeza.

Pada katacoda ada panduan Ia lebih mudah dengan contoh. Tetapi ia menawarkan kotak pasir siap pakai dengan Kubernetes, aplikasi dan Skaffold. Pilihan yang bagus jika anda berminat untuk mencuba perkara asas sendiri.

Satu kes penggunaan yang mungkin untuk Skaffold adalah untuk menjalankan pembangunan pada kelompok jauh. Tidak semua orang selesa menjalankan Minikube pada perkakasan mereka sendiri, kemudian melancarkan aplikasi dan mengharapkan ia berfungsi dengan secukupnya... Dalam kes ini, Skaffold menyelesaikan masalah dengan sempurna, yang boleh disahkan, sebagai contoh, oleh jurutera Reddit, seperti yang kami ada sudah dibincangkan писали dalam blog kami.

Dan dalam penerbitan ini daripada Weaveworks anda boleh mendapatkan contoh mencipta saluran paip untuk pengeluaran.

Kesimpulan

Skaffold ialah alat mudah untuk membina saluran paip yang melibatkan pelancaran aplikasi kepada Kubernetes dan tertumpu terutamanya pada keperluan pembangunan. Ia menjadikannya agak mudah untuk membuat saluran paip "pendek" yang mengambil kira keperluan asas pembangun, tetapi jika dikehendaki, anda boleh mengatur proses yang lebih besar. Sebagai salah satu contoh jelas penggunaan Skaffold dalam proses CI/CD diberikan apa-apa projek ujian daripada 10 perkhidmatan mikro menggunakan keupayaan Kubernetes, gRPC, Istio dan Pengesanan OpenCensus.

Skaffold sudah mempunyai hampir 8000+ bintang di GitHub, dibangunkan oleh Google dan merupakan sebahagian daripada GoogleContainerTools — secara amnya, pada masa ini terdapat banyak sebab untuk mempercayai bahawa projek itu akan berkembang dengan gembira selama-lamanya.

PS

Baca juga di blog kami:

Sumber: www.habr.com

Tambah komen