Skaffold Review for Kubernetes Development



منذ عام ونصف ، في 5 مارس 2018 ، أصدرت Google الإصدار الأول من مشروعها المفتوح المصدر لـ CI / CD الذي يدعى Skaffold ، والذي كان هدفه إنشاء "تطوير بسيط وقابل للتكرار لـ Kubernetes" حتى يتمكن المطورون من التركيز بشكل خاص على التطوير ، و ليس على الإدارة. ما قد يكون موضع اهتمام سكافولد؟ كما اتضح ، لديه بعض الأوراق الرابحة في جعبته ، وبفضل ذلك يمكن أن يصبح أداة قوية لمطور ، وربما مهندس تشغيل. سنتعرف على المشروع وقدراته.

ملحوظة : بالمناسبة ، تحدثنا بالفعل لفترة وجيزة عن سكافولد في نظرتنا العامة للأدوات للمطورين الذين ترتبط حياتهم مع Kubernetes.

النظرية. الغرض والميزات


وبصفة عامة ، يحل Skaffold مشكلة التشغيل التلقائي لدورة CI / CD (في مراحل الإنشاء والدفع والنشر) ، وتقديم ملاحظات سريعة للمطور ، أي القدرة على الحصول بسرعة على نتيجة التغييرات البرمجية التالية - في شكل تطبيق محدث يعمل في نظام Kubernetes. ويمكن أن تعمل في محيطات مختلفة (dev ، stage ، إنتاج ...) ، والتي تساعد Skaffold في وصف خطوط الأنابيب المناسبة لبدء التشغيل.

رمز مصدر Skaffold مكتوب في Go ، ويتم توزيعه بموجب رخصة Apache المجانية 2.0 ( GitHub ).

النظر في الوظائف والميزات الرئيسية. الأول يشمل ما يلي:

  • تقدم Skaffold أدوات لإنشاء خطوط أنابيب CI / CD.
  • يسمح لك بمراقبة التغييرات في التعليمات البرمجية المصدر في الخلفية وبدء العملية التلقائية لبناء التعليمات البرمجية في صور الحاوية ، ونشر هذه الصور في Docker Registry ونشرها على نظام Kubernetes.
  • مزامنة الملفات في المستودع مع دليل العمل في الحاوية.
  • اختبارات تلقائيا باستخدام حاوية اختبار الهيكل.
  • الموانئ إلى الأمام.
  • يقرأ سجلات التطبيق قيد التشغيل في الحاوية.
  • يساعد في تصحيح أخطاء التطبيقات المكتوبة بلغة Java و Node.js و Python و Go.

الآن عن الميزات:

  • Skaffold نفسها لا تحتوي على مكونات جانب الكتلة . أي أنك لست بحاجة إلى تكوين Kubernetes لاستخدام هذه الأداة.
  • خطوط أنابيب مختلفة للتطبيق الخاص بك . هل تحتاج إلى طرح الكود في Minikube المحلي أثناء قيامك بالتطوير ، ثم على المسرح أو الإنتاج؟ للقيام بذلك ، يتم توفير ملفات التعريف وتكوينات المستخدم ومتغيرات البيئة والأعلام ، مما يسمح لك بوصف خطوط أنابيب مختلفة لتطبيق واحد.
  • CLI. وحدة التحكم فقط وتكوينات في YAML. على الشبكة ، يمكنك العثور على مراجع لمحاولات إنشاء واجهة المستخدم الرسومية التجريبية ، ولكن في الوقت الحالي ، ربما يعني هذا فقط أن شخصًا ما يحتاجها ، ولكن ليس في الحقيقة.
  • نمطية . Skaffold ليس مجموعة مستقلة ، ولكنه يسعى إلى استخدام وحدات منفصلة أو حلول موجودة لمهام محددة.

التوضيح الأخير:

  • في مرحلة التجميع ، يمكنك استخدام:
    • عامل بناء بناء محليًا ، في كتلة باستخدام kaniko أو في Google Cloud Build ؛
    • بازيل محليا
    • Jib Maven و Jib Gradle محليًا أو على Google Cloud Build ؛
    • البرامج النصية بناء مخصصة تعمل محليا. إذا كنت بحاجة إلى تشغيل حل آخر (أكثر مرونة / مألوفة / ...) للتجميع ، فيتم وصفه في البرنامج النصي بحيث يعمل Skaffold ( مثال من الوثائق ). يتيح لك ذلك استخدام أي أداة تجميع يمكن استدعاءها باستخدام برنامج نصي ؛
  • في مرحلة الاختبار ، يتم دعم اختبار بنية الحاوية المذكور بالفعل ؛
  • للنشر وتقدم:
    • Kubectl.
    • رأس.
    • kustomize.

