כשמשתמשים ב-Google Distributed Cloud בגרסה 1.13.0 ואילך, אפשר לציין שגרות הפעלה כדי להתאים אישית את האתחול של מכונת ה-VM בזמן ההפעלה. אתם יכולים להגדיר את המכונה הווירטואלית כך שתיווצרנה מפתחות SSH, שיווספו משתמשים וסיסמאות, שיוגדרו הגדרות רשת ועוד.
משימות ההפעלה האלה מוגדרות באמצעות cloud-init API או באמצעות startup scripts API (לא שניהם). ההוראות להפעלה מוגדרות בקובץ המניפסט VirtualMachine ב-YAML, והן מופעלות אוטומטית בכל הפעלה של מכונת ה-VM.
דרישות מוקדמות
כדי להגדיר מכונה וירטואלית עם הנחיות הפעלה, צריך לעמוד בדרישות המוקדמות הבאות:
משתמשים במערכת הפעלה מאומתת של Linux לאורחים ומגדירים את הערך
osTypeל-Linuxבמניפסט של המכונה הווירטואלית. מערכות הפעלה אורחות של Windows לא נתמכות ביכולת הזו, כי הן לא תומכות ב-cloud-init.מוודאים ש-cloud-init מותקן במערכת ההפעלה של האורח. רוב מערכות ההפעלה העדכניות של Linux כוללות cloud-init.
בקטעים הבאים מוסבר איך מציינים שגרות הפעלה במניפסט של מכונה וירטואלית באמצעות cloud-init API או סקריפטים להפעלה.
שימוש ב-cloud-init API כדי לאתחל מכונות וירטואליות
Cloud-init משמש בדרך כלל לאתחול של מכונות בענן ולהתאמה אישית של מכונות וירטואליות במהלך ההפעלה. הפעולות שמתבצעות בדרך כלל במהלך האתחול של מכונה וירטואלית כוללות התקנות של חבילות, הגדרת מאגר, יצירת מפתח SSH, כתיבת נתונים לקבצים והגדרת היבטים אחרים של המכונה הווירטואלית. משלבים את קובץ ה-YAML של הגדרות cloud-init במשאב המותאם אישית VirtualMachine באמצעות השדה spec.cloudInit. כשמופעלת מכונת VM, cloud-init קורא את הנתונים שסופקו ומאתחל את ה-VM בהתאם.
חשוב לשים לב לפרטים הבאים לגבי ההטמעה של cloud-init:
מציינים את נתוני cloud-init במניפסט YAML
VirtualMachineכשיוצרים או מעדכנים מכונה וירטואלית. הוראות ליצירת מכונה וירטואלית באמצעות מניפסט מפורטות במאמר הדרכה: יצירה וניהול של מכונת Linux וירטואלית ב-VM Runtime ב-GDC.אנחנו משתמשים ב
NoCloudכמקור הנתונים,spec.cloudInit.noCloud, במפרט של ה-VM.מציינים נתוני משתמשים ונתונים מהרשת בקטעים נפרדים במניפסט
VirtualMachine. השם והמבנה של הקטע תלויים בפורמט הנתונים שבוחרים להשתמש.אפשר לציין את פרטי ההגדרה של cloud-init בפורמטים הבאים של נתונים:
- מחיקת הטקסט
- מחרוזת בקידוד Base64
- סוד ב-Kubernetes
כדי לעזור לכם להתחיל, סיפקנו כמה דוגמאות להגדרות למשימות נפוצות של הפעלת מכונות וירטואליות.
נתוני משתמש של Cloud-init
VM Runtime ב-GDC תומך בנתוני משתמש cloud-init בתחביר cloud-config, לכן צריך להתחיל את נתוני המשתמש ב-#cloud-config. אפשר לעצב את נתוני המשתמש כטקסט רגיל, כמחרוזת מקודדת של Base64 או כסוד של Kubernetes.
מידע נוסף על התחביר של נתוני משתמשים ועל הפניה למודולים זמין במאמרי העזרה של cloud-init.
נתוני משתמש של Cloud-init כטקסט מפורש
במניפסט לדוגמה הבא מוצג איך לציין נתוני משתמש כטקסט מפורש. במקרה הזה, cloud-init מריץ פקודה כשהמכונה הווירטואלית מופעלת:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
runcmd:
- echo hello
נתוני משתמש ב-Cloud-init כמחרוזת בקידוד Base64
בדוגמה הבאה אפשר לראות איך מציינים נתוני משתמש בפורמט מקודד של base64.
בדוגמה הזו, נתוני המשתמשים מורכבים מאותה פקודה echo hello כמו בדוגמה של טקסט מפורש:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userDataBase64: I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSBlY2hvIGhlbGxvCg==
נתוני משתמש של Cloud-init כסוד ב-Kubernetes
בדוגמה הבאה מוצג מניפסט YAML גם ל-VirtualMachine וגם ל-Secret. הקטע spec.cloudInit.noCloud.secretRef בהגדרה VirtualMachine
מציין שנתוני המשתמש של cloud-init נמצאים ב-Kubernetes Secret בשם my-sec. ההגדרה התואמת Secret מציינת את נתוני המשתמש כצמד מפתח-ערך. הערך בקידוד base64 במקרה הזה הוא נתוני המשתמש של cloud-init בתחביר של cloud-config.
בסוד שאליו יש הפניה, משתמשים במפתח הנתונים userData (שמוצג) או userdata כדי לציין את נתוני המשתמש של cloud-init.
בדוגמה הזו, נתוני המשתמשים מורכבים מאותה פקודה echo hello כמו בדוגמה של טקסט מפורש:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
secretRef:
name: my-sec
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: my-sec
data:
userData: I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSBlY2hvIGhlbGxvCg==
אם הסוד שאליו יש הפניה לא נמצא או שמפתח הנתונים userData או userdata לא קיים בסוד, שימו לב להתנהגות הבאה של הפעלת ה-VM:
במהלך יצירת המכונה הווירטואלית, היא עוברת למצב
ErrorConfigurationעם סיבה והודעה מפורטות.במקרים אחרים, המכונה הווירטואלית ממשיכה להשתמש בנתוני המשתמש הישנים של cloud-init עד שהיא מוגדרת בצורה נכונה. כתוצאה מכך, עדכונים של הפעלה או השבתה של סוכן האורח לא נכנסים לתוקף עד שהמכונה הווירטואלית מוגדרת בצורה נכונה.
כדי לאחזר מידע על מכונת ה-VM, כולל נתוני המשתמש של cloud-init שהיו בשימוש, משתמשים בפקודה הבאה:
kubectl get vm VM_NAME -o yaml --kubeconfig KUBECONFIG_PATH
מחליפים את מה שכתוב בשדות הבאים:
VM_NAME: השם של ה-VM.
KUBECONFIG_PATH: הנתיב לקובץ kubeconfig של האשכול שמכיל את מכונת ה-VM.
כדי לאחזר את אירוע האזהרה שקשור ל-Kubernetes, משתמשים ב-kubectl get event
או ב-kubectl describe gvm.
נתוני רשת של Cloud-init
בדומה לנתוני משתמשים, אפשר לעצב את נתוני הרשת כטקסט מפורש, כמחרוזת מקודדת של Base64 או כסוד של Kubernetes. בניגוד לנתוני משתמשים, נתוני רשת לא משתמשים בתחביר של cloud-config.
כשמשתמשים בטקסט רגיל או במחרוזת שמקודדת ב-base64, הגודל המקסימלי המותר הוא 2,048 בייט. אם גודל נתוני המשתמש קרוב ל-2,048 בייט או גדול ממנו, צריך לציין אותו כ-Kubernetes Secret.
מידע נוסף על התחביר של נתוני הרשת ופרטים קשורים זמין במאמר Networking Config Version 2 בתיעוד של cloud-init.
נתוני רשת של Cloud-init כטקסט ברור
קובץ המניפסט הבא מראה איך לציין נתוני רשת כטקסט ברור.
במקרה הזה, cloud-init מפעיל DHCP לכל מכשירי ה-Ethernet עם שמות שמתחילים באות e (e*):
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
runcmd:
- echo hello
networkData: |
version: 2
ethernets:
alleths:
match:
name: e*
dhcp4: true
נתוני רשת של Cloud-init כמחרוזת בקידוד Base64
בדוגמה הבאה מוצג אופן ההגדרה של נתוני רשת בפורמט מקודד Base64. בדוגמה הזו, נתוני הרשת כוללים את אותה הגדרת DHCP שצוינה בדוגמה של טקסט ברור:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
networkDataBase64: dmVyc2lvbjogMgpldGhlcm5ldHM6CiAgYWxsZXRoczoKICAgIG1hdGNoOgogICAgICBuYW1lOiBlKgogICAgZGhjcDQ6IHRydWUK
נתוני רשת של Cloud-init כסוד ב-Kubernetes
בדוגמה הבאה מוצג מניפסט YAML גם ל-VirtualMachine וגם ל-Secret. הקטע spec.cloudInit.noCloud.networkDataSecretRef בהגדרה VirtualMachine מציין שנתוני הרשת של cloud-init נמצאים ב-Kubernetes Secret בשם my-sec. ההגדרה התואמת Secret מציינת את נתוני הרשת כצמד מפתח/ערך. הערך בקידוד Base64 במקרה הזה הוא נתוני הרשת של cloud-init.
בסוד שאליו יש הפניה, משתמשים במפתח הנתונים networkData (כפי שמוצג) או networkdata כדי לציין את נתוני הרשת של cloud-init.
בדוגמה הזו, נתוני הרשת כוללים את אותה הגדרת DHCP שצוינה בדוגמה של טקסט ברור:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
networkDataSecretRef:
name: my-sec
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: my-sec
data:
networkData: dmVyc2lvbjogMgpldGhlcm5ldHM6CiAgYWxsZXRoczoKICAgIG1hdGNoOgogICAgICBuYW1lOiBlKgogICAgZGhjcDQ6IHRydWUK
דוגמאות ל-cloud-init
בקטעים הבאים מופיעות דוגמאות של טקסט ברור לכמה תרחישי שימוש נפוצים באתחול מכונות וירטואליות באמצעות cloud-init:
הגדרת מפתחות SSH מורשים
בדוגמה הבאה של נתוני משתמשים, מפתח ה-SSH המורשה ssh-rsa AAAAB3NzaK8L93bWxnyp מוקצה למשתמש שמוגדר כברירת מחדל.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaK8L93bWxnyp
הוספת משתמש חדש
בדוגמה הבאה של נתוני משתמש נוצר משתמש test וניתנת לו גישת sudo מלאה test. בדוגמה הזו, למשתמש מוקצית סיסמה שלא פגה, pwd.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
users:
- default
- name: test
sudo: ALL=(ALL) NOPASSWD:ALL
chpasswd:
list: |
test:pwd
expire: False
הרצת פקודות בהפעלה הראשונה
בדוגמה הבאה של נתוני משתמשים מריצים פקודה של echo ופקודה של ls. אתם יכולים להשתמש בפקודות כדי להתקין חבילות ועוד כשמכונת ה-VM מופעלת.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
runcmd:
- [ echo, hello ]
- [ ls, -l, / ]
כתיבת קבצים
בדוגמה הבאה של נתוני משתמש, נכתב סקריפט bash לקובץ test בספרייה /var/lib/google של מכונת ה-VM. ההנחיות של cloud-init מגדירות את הרשאות הקובץ לקריאה, כתיבה והרצה (0744) עבור בעלי הקובץ.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
write_files:
- path: /var/lib/google/test
permissions: 0744
content: |
#!/bin/bash
echo hello
פתרון בעיות ב-cloud-init
אם נתקלתם בבעיות באתחול של המכונה הווירטואלית ואתם משתמשים ב-cloud-init, כדאי לבדוק את יומני cloud-init הבאים במכונה הווירטואלית:
/var/log/cloud-init.log: כברירת מחדל, cloud-init כותב ביומן הזה את כל האירועים ברמהDEBUGומעלה.
/var/log/cloud-init-output.log: כברירת מחדל, cloud-init מפנה את stdout ואת stderr מכל השלבים של cloud-init ליומן הזה.
שימוש בסקריפטים לטעינה בזמן ההפעלה כדי לאתחל מכונות וירטואליות
סקריפטים להפעלה מבצעים משימות במהלך תהליך ההפעלה של מופע מכונה וירטואלית (VM). אפשר לציין סקריפט אחד או יותר בקטע spec.startupScripts
במפרט VirtualMachine. אפשר להשתמש בסקריפטים להפעלה כדי לאתחל את המכונה הווירטואלית. הפעולות שמתבצעות בדרך כלל במהלך האתחול של מכונה וירטואלית כוללות התקנות של חבילות, הגדרת מאגר, יצירת מפתח SSH, כתיבת נתונים לקבצים והגדרת היבטים אחרים של המכונה הווירטואלית.
חשוב לשים לב לפרטים הבאים לגבי סקריפטים לטעינה בזמן ההפעלה:
מציינים סקריפטים לטעינה בזמן ההפעלה במניפסט YAML
VirtualMachineכשיוצרים או מעדכנים מכונה וירטואלית. הוראות ליצירת מכונה וירטואלית באמצעות מניפסט מפורטות במאמר הדרכה: יצירה וניהול של מכונת Linux וירטואלית ב-VM Runtime ב-GDC.סקריפטים שצוינו מופעלים בכל פעם שהמכונה הווירטואלית מופעלת.
כוללים
#!/bin/...בחלק העליון של הסקריפט כדי לציין את מפענח הסקריפט. לדוגמה, אפשר לכלול#!/bin/bashכדי להריץ את הסקריפט באמצעות מעטפת Bash.אי אפשר לציין גם הנחיות ל-cloud-init API (
spec.cloudInit) וגם סקריפטים להפעלה (spec.startupScripts) באותו מניפסטVirtualMachine.
פורמטים של סקריפטים
אפשר לציין סקריפטים להפעלה בפורמטים הבאים של נתונים:
- מחיקת הטקסט
- מחרוזת בקידוד Base64
- סוד ב-Kubernetes
חשוב לשים לב לכללים הבאים כשעובדים עם פורמטים שונים של סקריפטים:
כשמשתמשים בטקסט רגיל או במחרוזת עם קידוד base64, הגודל המקסימלי המותר לתוכן הסקריפט הוא 2,048 בייט. אם גודל התוכן של הסקריפט קרוב ל-2,048 בייט או גדול ממנו, צריך לציין את הסקריפטים כסוד של Kubernetes.
כשמשתמשים ב-Kubernetes Secret, צריך להשתמש במפתח הנתונים
scriptב-Secret שאליו יש הפניה כדי לציין את תוכן הסקריפט.אם לא נמצא סוד שמופנה אליו או שמפתח הנתונים
scriptלא קיים בסוד שמופנה אליו, מכונת ה-VM ממשיכה להריץ את הסקריפט. עם זאת, המכונה הווירטואלית לא כותבת או מעדכנת את תוכן הסקריפט. במקרה כזה, אפשר למצוא את אירוע האזהרה של Kubernetes באמצעותkubectl get eventאוkubectl describe gvm.
קובץ המניפסט הבא בפורמט YAML מכיל שלוש סקריפטים, כל אחד בפורמט נתמך אחר.VirtualMachine במקרה הזה, כל סקריפט מריץ את הפקודה echo
hello שמוצגת בmyscript1, בדוגמה של הטקסט הלא מוצפן.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
startupScripts:
- name: myscript1
script: |
#!/bin/bash
echo hello
- name: myscript2
scriptBase64: IyEvYmluL2Jhc2gKICAgICAgZWNobyBoZWxsbwo=
- name: myscript3
scriptSecretRef:
name: my-sec
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: my-sec
data:
script: IyEvYmluL2Jhc2gKICAgICAgZWNobyBoZWxsbwo=
פתרון בעיות בסקריפטים
כדי לבדוק את התוצאות או את היומנים של הסקריפט, מריצים את הפקודה הבאה:
journalctl -u cloud-final
רשומות היומן של סקריפט לטעינה בזמן ההפעלה מתחילות בטקסט הבא:
started to run the command /var/lib/google/startup-scripts/SCRIPT_NAME ...
הרשומה ביומן כוללת את SCRIPT_NAME, השם של סקריפט לטעינה בזמן ההפעלה.