בדף הזה מוסבר איך לפרוס אפליקציית Windows Server ללא שמירת מצב באשכול Google Kubernetes Engine (GKE). אפשר גם ללמוד איך לפרוס אפליקציית Windows עם שמירת מצב.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשקי ה-API של Artifact Registry ושל Google Kubernetes Engine. הפעלת ממשקי API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
פריסת אפליקציית Windows Server באשכול עם צמתים ציבוריים
כדי לפרוס אפליקציית Windows Server באשכול GKE עם צמתים ציבוריים בלבד, צריך לבצע את המשימות הבאות:
- יצירת אשכול עם צמתים ציבוריים.
- יוצרים קובץ מניפסט של פריסה.
- יוצרים את הפריסה וחושפים אותה.
- מוודאים שה-Pod פועל.
יצירת אשכול עם צמתים ציבוריים
אם כבר יש לכם אשכול GKE שמשתמש במאגרי צמתים של Windows Server, אפשר להמשיך לשלב הבא. אחרת, יוצרים אשכול באמצעות מאגרי צמתים של Windows Server.
כדי להקצות צמתים עם כתובות IP חיצוניות (צמתים ציבוריים), משתמשים בדגל --no-enable-private-nodes כשיוצרים את האשכול.
יצירת קובץ מניפסט של פריסה
צמתי Windows Server הם מוכתמים בצמד המפתח/ערך הבא: node.kubernetes.io/os=windows:NoSchedule.
ההכתמה הזו עוזרת לוודא שתזמן ה-GKE לא ינסה להריץ קונטיינרים של Linux בצמתים של Windows Server. כדי לתזמן קונטיינרים של Windows Server בצמתים של Windows Server, קובץ המניפסט צריך לכלול את בורר הצמתים הזה:
nodeSelector:
kubernetes.io/os: windows
רכיב webhook של בקרת כניסה שפועל באשכול בודק אם יש עומסי עבודה חדשים שכוללים את בורר הצמתים של Windows. אם הוא מוצא כאלה, הוא מחיל את הסבילות הבאה על עומס העבודה, וכך מאפשר לו לפעול בצמתים של Windows Server עם התיוג:
tolerations:
- effect: NoSchedule
key: node.kubernetes.io/os
operator: Equal
value: windows
במקרים מסוימים, יכול להיות שתצטרכו לכלול את ההגדרה הזו באופן מפורש בקובץ המניפסט. לדוגמה, אם אתם פורסים DaemonSet עם תמונת קונטיינר multi-arch להפעלה בכל הצמתים של Linux ו-Windows Server באשכול, קובץ המניפסט לא יכלול את בורר הצמתים של Windows. צריך לכלול באופן מפורש את הסבילות ל-taint של Windows.
קובץ מניפסט לדוגמה
קובץ הפריסה לדוגמה (iis.yaml) הבא פורס את תמונת ה-IIS של מיקרוסופט לפוד יחיד:
apiVersion: apps/v1
kind: Deployment
metadata:
name: iis
labels:
app: iis
spec:
replicas: 1
selector:
matchLabels:
app: iis
template:
metadata:
labels:
app: iis
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: iis-server
image: mcr.microsoft.com/windows/servercore/iis
ports:
- containerPort: 80
הקובץ הזה מיועד לאשכול שבו כל עומסי העבודה משתמשים באותו סוג ובאותה גרסה של תמונת צומת של Windows Server. פרטים על עבודה עם תמונות של צמתים מעורבים מופיעים בקטע שימוש בתמונות של צמתים מעורבים.
יצירה וחשיפה של הפריסה
יוצרים את קובץ הפריסה שיצרתם בשלב הקודם וחושפים אותו כשירות Kubernetes עם פריסה של מאזן עומסים חיצוני.
כדי ליצור את משאב הפריסה, מריצים את הפקודה הבאה:
kubectl apply -f iis.yamlכדי לחשוף את הפריסה כמאזן עומסים חיצוני, מריצים את הפקודה הבאה:
kubectl expose deployment iis \ --type=LoadBalancer \ --name=iis
איך מוודאים שה-Pod פועל
כדי לוודא שה-Pod פועל, צריך לאמת אותו.
בודקים את הסטטוס של ה-Pod באמצעות הפקודה
kubectl:kubectl get podsמחכים עד שהפלט שמוחזר מראה שהסטטוס של ה-Pod הוא
Running:NAME READY STATUS RESTARTS AGE iis-5c997657fb-w95dl 1/1 Running 0 28sמקבלים את הסטטוס של השירות וממתינים עד שהשדה
EXTERNAL-IPיאוכלס:kubectl get service iisהפלט הבא אמור להתקבל:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE iis LoadBalancer 10.44.2.112 external-ip 80:32233/TCP 17s
עכשיו אפשר להשתמש בדפדפן כדי לפתוח את http://EXTERNAL_IP
ולראות את דף האינטרנט של IIS.
פריסת אפליקציית Windows Server באשכול עם צמתים פרטיים
בקטע הזה נסביר איך פורסים אפליקציית קונטיינר של Windows Server לאשכול GKE שמופעלים בו רק צמתים פרטיים.
לקובצי אימג' של קונטיינרים ב-Windows Server יש כמה שכבות, והשכבות הבסיסיות מסופקות על ידי מיקרוסופט. שכבות הבסיס מאוחסנות כשכבה חיצונית במקום להיות מוטמעות בתמונה כמו שכבות של תמונת Docker של Linux. כשמושכים קובץ אימג' של קונטיינר של Windows Server בפעם הראשונה, בדרך כלל צריך להוריד את שכבות הבסיס משרתי מיקרוסופט. מכיוון שלצמתים פרטיים אין קישוריות לאינטרנט, אי אפשר לשלוף את שכבות הבסיס של מאגר Windows Server ישירות משרתי מיקרוסופט.
כדי להשתמש באשכולות עם צמתים פרטיים מופעלים, אפשר להגדיר את שד ה-Docker כדי לאפשר דחיפה של שכבות שאי אפשר להפיץ למאגרי רישום פרטיים. מידע נוסף זמין במאמר Allow push of non-distributable artifacts בדף GitHub של Docker.
כדי לפרוס את אפליקציית Windows Server לאשכול שמופעלים בו צמתים פרטיים:
- יוצרים אשכול עם צמתים של Windows Server ומפעילים צמתים פרטיים.
- יוצרים קובץ אימג' של Docker לאפליקציית Windows Server.
- פורסים את האפליקציה באשכול שמופעלים בו צמתים פרטיים.
- מוודאים שה-Pod פועל.
יצירת אשכול עם צמתים פרטיים
פועלים לפי ההוראות במאמר יצירת אשכול עם צמתים של Windows Server. כדי להקצות צמתים עם כתובות IP פנימיות בלבד (צמתים פרטיים), משתמשים בדגל --enable-private-nodes כשיוצרים את האשכול.
יצירת קובץ אימג' של Docker לאפליקציית Windows Server
כדי ליצור את קובץ האימג' של Docker, מפעילים מכונה של Compute Engine עם גרסת Windows Server שרוצים להריץ עליה את קונטיינרים של האפליקציה, כמו Windows Server 2019 או Windows Server גרסה 20H2. בנוסף, מוודאים שיש חיבור לאינטרנט.
במכונה של Compute Engine, עוברים להגדרות של Docker daemon:
cat C:\ProgramData\docker\config\daemon.json
כדי לאפשר העלאה של שכבות חיצוניות למאגר הפרטי, מוסיפים את השורות הבאות לקובץ Docker
daemon.json:{ "allow-nondistributable-artifacts": ["REGISTRY_REGION-docker.pkg.dev"] }בדוגמה הזו,
REGISTRY_REGION-docker.pkg.devמתייחס ל-Artifact Registry, שבו יתארח האימג'.מפעילים מחדש את Docker daemon:
Restart-Service docker
יוצרים את קובץ האימג' של Docker לאפליקציה ומוסיפים לו תג:
cd C:\my-app
docker build -t REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2 .
הפקודה הזו מורה ל-Docker ליצור את התמונה באמצעות קובץ ה-Dockerfile בספרייה הנוכחית ולתייג אותה בשם, למשל
us-central1-docker.pkg.dev/my-project/my-repository/my-app:v2.מעבירים בדחיפה את קובץ האימג' של Docker של האפליקציה למאגר Artifact Registry בפרויקט. הגדרת התצורה
allow-nondistributable-artifactsגורמת לשכבות הבסיס של Windows להידחף למאגר הפרטי שלכם.docker push REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
יצירת קובץ מניפסט של פריסה
בהמשך מופיע קובץ מניפסט לדוגמה של פריסה בשם my-app.yaml. התמונה בדוגמה הזו היא התמונה שדחפתם בשלב הקודם (REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2).
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: my-server
image: REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
משתמשים בפקודה
get-credentialsכדי להפעיל אתkubectlלעבודה עם האשכול שיצרתם:gcloud container clusters get-credentials CLUSTER_NAMEמחליפים את
CLUSTER_NAMEבשם האשכול שיצרתם.פורסים את האפליקציה שצוינה בקובץ
my-app.yamlבאשכול:kubectl apply -f my-app.yaml
אימות הפעלת ה-Pod
מציגים את כל ה-Pods כדי לוודא שהאפליקציה פועלת בצורה תקינה:
kubectl get pods
אמור להופיע ה-Pod עם הסטטוס Running כמו בפלט הבא:
NAME READY STATUS RESTARTS AGE
my-app-c95fc5596-c9zcb 1/1 Running 0 5m
שימוש בתמונות של צמתים מעורבים
האשכולות יכולים לכלול מאגרי צמתים עם כמה גרסאות של Windows Server. הם יכולים גם לשלב בין עומסי עבודה (workloads) של Windows Server ו-Linux. בקטעים הבאים מוסבר איך להגדיר את עומסי העבודה לשימוש בסוגי האשכולות האלה.
שימוש בעומסי עבודה עם גרסאות שונות של מערכת הפעלה Windows Server LTSC
צמתים של Windows Server תומכים בתמונות של מערכות הפעלה LTSC2022 ו-LTSC2019. אפשר לציין את גרסת מערכת ההפעלה Windows לשימוש (LTSC2022) באמצעות זוג הערכים הבא במאפיין nodeSelector: cloud.google.com/gke-windows-os-version=2022.
תווית הצומת הזו עוזרת להבטיח שתזמן העבודה של GKE יבחר את הצמתים הנכונים של Windows Server להרצת עומסי עבודה של LTSC2022 או LTSC2019. הצמתים של Windows Server שייכים לסוג התמונה windows_ltsc_containerd. הערך של תווית הצומת יכול להיות 2022 או 2019. אם לא מציינים את התווית של הצומת, אפשר להשתמש בצמתים LTSC2019 או LTSC2022 כדי לתזמן קונטיינרים. כדי לתזמן קונטיינרים של Windows Server רק בצמתים של Windows Server LTSC2022, קובץ המניפסט צריך לכלול את בורר הצמתים הבא:
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_ltsc
cloud.google.com/gke-windows-os-version: 2022
שימוש בעומסי עבודה עם גרסאות שונות של Windows Server
אם אתם צריכים להריץ מאגרי צמתים של Windows Server עם כמה גרסאות LTSC שונות, מומלץ ליצור את תמונות הקונטיינר כתמונות מרובות ארכיטקטורות שיכולות לפעול בכל הגרסאות של Windows Server שנמצאות בשימוש באשכול.
התווית של צומת gke-os-distribution לא מספיקה כדי למנוע את האפשרות שעומסי העבודה שלכם יתוזמנו לצמתים לא תואמים.
שימוש בעומסי עבודה של Linux ו-Windows Server באשכול
מוסיפים את בורר הצמתים הבא לעומסי העבודה של Linux כדי לוודא שהם תמיד מתוזמנים לצמתים של Linux:
nodeSelector:
kubernetes.io/os: linux
ההגדרה הזו מספקת הגנה נוספת כדי למנוע תזמון של עומסי עבודה של Linux בצמתים של Windows Server במקרה שNoScheduleההגדרה taint הוסרה בטעות מהצמתים של Windows Server.