התאמה אישית של תוכנית העברה לשירותי Windows IIS

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

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

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

במסמך הזה אנחנו מניחים שכבר יצרתם תוכנית העברה ושברשותכם קובץ תוכנית ההעברה שנוצר.

המבנה של תוכנית ההעברה

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

globalSettings:
    globalIis:
        enablegmsa: string
        apppools:
            - enable32bitapponwin64: bool
              identitytype: string
              managedruntimeversion: string
              name: string
        connectionStrings:
            add:
                - connectionstring: string
                  name: string
                  providername: string
        security:
            authentication:
                windowsAuthentication:
                    enabled: bool
                    providers:
                        - value: string
            authorization:
                add:
                    - access_type: string
                      roles: string
                      users: string
                      verbs: string
                remove:
                    - roles: string
                      users: string
                      verbs: string
    image:
        extraFeatures:
            - string
    target:
        baseVersion: string
        requirements:
            - string
        warnings:
            - string
    msvcRuntimes:
            - string
    pathEnvVarAdditionalEntries:
            - string
images:
    - name: string
      probes:
        enabled: bool
        livenessProbe:
            probehandler:
                exec:
                    command:
                        - string
                        - string
            initialdelayseconds: int
            timeoutseconds: int
            periodseconds: int
            successthreshold: int
            failurethreshold: int
            terminationgraceperiodseconds: optional[int]
        readinessProbe:
            probehandler:
                exec:
                    command:
                        - string
                        - string
            initialdelayseconds: int
            timeoutseconds: int
            periodseconds: int
            successthreshold: int
            failurethreshold: int
            terminationgraceperiodseconds: optional[int]
      useractions:
        files:
            - source: string
              target: string
        registry:
            currentcontrolset:
                - path: string
            software:
                - path: string
      workloads:
        sites:
            site:
                - applications:
                    - applicationpool: string
                      path: string
                      virtualdirectories:
                        - path: string
                          physicalpath: string
                  bindings:
                    - port: int
                      protocol: string
                      sslflags: int
                  connectionstrings:
                    - connectionstring: string
                      name: string
                      providername: string
                  name: string
                  security:
                    authentication:
                        windowsAuthentication:
                            enabled: bool
                            providers:
                                - value: string
                    authorization:
                        add:
                            - access_type: string
                              roles: string
                              users: string
                              verbs: string
                        remove:
                            - roles: string
                              users: string
                              verbs: string
                  serverautostart: bool
version: string

החלק globalSettings

בקטע globalSettings מתוארות דרישות בסיסיות ל-pods שמריצים אתרים של IIS מהמכונה הווירטואלית הזו. במהלך תהליך הגילוי, המערכת מחפשת הגדרות כלליות במכונה הווירטואלית של המקור, ומשתמשת בהן כדי לאכלס את הקטע הזה. ההגדרות האלה כוללות שדות שמופיעים בהגדרות התמונה הספציפיות, כמו שמתואר בקטע הבא, והן משפיעות על כל התמונות בו-זמנית.

החלק image

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

החלק msvcRuntimes

כשמעבירים אפליקציה, יכול להיות שיש לה תלות בגרסה ספציפית או בגרסאות ספציפיות של Microsoft Visual C++ Runtime‏ (MSVCRT). הכלי Migrate to Containers מזהה באופן אוטומטי את סביבות זמן הריצה שמותקנות במכונה הווירטואלית של המקור וכולל אותן בתוכנית ההעברה.

אפשר לשנות את רשימת סביבות זמן הריצה בתוכנית המיגרציה על ידי הוספה או הסרה של חברים ב-msvcRuntimes:

הרשימה המלאה של הערכים האפשריים: (זמן הריצה של 2015 כולל גם תמיכה ב-2017, ב-2019 וב-2022)

    msvcRuntimes:
        - MSVC2012_x64
        - MSVC2013_x64
        - MSVC2015_x64
        - MSVC2012_x86
        - MSVC2013_x86
        - MSVC2015_x86

