יצירת קובצי אימג' מרובי-ארכיטקטורה של Windows Server

במדריך הזה נדגים איך לנהל את המורכבות של ניהול הגרסאות של יצירת תמונות שמיועדות לכמה גרסאות של Windows Server. לקונטיינרים של Windows Server יש דרישות תאימות לגרסה שמונעות הפעלה של קונטיינרים ביותר מגרסה אחת של מארח Windows Server. עם זאת, Docker ב-Windows Server תומך בתמונות של קונטיינרים מרובי-ארכיטקטורה (או מרובי-פלטפורמה) שיכולות לפעול בכמה גרסאות של Windows Server.

בעזרת תמונות מרובות ארכיטקטורות, אתם יכולים לשדרג את מאגרי הצמתים של Windows Server ב-Google Kubernetes Engine ‏ (GKE) לגרסת Windows Server המועדפת עליכם בלי לבנות מחדש את התמונה ולשנות את מפרטי ה-Pod. לדוגמה:

  • גרסה 1.15 של GKE תומכת ב-Windows Server 1809
  • גרסה 1.16 של GKE תומכת ב-Windows Server 1909

כדי לשדרג מגרסת GKE אחת לגרסה מאוחרת יותר באופן אוטומטי, צריך ליצור תמונות מרובות ארכיטקטורות עבור עומסי העבודה של Windows. כדי ליצור קובץ אימג' עם תמיכה בכמה ארכיטקטורות, צריך ליצור קובץ אימג' לכל גרסה של Windows Server, ואז ליצור מניפסט שמפנה לקובצי האימג' האלה לכל גרסה של Windows Server. אם אתם רוצים שליטה מלאה בתהליך היצירה והבנייה של התמונות, אתם יכולים ליצור אותן ידנית. לחלופין, אפשר להשתמש ב-Cloud Build כדי ליצור באופן אוטומטי את תמונות ה-multi-arch של Windows Server.

מטרות

במדריך הזה נסביר איך ליצור תמונות מרובות ארכיטקטורות של Windows Server באופן ידני או באמצעות Cloud Build.

  • יוצרים את התמונות באופן ידני:

    • יוצרים 2 קובצי אימג' של Docker עם גרסאות או סוגים שונים של Windows Server, למשל Long-Term Servicing Channel ‏ (LTSC) 2019 ו-LTSC 2022.
    • יוצרים מכונה וירטואלית של Windows Server.
    • יוצרים קובץ מניפסט ומעבירים אותו בדחיפה למאגר.
  • יוצרים את קובצי האימג' באמצעות Cloud Build:

    • מכינים את הסביבה על ידי יצירת פרויקט, הפעלת ממשקי API והענקת הרשאות.
    • יוצרים אפליקציה, קובצי Dockerfile וקובצי build.
    • מריצים פקודה כדי ליצור את התמונה.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.

לפני שמתחילים

לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:

  1. מתקינים את Google Cloud CLI כדי להריץ פקודות gcloud.
  2. מתקינים את Docker כדי ליצור קונטיינרים.
  3. מתקינים את Go כדי ליצור קבצים בינאריים של Windows Server.
  4. במדריך הזה נעשה שימוש ב-Artifact Registry כמאגר. מוודאים שיצרתם את המאגר ב-Docker.

יצירת תמונות מרובות ארכיטקטורות באופן ידני

