סקירה של Skaffold עבור פיתוח Kubernetes

סקירה של Skaffold עבור פיתוח Kubernetes

לפני שנה וחצי, ב-5 במרץ 2018, גוגל הוציאה את גרסת האלפא הראשונה של פרויקט הקוד הפתוח שלה ל-CI/CD בשם סקפולד, שמטרתו הייתה ליצור "פיתוח Kubernetes פשוט וניתן לחזור עליו", כך שמפתחים יוכלו להתמקד בפיתוח ולא בניהול. מה יכול להיות מעניין בסקפולד? כפי שמתברר, יש לו כמה טריקים בשרוול שיכולים להפוך אותו לכלי רב עוצמה עבור המפתח, ואולי אפילו למהנדס התפעול. בואו להכיר את הפרויקט ויכולותיו.

NB: אגב, כבר דיברנו בקצרה על סקאפולד בגנרל שלנו סקירה של כלי מפתחים, שחייו קשורים ל-Kubernetes.

תֵאוֹרִיָה. מטרה ויכולות

אז, באופן כללי, Skaffold פותר את הבעיה של אוטומציה של מחזור ה-CI/CD (בשלבי הבנייה, הדחיפה, הפריסה), ומציע למפתח משוב מהיר, כלומר. היכולת לקבל במהירות את התוצאה של שינויים בקוד הבאים - בצורה של אפליקציה מעודכנת הפועלת באשכול Kubernetes. וזה יכול לעבוד במעגלים שונים (מפתח, שלב, הפקה...), שעבורם Skaffold עוזר לתאר את הצינורות המתאימים להפצה.

קוד המקור של Skaffold כתוב ב-Go, מופץ על ידי תחת התנאים של רישיון Apache החינמי 2.0 (GitHub).

בואו נסתכל על הפונקציות והתכונות העיקריות. הראשונים כוללים את הדברים הבאים:

  • Skaffold מציעה כלים ליצירת צינורות CI/CD.
  • מאפשר לך לעקוב אחר שינויים בקוד המקור ברקע ולהפעיל תהליך אוטומטי של הרכבת קוד לתמונות קונטיינר, פרסום תמונות אלו ב-Docker Registry ופריסה לאשכול Kubernetes.
  • מסנכרן קבצים במאגר עם ספריית העבודה במיכל.
  • בודק אוטומטית באמצעות מבחן-מבנה-container.
  • מעביר יציאות.
  • קורא את היומנים של יישום הפועל במיכל.
  • עוזר באיתור באגים ביישומים שנכתבו ב-Java, Node.js, Python, Go.

עכשיו לגבי התכונות:

  • ל- Skaffold עצמו אין רכיבים בצד האשכול. כלומר, אין צורך להגדיר עוד יותר את Kubernetes לשימוש בכלי השירות הזה.
  • צינורות שונים עבור היישום שלך. האם אתה צריך לגלגל את הקוד ל-Minikube המקומית בזמן שאתה מפתח, ולאחר מכן לבמה או להפקה? למטרה זו יש פרופילים ותצורות משתמש, משתני סביבה ודגלים, המאפשרים לך לתאר צינורות שונים עבור יישום אחד.
  • CLI. רק כלי עזר ותצורות מסוף ב-YAML. באינטרנט ניתן למצוא הפניות לניסיונות יצירה GUI ניסיוני, עם זאת, כרגע זה כנראה רק אומר שמישהו צריך אותו, אבל לא באמת.
  • מודולריות. Skaffold אינו קטיף עצמאי, אלא שואף להשתמש במודולים בודדים או בפתרונות קיימים עבור משימות ספציפיות.

איור של האחרון:

  • בשלב ההרכבה ניתן להשתמש ב:
    • docker לבנות באופן מקומי, באשכול באמצעות kaniko או ב-Google Cloud Build;
    • בזל מקומית;
    • Jib Maven ו-Jib Gradle באופן מקומי או ב-Google Cloud Build;
    • סקריפטים לבנייה מותאמים אישית פועלים באופן מקומי. אם אתה צריך להפעיל פתרון בנייה אחר (גמיש/מוכר/...), הוא מתואר בסקריפט כך ש-Skaffold משיק אותו (דוגמה מתוך תיעוד). זה מאפשר לך להשתמש בכל אספן שניתן לקרוא לו באמצעות סקריפט;
  • בשלב הבדיקה, האמור כבר מיכל-מבנה-מבחן;
  • לפריסה מסופקים הדברים הבאים:
    • קובקטל;
    • הֶגֶה;
    • להתאים אישית.

הודות לכך, סקאפולד יכול להיקרא ייחודי מסגרת לבניית CI/CD. להלן זרימת עבודה לדוגמה בעת השימוש בו (מתוך תיעוד הפרויקט):

סקירה של Skaffold עבור פיתוח Kubernetes

איך נראית העבודה של סקפולד במונחים כלליים?

  1. כלי השירות עוקב אחר שינויים בספריית קוד המקור. אם בוצעו שינויים בקבצים, הם מסונכרנים עם תרמיל היישומים באשכול Kubernetes. אם אפשר, מבלי להרכיב את התמונה מחדש. אחרת, תמונה חדשה מורכבת.
  2. התמונה המורכבת נבדקת באמצעות container-structure-test, מתויגת ונשלחת ל-Docker Registry.
  3. לאחר מכן, התמונה נפרסת - פרוסה באשכול Kubernetes.
  4. אם ההשקה אותחלה באמצעות הפקודה skaffold dev, אז אנחנו מתחילים לקבל יומנים מהאפליקציה, ו-Skaffold מחכה לשינויים כדי לחזור על כל הפעולות שוב.

סקירה של Skaffold עבור פיתוח Kubernetes
איור השלבים העיקריים של פעולת סקפולד

תרגול. מנסה את סקפולד

כדי להדגים את השימוש ב-Skafold, אקח דוגמה מתוך מאגר פרויקטים של GitHub. אגב שם אתה יכול למצוא דוגמאות רבות אחרות שלוקחות בחשבון פרטים שונים. אני אבצע את כל הפעולות באופן מקומי במיניקוב. ההתקנה פשוטה ואורכת מספר דקות, ותזדקק ל-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 אנו מציינים שעליך לאסוף ולשמור את התמונה באופן מקומי. לאחר שה-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 בפריסה עם השם 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, פותחה על ידי גוגל והיא חלק ממנה GoogleContainerTools - באופן כללי, כרגע יש את כל הסיבות להאמין שהפרויקט יתפתח באושר ועושר.

נ.ב.

קרא גם בבלוג שלנו:

מקור: www.habr.com

קנה אירוח אמין לאתרים עם הגנת DDoS, שרתי VPS VDS 🔥 קנה אחסון אתרים אמין עם הגנת DDoS, שרתי VPS VDS | ProHoster