החלק pathEnvVarAdditionalEntries

יכול להיות שבאפליקציות Windows IIS יש רשומות של משתנה הסביבה PATH שאינן ברירת מחדל. המערכת מזהה אותן באופן אוטומטי במכונה הווירטואלית של המקור וכוללת אותן בתוכנית ההעברה. אפשר לשנות את משתני הסביבה PATH על ידי עריכת הרכיבים של pathEnvVarAdditionalEntries:

    pathEnvVarAdditionalEntries:
      - "C:\\myDllsFolder"
      - "C:\\ProgramData\\SomeSoftware"

עריכת קטע התמונה

כדאי לערוך את הקטע image במקרים הבאים:

  1. יכול להיות שחלק מהתכונות המוצעות לא נדרשות באתרים שהועברו. זה קורה אם למכונה הווירטואלית של המקור יש שימושים אחרים חוץ מאירוח אתרים של IIS.

  2. שיניתם את הקטעים של IIS בתוכנית ההעברה והוספתם הגדרות שתלויות בתכונות נוספות של Windows. (לדוגמה, אימות Windows תלוי בתכונת האימות של Windows).

החלק target

בקטע target מצוין באיזו תמונת בסיס של Windows אתם משתמשים (לדוגמה, 1909). בדרך כלל לא צריך לערוך את השדה הזה.

החלק images

כל פריט משנה בקטע images מציין תמונה אחת של פלט.
ב-zip של הארטיפקטים, לכל קובץ אימג' כזה יש ספריית משנה נפרדת, עם קובץ Dockerfile וקובץ deployment_spec.yaml משלה (ראו פריסת קובץ אימג' של הקונטיינר).

השדה name

בשדה name מתואר שם התמונה. הוא משפיע על השם של ספריית המשנה של התמונה ועל הקובץ deployment_spec.yaml בארטיפקטים.

השדה probes

השדה probes מתאר את ההגדרה של בדיקת תקינות התמונה. מידע נוסף על בדיקות kubelet זמין במאמר הגדרת בדיקות של פעילות, מוכנות והפעלה.

עריכה של בדיקות תקינות ב-IIS

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

מצבי תקינות לא ידועים עלולים לגרום לירידה בזמינות, לזמינות חיובית כוזבת ולפוטנציאל לאובדן נתונים. בלי בדיקת תקינות,‏ kubelet יכול רק להניח מה מצב התקינות של קונטיינר, ויכול להיות שהוא ישלח תנועה למופע של קונטיינר שלא מוכן. אם המופע לא מוכן, יכול להיות שתהיה אובדן תנועה. יכול להיות ש-Kubelet לא יזהה קונטיינרים שנמצאים במצב קפוא ולא יפעיל אותם מחדש.

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

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

  • *בדיקת מצב פעילות (liveness): בדיקות מצב פעילות (liveness) משמשות כדי לדעת מתי להפעיל מחדש קונטיינר.

  • בקשה לבדיקת תקינות (probe) מוכנות: בקשות לבדיקת תקינות (probe) מוכנות משמשות כדי לדעת מתי קונטיינר מוכן להתחיל לקבל תנועה. כדי להתחיל לשלוח תנועה ל-Pod רק אחרי שבדיקת מוכנות מצליחה, צריך לציין בדיקת מוכנות. בקשה לבדיקת תקינות מוכנות עשויה לפעול באופן דומה לבקשה לבדיקת תקינות מצב פעילות. עם זאת, בקשה לבדיקת תקינות (probe) מציינת שתרמיל מתחיל בלי לקבל תנועה, ומתחיל לקבל תנועה רק אחרי שהבקשה לבדיקת תקינות (probe) מצליחה.

  • בדיקת מוכנות להפעלה:‏ kubelet משתמש בבדיקות מוכנות להפעלה כדי לדעת מתי אפליקציית קונטיינר התחילה לפעול. אם מוגדרת בקשה לבדיקת תקינות (probe) כזו, היא משביתה את בדיקות מצב פעילות (liveness) והמוכנות עד שהיא מצליחה, כדי לוודא שהבדיקות האלה לא יפריעו להפעלת האפליקציה.

