نظرة عامة على Skaffold for Kubernetes Development

نظرة عامة على Skaffold for Kubernetes Development

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

NB: بالمناسبة ، لقد تحدثنا بالفعل باختصار عن سكافولد في جنرالاتنا نظرة عامة على أدوات المطور، الذي ترتبط حياته بـ Kubernetes.

نظرية. الغرض والفرص

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

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

ضع في اعتبارك الوظائف والميزات الرئيسية. تشمل الأولى ما يلي:

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

الآن - حول الميزات:

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

رسم توضيحي لهذا الأخير:

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

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

نظرة عامة على Skaffold for Kubernetes Development

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

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

نظرة عامة على Skaffold for Kubernetes Development
رسم توضيحي للمراحل الرئيسية لعمل سكافولد

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

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

تثبيت 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

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

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 و 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. لذلك ، في الملفات Deployment.yaml هناك خدمة فقط من أجل app (للتوجيه الداخلي). ميناء جراب web سننتقد أنفسنا للوصول السريع إلى التطبيق.

يبدو 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

    كما ترى ، قام Skaffold بتمييز الصور بشكل مستقل. بالمناسبة ، يتم دعم العديد من سياسات وضع العلامات.

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

حان وقت الجري skaffold dev: سيُنشئ الأمر "حلقة ملاحظات" مستمرة ، أي لن يقوم فقط بجمع كل شيء ونشره في الكتلة ، ولكن أيضًا يخبرك عن حالة الكبسولات في الوقت الحالي ، ويراقب التغييرات ويحدث حالة الكبسولات.

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

نظرة عامة على Skaffold for Kubernetes Development

أولاً ، يمكنك أن ترى أن ذاكرة التخزين المؤقت قيد الاستخدام. بعد ذلك - يتم تجميع التطبيق ونشره وإعادة توجيه المنافذ. لأن المحدد --port-forward، أرسل سكافولد المنفذ إلى 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!!!

في الوقت نفسه ، عرض سكافولد نفس الشيء على وحدة التحكم كما كان من قبل ، باستثناء لحظة واحدة: leeroy-app، ليس الكل مرة واحدة.

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

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

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

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

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

اختتام

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

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

PS

اقرأ أيضًا على مدونتنا:

المصدر: www.habr.com

إضافة تعليق