بفضل هذا ، يمكن أن يطلق على سكافولد نوعًا من الأطر لبناء CI / CD . فيما يلي مثال لسير العمل عند استخدامه (من وثائق المشروع):



كيف يبدو عمل سكافولد بشكل عام؟

  1. تراقب الأداة المساعدة التغييرات في الدليل المصدر. في حالة إجراء تعديلات على الملفات ، تتم مزامنتها مع جراب التطبيق في نظام Kubernetes. إذا كان ذلك ممكنا ، دون إعادة تجميع الصورة. خلاف ذلك ، صورة جديدة سوف.
  2. يتم فحص الصورة المجمعة باستخدام اختبار بنية الحاوية ، ووضع علامات عليها وإرسالها إلى سجل عامل الميناء.
  3. بعد ذلك ، يتم نشر الصورة - يتم نشرها في كتلة Kubernetes.
  4. إذا تمت تهيئة الإطلاق باستخدام الأمر skaffold dev ، skaffold dev في استلام السجلات من التطبيق ، ويتوقع Skaffold أن تكرر التغييرات جميع الخطوات مرة أخرى.



معالم سكافولد التوضيح

الممارسة. محاولة سكافولد


لإثبات استخدام Skaffold ، سأأخذ مثالاً من مستودع GitHub للمشروع . بالمناسبة ، يمكنك أن تجد العديد من الأمثلة الأخرى التي تأخذ في الاعتبار مختلف التفاصيل. سيتم تنفيذ جميع الإجراءات محليا في Minikube. التثبيت بسيط ويستغرق بضع دقائق ، ويحتاج kubectl للبدء.

تثبيت سكافولد:

 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 

لنستنسخ مستودع سكافولد بالأمثلة الضرورية:

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

لقد اخترت مثالًا مع اثنين من القرون ، يحتوي كل منها على تطبيق صغير على Go. تطبيق واحد هو الواجهة الأمامية (leeroy-web) ، طلب إعادة التوجيه إلى التطبيق الثاني هو الواجهة الخلفية (تطبيق leeroy). دعونا نرى كيف يبدو:

 ~/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 و leeroy-web على رمز Go و Dockerfiles البسيط لإنشاء هذا الرمز محليًا:

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

لن أعطي رمز التطبيق - يكفي أن نعرف أن leeroy-web تقبل الطلبات leeroy-app إلى leeroy-app . لذلك ، توجد في ملفات Deployment.yaml خدمة فقط app (للتوجيه الداخلي). سيتم طرح منفذ جراب web إلينا للوصول السريع إلى التطبيق.

skaffold.yaml تبدو 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 

جميع الخطوات المذكورة أعلاه موصوفة هنا. بالإضافة إلى هذا التكوين ، هناك أيضًا ملف ذو إعدادات عمومية - ~/.skaffold/config . يمكن تحريرها يدويًا أو من خلال CLI - على سبيل المثال ، مثل هذا:

 skaffold config set --global local-cluster true 

يعين هذا الأمر المتغير العام local-cluster إلى true ، وبعد ذلك لن يحاول Skaffold "دفع" الصور إلى السجل البعيد. إذا كنت تتطور محليًا ، فيمكنك استخدام هذا الأمر لإضافة صور محليًا أيضًا.

رجوع إلى skaffold.yaml :

  • في مرحلة 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 

    كما ترون ، قام سكافولد باختبار الصور بشكل مستقل. بالمناسبة ، يتم دعم العديد من سياسات وضع العلامات.
  • تم تحديد ما يلي في context: ./leeroy-app/ التكوين context: ./leeroy-app/ ، أي يتم تحديد السياق الذي يتم فيه تجميع الصورة.
  • في مرحلة النشر ، يتم تحديد أننا سنستخدم kubectl وقناع للبيانات المطلوبة.
  • PortForward : على غرار الطريقة التي نعيد توجيه المنافذ بها عادةً باستخدام kubectl port-forward ، نحن نقدم تعليمات Skaffold لاستدعاء هذا الأمر. في هذه الحالة ، يتم إعادة توجيه المنفذ المحلي 9000 إلى 8080 في النشر مع اسم leeroy-web .