אחרי הגילוי, הגדרת הבדיקה מתווספת לתוכנית המיגרציה. אפשר להשתמש בבדיקות בהגדרת ברירת המחדל שלהן, כמו בדוגמה הבאה. ההגדרה שמוגדרת כברירת מחדל משתמשת בפקודה exec לבדיקות מצב הפעילות והמוכנות. שניהם משתמשים בסקריפט PowerShell שנקרא probe.ps1, שקורא לכלי שורת הפקודה של IIS‏ appcmd כדי לבדוק את הסטטוס של אתרי IIS.

הבדיקות מושבתות כברירת מחדל. כדי להפעיל אותן, צריך להגדיר את הדגל enabled לערך true.

images:
name: IMAGE_NAME
      probes:
        enabled: false
        livenessProbe:
            probehandler:
                exec:
                    command:
                        - powershell.exe
                        - C:\m4a\probe.ps1
            initialdelayseconds: 0
            timeoutseconds: 1
            periodseconds: 10
            successthreshold: 1
            failurethreshold: 3
            terminationgraceperiodseconds: null
        readinessProbe:
            probehandler:
                exec:
                    command:
                        - powershell.exe
                        - C:\m4a\probe.ps1
            initialdelayseconds: 0
            timeoutseconds: 1
            periodseconds: 10
            successthreshold: 1
            failurethreshold: 3
            terminationgraceperiodseconds: null

החלק windowsServices

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

כדי להריץ שירותים נוספים במאגר שהועבר, מוסיפים רשומות לקטע windowsServices ומעתיקים את הקבצים הבינאריים הנדרשים לקטע useractions.

version: v1
globalSettings:
    target:
       …
    globalIIS:
    …
images:
  - name: migrated-image-zgwb2
    workloads:
    sites:
      site:
        - applications:
          ...
          bindings:
          - port: 80
            protocol: http
          name: Default Web Site
          …
    windowsServices:
    - MyService
    useractions:
      files:
        - source: C:\Program Files\MyService
          target: C:\Program Files\MyService
      registry:
        currentcontrolset:
          - key: services\MyService

החלק useractions

בקטע useractions מצוינים קבצים נוספים ומפתחות רישום שאולי תרצו להעביר.

לדוגמה:

      useractions:
        files:
        - source: DRIVE:\FOLDER-OR-FILE-PATH
          target: DRIVE:\FOLDER-OR-FILE-PATH
        - source: C:\myfolder
          target: C:\myfolder
        - source: D:\myfile
          target: D:\myfile
        - source: D:\myfile
          target: C:\myfile
        ...
        registry:
          currentcontrolset:
          - path: KEY
          ...
          software:
          - path: KEY
          ...

הנתיבים שצוינו עבור currentcontrolset ו-software הם נתיבים למפתחות בHKEY_LOCAL_MACHINE\System\CurrentControlSet Registry Hive או ב-HKEY_LOCAL_MACHINE\Software Registry Hive.

עריכת הקטע useractions

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

ההגדרות שקשורות ל-IIS מחולקות להגדרות שקשורות לאתרים ספציפיים, שהן חלק ממפרט התמונה, ולהגדרות שקשורות לכל האתרים, שמופיעות בקטע gloabalIis.

החלק sites

בקטע אתרים מתוארים האתרים שמועברים לתמונה ספציפית. יכול להיות שכמה תמונות יכילו את אותו אתר.

אם רוצים להשתמש ב-Cloud Load Balancing, ב-Ingress או ב-Cloud Service Mesh כדי לטפל בהגדרת ה-SSL, צריך להגדיר את protocol ל-http:

