בדף הזה מוסבר איך לפרוס אפליקציית Windows Server ללא שמירת מצב באשכול Google Kubernetes Engine (GKE). אפשר גם ללמוד איך לפרוס אפליקציית Windows עם שמירת מצב.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את ממשקי ה-API של Artifact Registry ושל Google Kubernetes Engine. הפעלת ממשקי API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-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 הם tainted עם צמד המפתח/ערך הבא: node.kubernetes.io/os=windows:NoSchedule.
ההכתמה הזו עוזרת לוודא שתזמן העבודות של GKE לא ינסה להפעיל קונטיינרים של Linux בצמתים של Windows Server. כדי לתזמן קונטיינרים של Windows Server בצמתים של Windows Server, קובץ המניפסט צריך לכלול את בורר הצמתים הזה:
nodeSelector:
kubernetes.io/os: windows
ווּבהוק (webhook) של הרשאה שפועל באשכול בודק אם יש בעומסי עבודה חדשים את בורר הצמתים של Windows. אם הוא מוצא אותו, הוא מחיל את הטולרנטיות הבאה על עומס העבודה, וכך מאפשר לו לפעול בצמתים של שרת Windows שסומנו כבעייתיים:
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 יש כמה שכבות, והשכבות הבסיסיות מסופקות על ידי מיקרוסופט. שכבות הבסיס מאוחסנות כשכבה חיצונית במקום להיות מוטמעות בתמונה כמו שכבות של תמונת Linux Docker. כשמושכים קובץ אימג' של קונטיינר של 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. הם יכולים גם לשלב בין עומסי עבודה של 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, מוסיפים את בורר הצמתים הבא לעומסי העבודה של Linux:
nodeSelector:
kubernetes.io/os: linux
ההגדרה הזו מספקת הגנה נוספת כדי למנוע תזמון של עומסי עבודה של Linux בצמתי Windows Server במקרה שNoSchedule taint יוסר בטעות מצמתי Windows Server.