שדרוג עומסי עבודה של קונטיינרים לסביבת הרצה משופרת

אם יש לכם עומסי עבודה קיימים של מאגרים שנוצרו באמצעות Migrate to Containers בגרסאות 1.7.x ו-1.8.x, אתם יכולים להמיר אותם לשימוש במנהל השירותים הפשוט של Linux. ההמרה הזו מאפשרת לכם להפעיל את הקונטיינרים האלה באשכולות GKE Autopilot.

כדי לבצע את ההמרה, עורכים את קובץ ה-Dockerfile ואת הקובץ deployment_spec.yaml שנוצר כשביצעתם את ההעברה המקורית. אחרי העריכה, אפשר לפרוס את עומס העבודה של הקונטיינר באשכולות של Autopilot.

מידע על המרת עומסי עבודה של קונטיינרים

התהליך להמרת עומסי עבודה קיימים תלוי בסוג עומס העבודה שרוצים להמיר: בלי שמירת מצב או עם שמירת מצב.

עומס עבודה עם שמירת מצב הוא עומס עבודה ששומר או מאחסן מידע על המצב. במקרים של עומסי עבודה עם שמירת מצב, לרוב מצמידים נפחים נוספים באמצעות StatefulSet ב-spec.containers.volumeMounts. חשוב לשמור את ההגדרות של volumeMounts וגם להסיר אותן מ-/sys/fs/cgroup. מידע נוסף מופיע במאמר בנושא הוספת נפחים חיצוניים.

התהליך הכללי להמרת עומס עבודה קיים מחייב עריכה של:

  • קובץ Docker

    • מגדירים את הגרסה של Migrate to Containers ל-1.15.0.
    • מזינים שתי פקודות ADD כדי להעתיק את הקובץ logs.yaml לקובץ האימג' של הקונטיינר.
    • מזינים פקודת RUN לכלי השירות servicemanager_generate_config.
  • קובץ deployment_spec.yaml אל:

    • מחיקת ההגדרות של hostPath ו-volumeMounts עבור /sys/fs/cgroup.
    • מוחקים את ההגדרה של securityContext.
    • מוחקים את ההגדרה של readinessProbe.
    • אפשר להשאיר את ההגדרות של mountPath ושל configMap ל-logs-config, אבל כרגע הרישום ביומן לא פועל עם מנהל השירותים הפשוט של Linux.

בקטעים הבאים מוסבר על תהליך ההמרה הספציפי:

המרת עומס עבודה בלי שמירת מצב

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

  1. מאתרים את הספרייה שמכילה את פרטי המידע שנוצרו בתהליך של פיתוח (Artifact) של ההעברה הקיימת, כולל הקובץ deployment_spec.yaml.

  2. עורכים את קובץ ה-Dockerfile כדי להגדיר את גרסת המוצר, להעתיק את הקובץ logs.yaml ולהריץ את כלי השירות servicemanager_generate_config:

    ...
    # Set the product version to 1.15.0:
    FROM anthos-migrate.gcr.io/v2k-run-embedded:v1.15.0 as migrate-for-anthos-runtime
    
    ...
    
    ADD blocklist.yaml /.m4a/blocklist.yaml
    # Insert the ADD commands to copy the `logs.yaml` file to the container image:
    ADD logs.yaml /code/config/logs/logsArtifact.yaml
    ADD logs.yaml /code/config/logs/logs.yaml
    
    # Insert the RUN command for servicemanager_generate_config:
    RUN /servicemanager_generate_config build-all -o /.m4a/
    
    # Migrate to Containers image includes entrypoint
    ENTRYPOINT [ "/.v2k.go" ]
  3. פותחים את הקובץ deployment_spec.yaml בכלי לעריכה. לדוגמה:

    vi  deployment_spec.yaml
  4. מאתרים את הקטע הבא בקובץ ומוחקים את השורות שמצוינות:

    apiVersion: apps/v1 
    kind: Deployment
    metadata: 
      creationTimestamp: null 
      name: IMAGE_NAME  
          
        spec:
          containers:
          - image: gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL
            name: IMAGE_NAME
    # Delete the following lines:
            readinessProbe:
              exec:
                command:
                - /code/ready.sh
            resources: {}
            securityContext:
              privileged: true
            volumeMounts:
            - mountPath: /sys/fs/cgroup
              name: cgroups
            - mountPath: /code/config/logs
              name: logs-config
          volumes:
          - hostPath:
              path: /sys/fs/cgroup
              type: Directory
            name: cgroups
          - configMap:
              name: suitecrm-crddefault-logs
            name: logs-config
    # Stop the delete here.
  5. מוסיפים את השורות הבאות כדי להגדיר את משתנה הסביבה HC_V2K_SERVICE_MANAGER.

    spec:
      containers:
      - image: gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL
        name: IMAGE_NAME
    # Add the following lines:
        env:
          - name: HC_V2K_SERVICE_MANAGER
            value: "true"
  6. שומרים את הקובץ.

  7. מוודאים שלקלאסטר היעד יש הרשאת קריאה למרשם קובצי האימג' של Docker, כמו שמתואר במאמר מוודאים שלקלאסטר היעד יש הרשאת קריאה למרשם קובצי האימג' של Docker.

  8. יוצרים את קובץ האימג' המעודכן ומעבירים אותו בדחיפה ל-Container Registry עם תג גרסה מעודכן, ומוודאים שנותנים מספיק זמן לסיום הבנייה. בדוגמה הבאה, התמונה נמצאת בספרייה הנוכחית:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  9. פורסים את הקונטיינר:

    kubectl apply -f deployment_spec.yaml

    אם תחיל את מפרט הפריסה על אשכול Autopilot בלי לבצע את השינויים הנדרשים ב-deployment_spec.yaml, תוצג הודעת שגיאה מהסוג הבא:

    "Trying to run without root privileges is not possible. Did you try to use the new runtime? In that case please pass the environment variable HC_V2K_SERVICE_MANAGER=true to the pod"

  10. צפייה ב-Pods שנפרסים באשכול.

    kubectl get pods