sites:
  site:
  - applications:
    - path: /
      virtualdirectories:
        - path: /
          physicalpath: '%SystemDrive%\inetpub\wwwroot'
          bindings:
          - port: 8080
            protocol: http
          name: Default Web Site

החלק apppools

בקטע apppools מתואר מאגר האפליקציות שנוצר בתרמילים שהועברו.

בשדה identitytype מציינים את זהות IIS של מאגר אפליקציות כאחת מהאפשרויות הבאות: ApplicationPoolIdentity (ברירת מחדל), NetworkService, LocalSystem או LocalService.

מידע נוסף זמין במאמרים הסבר על זהויות ב-IIS וזהויות של מאגרי אפליקציות.

דוגמה לתוכנית העברה שכוללת את identitytype:

migrationPlan:
    applications:
      iis:
        applicationhost:
          apppools:
          - name: DefaultAppPool
            # Allowed values include: ApplicationPoolIdentity (default), NetworkService, LocalSystem, LocalService
            identitytype="NetworkService"
          - managedruntimeversion: v4.0
            name: .NET v4.5 Classic
          - managedruntimeversion: v4.0
            name: .NET v4.5

כשמבצעים את תוכנית ההעברה כדי ליצור את ארטיפקטים של מאגר התגים, Migrate to Containers מוסיף באופן אוטומטי את ההוראות הנדרשות של Dockerfile בהתאם להגדרת השדה identitytype.

לדוגמה, אם מגדירים את identitytype ל-NetworkService, ההנחיה תהיה בפורמט:

RUN c:\windows\system32\inetsrv\appcmd.exe set apppool \"DefaultAppPool\" \"/-processModel.identityType:NetworkService\";

הכלי Migrate to Containers מוסיף באופן אוטומטי הנחיות ACL לקריאה לתיקיות של האתר בהתאם לidentitytype היעד, ולמשתמש המובנה IUSR. הפעולה הזו מתבצעת באופן אוטומטי עבור פריטים במערכת הקבצים של האפליקציה, אם חשבון האפליקציה המקורי צוין בירושה או באופן מפורש.

מידע נוסף מופיע במאמר בנושא הגדרת רשימות ACL.

השדה enablegmsa

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

הערכים הנתמכים בשדה enablegmsa הם:

  • auto (ברירת מחדל): המערכת תמיר את מאגר התגים שהועבר לשימוש ב-gMSA אם הכלי Migrate to Containers יקבע שההגדרה הנוכחית שלו לא מותרת.
  • all: המערכת תמיד תמיר את הקונטיינר שהועבר לשימוש ב-gMSA ותתעלם מההגדרה של identitytype. במקרה כזה, הערך identitytype תמיד יפורש כערך NetworkService.

דוגמה לתוכנית העברה שכוללת את enablegmsa:

migrationPlan:
    applications:
      iis:
        # Allowed values include: auto (default), all
        enablegmsa: auto|all

מידע נוסף זמין במאמר הגדרת האפליקציה לשימוש בחשבון gMSA.

מחרוזות חיבור

מחרוזות חיבור מגדירות חיבור מעומס העבודה של הקונטיינר שהועבר לספק נתונים של ‎ .NET Framework.

הכלי 'העברה אל Containers' תומך במחרוזות חיבור בהיקף האתר ובהיקף גלובלי.

כדי להוסיף מחרוזת חיבור לאתר, עורכים את ההגדרה site בתוכנית ההעברה כדי להגדיר את המאפיין connectionstrings:

sites:
  site:
    # Add the site connection strings here.
    connectionstrings:
    - name: connectionname1
      providername: System.Data.SqlClient
      connectionstring: Database=connectedDB1;Password=Welcome1;User=admin;
    - name: connectionname2
      providername: System.Data.OleDb
      connectionstring: Database=connectedDB2;Password=Welcome2;User=admin;
  - applications:
    - path: /
      virtualdirectories:
      ...