حان الوقت لبدء تشغيل skaffold dev : سيقوم الفريق بإنشاء "حلقة تغذية مرتدة" مستمرة ، أي لا يقتصر الأمر على جمع كل شيء وتثبيت في كتلة ، ولكن أيضا يحكي عن حالة قرون في الوقت الراهن ، سوف يراقب التغييرات وتحديث حالة القرون.

هذه هي نتيجة تشغيل skaffold dev --port-forward عند إعادة التجميع:



أولاً ، من الواضح أنه يتم استخدام ذاكرة التخزين المؤقت. بعد ذلك - يتم تجميع التطبيق ونشره وإعادة توجيه المنافذ. منذ أن تم تحديد --port-forward ، قام Skaffold بإعادة توجيه المنفذ إلى web ، كما هو مطلوب ، لكنه قام بإعادة توجيه app وفقًا لتقديره (اختار الأقرب مجانًا). بعد ذلك ، نحصل على السجلات الأولى من التطبيقات.

تحقق الأداء؟

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

تعديل ملف leeroy-app/app.go - يستغرق الأمر بضع ثوانٍ ... و:

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

في الوقت نفسه ، جلبت Skaffold نفسها إلى وحدة التحكم نفس الشيء كما كان من قبل ، باستثناء نقطة واحدة: لقد تم طرح leeroy-app فقط ، وليس كل ذلك مرة واحدة.

المزيد من الممارسة


تجدر الإشارة إلى أنه عند إنشاء مشروع جديد ، يمكن أن تكون التكوينات لـ Skaffold بمثابة أداة تمهيد باستخدام أمر init ، وهو أمر مريح للغاية. بالإضافة إلى ذلك ، يمكنك كتابة العديد من التهيئة: التطوير على التهيئة الافتراضية ، ثم طرحها على المسرح باستخدام الأمر " run (نفس العملية مثل dev ، لا تتبع التغييرات فقط) ، باستخدام تهيئة مختلفة.

يحتوي Katacoda على برنامج تعليمي مع مثال أكثر بساطة. لكنه يوفر رمل جاهز مع Kubernetes ، والتطبيق و Skaffold. خيار رائع إذا كنت مهتمًا بتجربة الأساسيات بنفسك.

إحدى حالات الاستخدام الممكنة لـ Skaffold هي إجراء تطوير على كتلة بعيدة. لا يشعر الجميع بالراحة عند تشغيل Minikube على أجهزتهم الخاصة ، ثم طرح التطبيق وانتظار أدائه المناسب ... في هذه الحالة ، يحل Skaffold المهمة تمامًا ، والتي يمكن تأكيدها ، على سبيل المثال ، من قبل مهندسي Reddit ، الذين كتبناهم بالفعل على مدونتنا.

وفي هذا المنشور من Weaveworks ، يمكنك العثور على مثال لإنشاء خط أنابيب للإنتاج.

استنتاج


Skaffold هي أداة مناسبة لبناء خطوط الأنابيب التي تتضمن طرح التطبيقات على Kubernetes وتركز بشكل أساسي على احتياجات التطوير. مع ذلك ، من السهل جدًا إنشاء خط أنابيب "قصير" يأخذ في الاعتبار الاحتياجات الأساسية للمطور ، ومع ذلك ، يمكنك ، إذا كنت ترغب في ذلك ، تنظيم عمليات أكثر طموحًا. أحد الأمثلة التوضيحية لاستخدام Skaffold في عمليات CI / CD هو مشروع اختبار لـ 10 خدمات ميكروية تستخدم إمكانيات Kubernetes و gRPC و Istio و OpenCensus Tracing.

تلقى Skaffold بالفعل ما يقرب من 8000 نجمًا على GitHub ، ويتم تطويره بواسطة Google وهو جزء من GoogleContainerTools - بشكل عام ، يوجد في الوقت الحالي كل الأسباب التي تدعو إلى الاعتقاد بأن المشروع سيتطور بسعادة بعد ذلك.

PS


اقرأ أيضًا في مدونتنا:

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


All Articles