המרת עומס עבודה עם שמירת מצב

בדוגמה הבאה מוצג איך להמיר עומס עבודה של קונטיינר עם שמירת מצב:

  1. מאתרים את הספרייה שמכילה את פרטי המידע שנוצרו בתהליך של פיתוח (Artifact) של ההעברה הקיימת, כולל הקובץ deployment_spec.yaml.

  2. עורכים את קובץ Dockerfile כדי להגדיר את גרסת המוצר ומריצים את כלי השירות servicemanager_generate_config:

    ...
    # Set the product version to 1.15.0:
    FROM anthos-migrate.gcr.io/v2k-run-embedded:v1.15.0 as migrate-for-anthos-runtime
    
    ...
    
    ADD blocklist.yaml /.m4a/blocklist.yaml
    # Insert the ADD commands to copy the `logs.yaml` file to the container image:
    ADD logs.yaml /code/config/logs/logsArtifact.yaml
    ADD logs.yaml /code/config/logs/logs.yaml
    
    # Insert the RUN command for servicemanager_generate_config:
    RUN /servicemanager_generate_config build-all -o /.m4a/
    
    # Migrate to Containers image includes entrypoint
    ENTRYPOINT [ "/.v2k.go" ]
  3. פותחים את הקובץ deployment_spec.yaml בכלי לעריכה. לדוגמה:

    vi  deployment_spec.yaml
  4. מאתרים את שלושת הקטעים הבאים בקובץ ומוחקים את השורות שמצוינות:

    apiVersion: apps/v1 
    kind: StatefulSet  
    ... 
    spec: 
      containers: 
      - image: gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL 
        name: IMAGE_NAME 
    # Delete the following lines:
        readinessProbe: 
          exec: 
            command: 
            - /code/ready.sh 
        resources: {} 
        securityContext: 
          privileged: true 
    # Stop the delete here.
        volumeMounts: 
    # Delete the following lines:
        - mountPath: /sys/fs/cgroup 
          name: cgroups 
    # Stop the delete here.
        - mountPath: /opt/suitecrm-7.10.5-0/mysql/data 
          name: data-pvc-0-1b12-d0af-48b3-9f5e-6c25fa5 
          subPath: opt/suitecrm-7.10.5-0/mysql/data 
      volumes:
    # Delete the following lines:
      - hostPath:
          path: /sys/fs/cgroup 
          type: Directory 
        name: cgroups 
    # Stop the delete here.
      - name: data-pvc-2-d0af-48b3-9f5e09c25fa5 
        persistentVolumeClaim: 
          claimName: data-pvc-0-1a2-d0af-48b3-9f5e-605fa5

    שימו לב שמסירים רק את ההגדרות volumeMounts ו-volumes של cgroups ומשאירים את ההגדרות הנותרות.

  5. מוסיפים את השורות הבאות כדי להגדיר את משתנה הסביבה HC_V2K_SERVICE_MANAGER:

    spec: 
      containers: 
      - image: gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL
        name: IMAGE_NAME 
    # Add the following lines:
        env:
        - name: HC_V2K_SERVICE_MANAGER 
          value: "true" 
    # Stop the add here.
        volumeMounts: 
        - mountPath: /opt/suitecrm-7.10.5-0/mysql/data 
          name: data-pvc-0-1b12-d0af-48b3-9f5e-6c25fa5 
          subPath: opt/suitecrm-7.10.5-0/mysql/data 
      volumes:
      - name: data-pvc-2-d0af-48b3-9f5e09c25fa5 
        persistentVolumeClaim: 
          claimName: data-pvc-0-1a2-d0af-48b3-9f5e-605fa5
  6. שומרים את הקובץ.

  7. מוודאים שלקלאסטר היעד יש גישת קריאה למרשם קובצי האימג' של Docker, כמו שמתואר במאמר מוודאים שלקלאסטר היעד יש גישת קריאה למרשם קובצי האימג' של Docker.

  8. יוצרים את קובץ האימג' המעודכן ומעבירים אותו בדחיפה ל-Container Registry עם תג גרסה מעודכן, ומוודאים שנותנים מספיק זמן לסיום הבנייה. בדוגמה הבאה, התמונה נמצאת בספרייה הנוכחית:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  9. פורסים את הקונטיינר:

    kubectl apply -f deployment_spec.yaml

    אם תפעילו את מפרט הפריסה על אשכול Autopilot בלי לבצע את השינויים הנדרשים ב-deployment_spec.yaml, תוצג הודעת שגיאה מהסוג הבא:

    "Trying to run without root privileges is not possible. Did you try to use the new runtime? In that case please pass the environment variable HC_V2K_SERVICE_MANAGER=true to the pod"

  10. צפייה ב-Pods שנפרסים באשכול.

    kubectl get pods