כדי להוסיף מחרוזת חיבור להיקף הגלובלי (כך שהיא תהיה נגישה לכל האתרים), עורכים את מחרוזות החיבור ישירות אחרי globalIis:

globalIis:
  enablegmsa: auto
  connectionStrings:
  connectionstring:
    - name: connectionname3
      providername: System.Data.SqlClient
      connectionstring: Database=connectedDB3;Password=Welcome3;User=admin;
  applicationhost:
      ...

כאשר:

  • name מציין את שם החיבור.
  • providername מציין באופן אופציונלי את סוג ספק הנתונים. הכלי 'העברה לקונטיינרים' תומך רק בערך System.Data.SqlClient. תומך בספק הנתונים של ‎ .NET Framework:
    • System.Data.SqlClient
    • System.Data.OleDb
    • System.Data.Odbc
    • System.Data.OracleClient
  • connectionstring מציין את מחרוזות החיבור שמשמשות לחיבור לספק הנתונים.

עריכת הקטעים של מחרוזות החיבור

הכלי Migrate to Containers מעתיק אוטומטית את מחרוזות החיבור שזוהו במכונה הווירטואלית שהועברה לתוכנית ההעברה.

יכול להיות שחלק ממחרוזות החיבור לא יזוהו, ולכן צריך להוסיף אותן על ידי עריכת תוכנית ההעברה כמו שמוצג למעלה. (לדוגמה, אם מחרוזות החיבור נמצאות בקטע מוצפן בקובץ applicationhost.config).

במאמר Retrieving Connection Strings at Run Time במסמכי התיעוד של מיקרוסופט יש הוראות לקביעת מחרוזות החיבור שצריך להוסיף לתוכנית ההעברה.

Connection string external dependencies

  • מחרוזות חיבור יכולות להכיל תלויות, כמו הפניה לקובץ או למשתמש Windows שמשויך לאתר. אתם יכולים להוסיף פעולות משתמש בהתאמה אישית לתוכנית ההעברה כדי להעתיק קובץ נוסף במערכת הקבצים. עורכים ידנית את קובץ Docker כדי להוסיף משתמש Windows.
  • מחרוזות חיבור יכולות להכיל תלויות, כמו הפניה למקור נתונים חיצוני. כדי לוודא שלעומס העבודה של מאגר התגים שהועבר תהיה גישה למקור הנתונים, צריך להעביר את התלות האלה באופן ידני.

החלק security

בקטעי האבטחה מופיעים קטעי המשנה בנושא אימות והרשאה.

  • אימות Windows מאמת משתמשים ב-Active Directory.
  • הרשאה ב-Windows היא המנגנון שבאמצעותו מציינים אילו משתמשים מורשים לקבל גישה לאתר IIS, ואיזה סוג גישה. סוגי הגישה הם פעלים של HTTP‏ (POST, ‏ GET, ‏ PUT, ‏ PATCH, ‏ DELETE).

בדומה למחרוזות חיבור, כדי להגדיר הרשאה או אימות לכל האתרים, עורכים את globalIis כמו בדוגמה הבאה. כדי להגדיר הרשאה או אימות לאתר ספציפי, עורכים את רכיב האתר.

globalIis:
    security:
      authentication:
        windowsAuthentication:
          providers:
          - NTLM
      authorization:
        - add:
          user:John
          access:
          role:
         - remove:
              user:Jane
              access: GET
              role: 
            ...

כאשר:

  • providers מציין את הספק של פרוטוקולי האבטחה.
  • user מציינים את שם המשתמש.
  • access מציין את ההרשאות של המשתמש. סוגי הגישה הם פעלים של HTTP‏ (POST, ‏ GET, ‏ PUT, ‏ PATCH, ‏ DELETE).
  • role מציין תפקיד הרשאה ספציפי.

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