بررسی Skaffold برای توسعه Kubernetes

بررسی Skaffold برای توسعه Kubernetes

یک سال و نیم پیش، در 5 مارس 2018، گوگل اولین نسخه آلفای پروژه منبع باز خود را برای CI/CD منتشر کرد. داربست، که هدف آن ایجاد "توسعه ساده و قابل تکرار Kubernetes" بود تا توسعه دهندگان بتوانند به جای مدیریت بر توسعه تمرکز کنند. چه چیزی ممکن است در مورد Skaffold جالب باشد؟ همانطور که مشخص است، چند ترفند در آستین خود دارد که می تواند آن را به ابزاری قدرتمند برای توسعه دهنده و شاید حتی مهندس عملیات تبدیل کند. بیایید با پروژه و قابلیت های آن آشنا شویم.

NB: اتفاقاً ما قبلاً به طور خلاصه در مورد Skaffold در کلیات خود صحبت کرده ایم بررسی ابزارهای توسعه دهنده، که زندگی آنها با Kubernetes مرتبط است.

تئوری. هدف و قابلیت ها

بنابراین، به طور کلی، Skaffold مشکل خودکارسازی چرخه CI/CD (در مراحل ساخت، فشار، استقرار) را حل می‌کند، و بازخورد فوری به توسعه‌دهنده ارائه می‌دهد، یعنی. توانایی دریافت سریع نتیجه تغییرات بعدی کد - به شکل یک برنامه به روز شده در حال اجرا در خوشه Kubernetes. و می تواند در مدارهای مختلف (dev, stage, production...) کار کند که Skaffold به توصیف خطوط لوله مربوطه برای عرضه کمک می کند.

کد منبع Skaffold در Go نوشته شده است، توزیع شده توسط تحت مجوز رایگان آپاچی 2.0 (GitHub).

بیایید به عملکردها و ویژگی های اصلی نگاه کنیم. اولی شامل موارد زیر است:

  • Skaffold ابزارهایی برای ایجاد خطوط لوله CI/CD ارائه می دهد.
  • به شما امکان می‌دهد تغییرات کد منبع را در پس‌زمینه نظارت کنید و یک فرآیند خودکار جمع‌آوری کد در تصاویر کانتینر را اجرا کنید، این تصاویر را در رجیستری Docker منتشر کنید و آنها را در خوشه Kubernetes مستقر کنید.
  • فایل های موجود در مخزن را با دایرکتوری کاری موجود در کانتینر همگام می کند.
  • به طور خودکار با استفاده از Container-Strature-test آزمایش می کند.
  • پورت های فوروارد.
  • گزارش های یک برنامه در حال اجرا در یک ظرف را می خواند.
  • به اشکال زدایی برنامه های نوشته شده در Java، Node.js، Python، Go کمک می کند.

حالا در مورد ویژگی ها:

  • Skaffold خود هیچ جزء سمت خوشه ای ندارد. یعنی نیازی به پیکربندی بیشتر Kubernetes برای استفاده از این ابزار نیست.
  • خطوط لوله مختلف برای برنامه شما. آیا باید در حین توسعه، کد را در Minikube محلی منتشر کنید، و سپس برای مرحله یا تولید؟ برای این منظور وجود دارد پروفایل ها و پیکربندی‌های کاربر، متغیرهای محیطی و پرچم‌ها، که به شما امکان می‌دهد خطوط لوله مختلف را برای یک برنامه توصیف کنید.
  • CLI. فقط ابزار و تنظیمات کنسول در YAML. در اینترنت می توانید ارجاعاتی به تلاش برای ایجاد پیدا کنید رابط کاربری گرافیکی تجربیبا این حال، در حال حاضر این به احتمال زیاد فقط به این معنی است که کسی به او نیاز دارد، اما نه واقعا.
  • مدولار بودن. Skaffold یک دروگر مستقل نیست، اما تلاش می کند تا از ماژول های فردی یا راه حل های موجود برای کارهای خاص استفاده کند.

