
לפני שנה וחצי, ב-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. באינטרנט ניתן למצוא הפניות לניסיונות יצירה , עם זאת, כרגע זה כנראה רק אומר שמישהו צריך אותו, אבל לא באמת.
- מודולריות. Skaffold אינו קטיף עצמאי, אלא שואף להשתמש במודולים בודדים או בפתרונות קיימים עבור משימות ספציפיות.
איור של האחרון:
- בשלב ההרכבה ניתן להשתמש ב:
- docker לבנות באופן מקומי, באשכול באמצעות kaniko או ב-Google Cloud Build;
- בזל מקומית;
- Jib Maven ו-Jib Gradle באופן מקומי או ב-Google Cloud Build;
- סקריפטים לבנייה מותאמים אישית פועלים באופן מקומי. אם אתה צריך להפעיל פתרון בנייה אחר (גמיש/מוכר/...), הוא מתואר בסקריפט כך ש-Skaffold משיק אותו (). זה מאפשר לך להשתמש בכל אספן שניתן לקרוא לו באמצעות סקריפט;
- בשלב הבדיקה, האמור כבר ;
- לפריסה מסופקים הדברים הבאים:
- קובקטל;
- הֶגֶה;
- להתאים אישית.
הודות לכך, סקאפולד יכול להיקרא ייחודי מסגרת לבניית CI/CD. להלן זרימת עבודה לדוגמה בעת השימוש בו (מתוך תיעוד הפרויקט):

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

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

ראשית, אתה יכול לראות שהמטמון נמצא בשימוש. לאחר מכן, האפליקציה מורכבת, נפרסת ויציאות מועברות. מאז שצוין --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, פותחה על ידי גוגל והיא חלק ממנה - באופן כללי, כרגע יש את כל הסיבות להאמין שהפרויקט יתפתח באושר ועושר.
נ.ב.
קרא גם בבלוג שלנו:
- «";
- «";
- «";
- «".
מקור: www.habr.com