כשיוצרים קובצי אימג' עם תמיכה במספר ארכיטקטורות באופן ידני, אפשר ליצור קובץ אימג' שכולל את כל הגרסאות של Windows Server שאתם צריכים. כדי ליצור תמונה מרובת ארכיטקטורות באופן ידני:

  1. יצירת קובץ אימג' של Docker LTSC 2019 עם ארכיטקטורה יחידה. פרטים על יצירת תמונות Docker מופיעים במאמר פריסת אפליקציית Windows Server. לדוגמה, us-docker.pkg.dev/my-project/docker-repo/foo:1.0-2019.
  2. יצירת קובץ אימג' של Docker LTSC 2022 עם ארכיטקטורה יחידה. לדוגמה, us-docker.pkg.dev/my-project/docker-repo/foo:1.0-2022
  3. יוצרים מכונה וירטואלית של Windows Server, למשל גרסה 20H2. מדריך למתחילים לשימוש במכונה וירטואלית של Windows Server
  4. משתמשים ב-RDP כדי להתחבר ל-VM.
  5. פותחים חלון PowerShell כדי להריץ את הפקודות בשלבים הבאים.
  6. מפעילים את התכונה הניסיונית docker manifest. מניפסט של Docker הוא רשימה של קובצי אימג' לדחיפה למאגר:

    PS C:\> $env:DOCKER_CLI_EXPERIMENTAL = 'enabled'
    
  7. יוצרים את מניפסט מרובה הארכיטקטורות:

    docker manifest create `
      REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0 `
      REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-2019 `
      REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-2022 `
    
  8. מעלים את מניפסט התמונה החדש עם כמה ארכיטקטורות למאגר שלכם ב-Artifact Registry:

     docker manifest push `
       REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0
    
  9. כדי לוודא שהתמונה מרובת הארכיטקטורות נוצרה והועלתה בהצלחה, עוברים אל REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo ולוחצים על התמונה. יופיעו 3 תמונות:

    • foo:1.0-2019
    • foo:1.0-2022
    • foo:1.0-20h2
    • foo:1.0

עכשיו אפשר להפנות לתמונה מרובת ארכיטקטורות REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0 במפרטי ה-Pod. כך תוכלו להשתמש בשדרוג אוטומטי של מאגרי צמתים של GKE Windows בצורה בטוחה.

יצירת קובצי אימג' מרובי-ארכיטקטורה באמצעות Cloud Build gke-windows-builder

כדי להקל על השלבים של בנייה ידנית, אפשר להשתמש ב-gke-windows-builder שמבוסס על gke-windows-builder של OSS. אפשר להשתמש ב-gke-windows-builder עם Cloud Build כדי ליצור באופן אוטומטי קובצי אימג' של Windows Server מרובי-ארכיטקטורה. מערכת GKE מעדכנת את כלי ה-builder כך שיכלול גרסאות חדשות של Windows LTSC נתמכות כשהן יוצאות. יתרון נוסף בשימוש בכלי הוא שלא צריך ליצור מכונה וירטואלית של Windows עם Powershell כדי לבנות את התמונות. מכונת ה-VM של Windows מוחלפת בקונטיינר של Docker שמריץ את הפקודות בשבילכם ב-Cloud Build.

כדי להבין איך הכלי לבניית תמונות פועל, אפשר לעקוב אחרי הדוגמה הזו כדי לבנות תמונה מרובת ארכיטקטורות של 'שלום עולם'. אפשר לבצע את השלבים האלה בשרתי Linux או Windows.

הכנת הסביבה

כדי להכין את הסביבה, פועלים לפי השלבים הבאים:

  1. יוצרים ספרייה של סביבת עבודה במחשב שלכם, לדוגמה: ~/gke-windows-builder/hello-world.
  2. יוצרים פרויקט או בוחרים פרויקט קיים לצורך המדריך הזה.
  3. מוודאים שהחיוב מופעל בפרויקט.
  4. מפעילים בפרויקט את Compute Engine API, ‏ Cloud Build API ו-Artifact Registry API. הפעלת gke-windows-builder מתבצעת באמצעות Cloud Build, וקובצי האימג' של הקונטיינרים מרובי הארכיטקטורות שנוצרים מועברים בדחיפה אל Artifact Registry. הכלי לבנייה צריך את Compute Engine כדי ליצור ולנהל מכונות וירטואליות של Windows Server.

    gcloud services enable compute.googleapis.com cloudbuild.googleapis.com \
      artifactregistry.googleapis.com cloudbuild.googleapis.com
    
  5. צריך להקצות לחשבון השירות של Cloud Build את התפקידים הבאים בניהול הזהויות והרשאות הגישה (IAM) באמצעות Google Cloud CLI:

    1. הגדרת משתנים:

      export PROJECT=$(gcloud info --format='value(config.project)')
      export MEMBER=$(gcloud projects describe $PROJECT --format 'value(projectNumber)')@cloudbuild.gserviceaccount.com
      
    2. להקצות תפקידים. התפקידים האלה נדרשים כדי שהכלי לבניית תמונות יוכל ליצור את המכונות הווירטואליות של Windows Server, להעתיק את סביבת העבודה לדלי ב-Cloud Storage, להגדיר את הרשתות כדי ליצור את תמונת Docker ולהעביר את התמונה שנוצרה ל-Artifact Registry:

      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/compute.instanceAdmin'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/iam.serviceAccountUser'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/compute.networkViewer'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/storage.admin'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/artifactregistry.writer'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/cloudbuild.builds.editor'
      
  6. מוסיפים כלל חומת אש בשם allow-winrm-ingress כדי לאפשר ל-WinRM להתחבר למכונות וירטואליות של Windows Server ולהריץ בניית Docker:

    gcloud compute firewall-rules create allow-winrm-ingress --allow=tcp:5986 --direction=INGRESS
    
  7. יוצרים מאגר Docker ב-Artifact Registry לפרויקט. אם אף פעם לא השתמשתם במאגרי Docker ב-Artifact Registry, כדאי קודם לעיין במדריך למתחילים ל-Docker. מריצים את הפקודה הבאה כדי ליצור את המאגר:

    gcloud artifacts repositories create REPOSITORY \
      --repository-format=docker --location=REGISTRY_REGION \
      --description="Docker repository"
    

    מחליפים את מה שכתוב בשדות הבאים:

יצירת הקובץ הבינארי hello.exe בסביבת העבודה

במדריך הזה, יוצרים אפליקציית Hello World פשוטה שנכתבה ב-Go. הקוד של האפליקציה לדוגמה זמין ב-GitHub.

  1. משכפלים את המאגר שמכיל את הקוד לדוגמה של המדריך הזה למכונה המקומית באמצעות הפקודות הבאות:

     git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
     cd kubernetes-engine-samples/windows/windows-multi-arch
    
  2. הקובץ hello.go מדפיס את המילים Hello World:

    package main
    
    import "fmt"
    
    func main() {
    	fmt.Println("Hello World!")
    }
    
  3. יצירת קובץ בינארי של hello.exe:

    GOOS=windows go build hello.go
    

הקובץ הבינארי hello.exe יופיע בסביבת העבודה.

יצירת קובץ Dockerfile וקבצי build בסביבת העבודה

בקטע הזה משתמשים ב-Dockerfile כדי ליצור כל קובץ אימג' של Windows Server single-arch, ואז משתמשים בקובץ build כדי להפעיל את Cloud Build. ה-build משלב את התמונות של ארכיטקטורה יחידה לתמונה של ארכיטקטורות מרובות.

  1. Dockerfile הוא מסמך טקסט שמכיל הוראות ל-Docker ליצירת תמונה. ‫gke-windows-builder מחליף את WINDOWS_VERSION בגרסה ספציפית של Windows Server כדי לבנות את התמונה. לדוגמה, ה-builder יפעיל את docker build -t multi-arch-helloworld:latest_20h2 --build-arg WINDOWS_VERSION=20H2 . ב-Windows Server 20H2.

    ARG WINDOWS_VERSION=
    FROM mcr.microsoft.com/windows/servercore:${WINDOWS_VERSION}
    COPY hello.exe /hello.exe
    USER ContainerUser
    ENTRYPOINT ["hello.exe"]
  2. באותה ספרייה שבה נמצא הקובץ Dockerfile, הקובץ cloudbuild.yaml הוא קובץ הגדרות ה-build. מחליפים את <REPOSITORY> ואת <REGISTRY_REGION> בשם ובאזור של מאגר Artifact Registry שיצרתם בשלב הקודם. בזמן ה-build, מערכת Cloud Build מחליפה באופן אוטומטי את $PROJECT_ID במזהה הפרויקט.

    timeout: 3600s
    steps:
    - name: 'us-docker.pkg.dev/gke-windows-tools/docker-repo/gke-windows-builder:latest'
      args:
      - --container-image-name
      # Replace <REGISTRY_REGION> and <REPOSITORY>.
      - '<REGISTRY_REGION>-docker.pkg.dev/$PROJECT_ID/<REPOSITORY>/multiarch-helloworld:latest'
      # Specify specific variants of images to be built. Or, remove the following 2 lines to default to all available variants.
      - --versions
      - '20H2,ltsc2019'

יצירת התמונה

עכשיו אפשר ליצור את התמונה ולצפות ביומנים כדי לוודא שהבנייה הושלמה בהצלחה.

  1. כדי ליצור את האימג', מריצים את הפקודה הבאה:

    gcloud builds submit --config=cloudbuild.yaml .
    
  2. יוצגו יומנים כמו בדוגמה הבאה. השורה האחרונה ביומן מראה שהגרסה נוצרה בהצלחה:

    Creating temporary tarball archive of 2 file(s) totalling 492 bytes before compression.
    Uploading tarball of [.] to [gs://PROJECT_ID_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz]
    Created [https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds/ec333452-1301-47e8-90e2-716aeb2f5650].
    Logs are available at [https://console.cloud.google.com/cloud-build/builds/ec333452-1301-47e8-90e2-716aeb2f5650?project=840737568665].
    ------------------------ REMOTE BUILD OUTPUT---------------------------------------
    ...
    ...
    
    Created manifest list REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/multiarch-helloworld:latest
    sha256:3ecbbc9f5144f358f81f7c7f1a7e28f069c98423d59c40eaff72bf184af0be02
    2020/09/14 11:34:25 Instance: 35.184.178.49 shut down successfully
    PUSH
    DONE
    -----------------------------------------------------------------------------------
    
    ID                                    CREATE_TIME                DURATION  SOURCE                                                                                      IMAGES  STATUS
    ec333452-1301-47e8-90e2-716aeb2f5650  2020-09-14T11:21:43+00:00  12M43S    gs://PROJECT_ID_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz  -                 SUCCESS
    

הרגע יצרתם את קובץ האימג' באמצעות קובץ ההגדרות של ה-build והעברתם אותו בדחיפה ל-Artifact Registry בכתובת REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/multiarch-helloworld:latest.

פריסת התמונה

כדי לפרוס את תמונת Windows מרובת הארכיטקטורות באשכול, אפשר לעיין במאמר פריסת אפליקציית Windows Server כדי ללמוד איך לפרוס את התמונה.

שימוש מתקדם ב-gke-windows-builder

כדי להתאים אישית את ההתנהגות של gke-windows-builder, מוסיפים פלאגים לקטע args בקובץ התצורה של ה-build‏ cloudbuild.yaml. בקטע הזה מפורטים כמה דגלים להתנהגויות נפוצות, אבל זו לא רשימה מלאה. כדי לראות את הרשימה המלאה של הדגלים שנתמכים ב-gke-windows-builder, מריצים את הפקודה הבאה בשרת Linux או ב-Cloud Shell:

docker run -it us-docker.pkg.dev/gke-windows-tools/docker-repo/gke-windows-builder:latest --help

כדי להאיץ את תהליך ה-build, אפשר להשתמש בסוג מכונה גדול יותר עבור מופעי Windows:

  - --machineType
  - 'n1-standard-8'

במקום ליצור את קובץ האימג' לכל הגרסאות של Windows ש-GKE תומך בהן, אפשר לבחור גרסאות ספציפיות של Windows Server ליצירה באמצעות הדגל --versions:

  - --versions
  - '20H2,ltsc2019'

אם בסביבת העבודה יש הרבה קבצים, בניית התמונה תהיה אמינה יותר אם תגדירו את כלי הבנייה להעתקת סביבת העבודה דרך Cloud Storage ולא דרך WinRM. יוצרים קטגוריה בפרויקט, למשל gs://{your project}_builder, ואז מגדירים את הדגל --workspace-bucket:

  - --workspace-bucket
  - '{your project}_builder'

כדי להריץ את מופעי ה-Builder של Windows בפרויקט שירות VPC משותף, משתמשים בפלגים הבאים ששולטים בהגדרת הרשת של המופע:

  - --subnetwork-project
  - 'shared-vpc-host-project'
  - --subnetwork
  - 'host-project-subnet-shared-with-service-project'

הסרת המשאבים

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

מחיקת התמונה

כדי למחוק את תמונות multiarch-helloworld ב-Artifact Registry, אפשר לעיין במאמר בנושא מחיקת תמונות.

מחיקת הפרויקט

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.

כדי למחוק את הפרויקט:

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

המאמרים הבאים