משימות אחרי המרה

אחרי שממירים העברה קיימת לשימוש במנהל שירותים פשוט של Linux, יכול להיות שתרצו לשנות אותה כדי:

  • עדכון השירותים שבהם נעשה שימוש בעומס העבודה שהועבר.
  • להוסיף שירותים חדשים.

בשני התרחישים, צריך לערוך את קובץ ה-Dockerfile ואז ליצור מחדש את קובץ האימג' של הקונטיינר.

עדכון שירותים

בקטע הזה, עורכים את קובץ ה-Dockerfile כדי לעדכן את הקובץ services-config.yaml במאגר על סמך השינויים שבוצעו ב-/etc/systemd בעומס העבודה שהועבר.

כדי לעדכן את קובץ האימג' בקונטיינר לשינוי בשירות קיים:

  1. מוסיפים את הפקודה servicemanager_generate_config לקובץ Dockerfile:

    ...
    FROM anthos-migrate.gcr.io/v2k-run-embedded:v1.15.0 as migrate-for-anthos-runtime
    
    ...
    
    ADD blocklist.yaml /.m4a/blocklist.yaml
    
    # Use the update command for servicemanager_generate_config to update the configuration:
    RUN /servicemanager_generate_config update -u /.m4a/
    
    # Migrate to Containers image includes entrypoint
    ENTRYPOINT [ "/.v2k.go" ]
  2. יוצרים את קובץ האימג' המעודכן ומעבירים אותו בדחיפה ל-Container Registry עם תג גרסה מעודכן, ומוודאים שנותנים מספיק זמן לסיום הבנייה. בדוגמה הבאה, התמונה נמצאת בספרייה הנוכחית:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  3. פורסים את קובץ האימג' החדש:

    kubectl set image deployment/myWorkload my-app=gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL --record

הוספת שירותים

כדי להוסיף שירות לקובץ האימג' של הקונטיינר:

  1. מוסיפים את הפקודה servicemanager_generate_config לקובץ Dockerfile:

    ...
    FROM anthos-migrate.gcr.io/v2k-run-embedded:v1.15.0 as migrate-for-anthos-runtime
    
    ...
    
    ADD blocklist.yaml /.m4a/blocklist.yaml
    
    # This example adds the redis-server service.
    # Add the following lines to install redis-server.
    RUN apt-get update && apt-get -y install redis-server
    
    # Use the servicemanager_generate_config add command to add
    # redis-server to the configuration:
    RUN /servicemanager_generate_config add redis-server -u /.m4a/
    
    # Migrate to Containers image includes entrypoint
    ENTRYPOINT [ "/.v2k.go" ]
  2. יוצרים את קובץ האימג' המעודכן ומעבירים אותו בדחיפה ל-Container Registry עם תג גרסה מעודכן, ומוודאים שנותנים מספיק זמן לסיום הבנייה. בדוגמה הבאה, התמונה נמצאת בספרייה הנוכחית:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  3. פורסים את קובץ האימג' החדש:

    kubectl set image deployment/myWorkload my-app=gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL --record

התחביר של servicemanager_generate_config

כלי השירות servicemanager_generate_config מקבל את האפשרויות הבאות:

  • build-all -o /.m4a/: בונה מחדש את ההעברה וכותב את ההגדרה לספרייה m4a. אל תשנו את שם הספרייה.

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

  • update -u /.m4a/: עדכון רשימת השירותים הקיימים בספרייה m4a. אל תשנו את שם הספרייה.

  • add SERVICE_NAME -u /.m4a/: מוסיף את שם השירות להעברה וכותב את ההגדרה לספרייה m4a. אל תשנו את שם הספרייה.

    כדי להוסיף כמה שירותים, מוסיפים כמה פקודות RUN /servicemanager_generate_config, אחת לכל שירות.

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