تصویر دومی:

  • در مرحله مونتاژ می توانید از موارد زیر استفاده کنید:
    • ساخت docker به صورت محلی، در یک کلاستر با استفاده از kaniko یا در Google Cloud Build.
    • بازل به صورت محلی;
    • Jib Maven و Jib Gradle به صورت محلی یا در Google Cloud Build.
    • اسکریپت های ساخت سفارشی به صورت محلی اجرا می شوند. اگر نیاز به اجرای راه حل ساخت دیگری (انعطاف پذیرتر/آشناتر/...) دارید، در اسکریپت توضیح داده شده است تا Skaffold آن را راه اندازی کند (مثال از مستندات). این به شما امکان می دهد از هر مجموعه ای که می توان با استفاده از یک اسکریپت فراخوانی کرد استفاده کرد.
  • در مرحله آزمایش، مواردی که قبلا ذکر شد کانتینر-ساختار-تست;
  • برای استقرار موارد زیر ارائه شده است:
    • کوبکتل;
    • هلم;
    • شخصی سازی.

با تشکر از این، Skaffold را می توان منحصر به فرد نامید چارچوب برای ساخت CI/CD. در اینجا یک نمونه گردش کار هنگام استفاده از آن (از مستندات پروژه) آمده است:

بررسی Skaffold برای توسعه Kubernetes

کار اسکافولد به طور کلی چگونه است؟

  1. این ابزار تغییرات را در دایرکتوری کد منبع نظارت می کند. اگر تغییراتی در فایل‌ها ایجاد شود، آنها با برنامه کاربردی در خوشه Kubernetes همگام می‌شوند. در صورت امکان، بدون مونتاژ مجدد تصویر. در غیر این صورت، یک تصویر جدید مونتاژ می شود.
  2. تصویر مونتاژ شده با استفاده از Container-Strature-test بررسی می شود، برچسب گذاری می شود و به Docker Registry ارسال می شود.
  3. پس از این، تصویر مستقر می شود - مستقر در خوشه Kubernetes.
  4. اگر راه اندازی با استفاده از دستور مقداردهی اولیه شد skaffold dev، سپس ما شروع به دریافت گزارش از برنامه می کنیم و Skaffold منتظر تغییرات می شود تا دوباره همه اقدامات تکرار شوند.

بررسی Skaffold برای توسعه Kubernetes
تصویری از مراحل اصلی عملیات Skaffold

تمرین. امتحان Skaffold

برای نشان دادن استفاده از Skaffold، مثالی از آن می‌آورم مخزن پروژه GitHub... راستی، آنجا شما می توانید نمونه های بسیار دیگری را بیابید که ویژگی های مختلف را در نظر می گیرند. من تمام اقدامات را به صورت محلی در 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 است. یکی از برنامه ها frontend (leeroy-web) است که درخواست را به برنامه دوم - backend (leeroy-app) هدایت می کند. بیایید ببینیم چگونه به نظر می رسد:

~/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. بنابراین در پرونده ها 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

    همانطور که می بینید، اسکافولد خودش تصاویر را تگ کرده است. به هر حال، چندین سیاست برچسب گذاری پشتیبانی می شود.

  • بیشتر در تنظیمات نشان داده شده است context: ./leeroy-app/، یعنی زمینه ای که تصویر در آن جمع آوری شده است مشخص شده است.
  • در مرحله استقرار مشخص می شود که از kubectl و ماسک برای مانیفست های لازم استفاده کنیم.
  • PortForward: شبیه به روشی که معمولاً پورت ها را با استفاده از آن فوروارد می کنیم kubectl port-forward، دستوراتی را به Skaffold می دهیم تا این دستور را فراخوانی کند. در این حالت، پورت محلی 9000 با نام به 8080 در Deployment ارسال می شود leeroy-web.

زمان راه اندازی است skaffold dev: تیم یک "حلقه بازخورد" مستمر ایجاد خواهد کرد، به عنوان مثال. نه تنها همه چیز را جمع‌آوری می‌کند و در خوشه مستقر می‌کند، بلکه در مورد وضعیت غلاف‌ها در لحظه به شما می‌گوید، تغییرات را نظارت می‌کند و وضعیت پادها را به‌روزرسانی می‌کند.

در اینجا نتیجه راه اندازی است skaffold dev --port-forward هنگام مونتاژ مجدد:

بررسی Skaffold برای توسعه Kubernetes

ابتدا می بینید که کش در حال استفاده است. در مرحله بعد، برنامه مونتاژ، مستقر شده و پورت ها ارسال می شوند. از آنجایی که مشخص شده است --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

اضافه کردن نظر