שדרוג עומסי עבודה של קונטיינרים לסביבת הרצה משופרת
אם יש לכם עומסי עבודה קיימים של מאגרים שנוצרו באמצעות 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.
- מחיקת ההגדרות של
בקטעים הבאים מוסבר על תהליך ההמרה הספציפי:
המרת עומס עבודה בלי שמירת מצב
בדוגמה הבאה אפשר לראות איך ממירים עומס עבודה של קונטיינר בלי שמירת מצב:
מאתרים את הספרייה שמכילה את פרטי המידע שנוצרו בתהליך של פיתוח (Artifact) של ההעברה הקיימת, כולל הקובץ
deployment_spec.yaml.עורכים את קובץ ה-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" ]
פותחים את הקובץ
deployment_spec.yamlבכלי לעריכה. לדוגמה:vi deployment_spec.yaml
מאתרים את הקטע הבא בקובץ ומוחקים את השורות שמצוינות:
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.
מוסיפים את השורות הבאות כדי להגדיר את משתנה הסביבה
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"
שומרים את הקובץ.
מוודאים שלקלאסטר היעד יש הרשאת קריאה למרשם קובצי האימג' של Docker, כמו שמתואר במאמר מוודאים שלקלאסטר היעד יש הרשאת קריאה למרשם קובצי האימג' של Docker.
יוצרים את קובץ האימג' המעודכן ומעבירים אותו בדחיפה ל-Container Registry עם תג גרסה מעודכן, ומוודאים שנותנים מספיק זמן לסיום הבנייה. בדוגמה הבאה, התמונה נמצאת בספרייה הנוכחית:
gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
פורסים את הקונטיינר:
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"צפייה ב-Pods שנפרסים באשכול.
kubectl get pods
המרת עומס עבודה עם שמירת מצב
בדוגמה הבאה מוצג איך להמיר עומס עבודה של קונטיינר עם שמירת מצב:
מאתרים את הספרייה שמכילה את פרטי המידע שנוצרו בתהליך של פיתוח (Artifact) של ההעברה הקיימת, כולל הקובץ
deployment_spec.yaml.עורכים את קובץ 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" ]
פותחים את הקובץ
deployment_spec.yamlבכלי לעריכה. לדוגמה:vi deployment_spec.yaml
מאתרים את שלושת הקטעים הבאים בקובץ ומוחקים את השורות שמצוינות:
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ומשאירים את ההגדרות הנותרות.מוסיפים את השורות הבאות כדי להגדיר את משתנה הסביבה
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
שומרים את הקובץ.
מוודאים שלקלאסטר היעד יש גישת קריאה למרשם קובצי האימג' של Docker, כמו שמתואר במאמר מוודאים שלקלאסטר היעד יש גישת קריאה למרשם קובצי האימג' של Docker.
יוצרים את קובץ האימג' המעודכן ומעבירים אותו בדחיפה ל-Container Registry עם תג גרסה מעודכן, ומוודאים שנותנים מספיק זמן לסיום הבנייה. בדוגמה הבאה, התמונה נמצאת בספרייה הנוכחית:
gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
פורסים את הקונטיינר:
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"צפייה ב-Pods שנפרסים באשכול.
kubectl get pods
משימות אחרי המרה
אחרי שממירים העברה קיימת לשימוש במנהל שירותים פשוט של Linux, יכול להיות שתרצו לשנות אותה כדי:
- עדכון השירותים שבהם נעשה שימוש בעומס העבודה שהועבר.
- להוסיף שירותים חדשים.
בשני התרחישים, צריך לערוך את קובץ ה-Dockerfile ואז ליצור מחדש את קובץ האימג' של הקונטיינר.
עדכון שירותים
בקטע הזה, עורכים את קובץ ה-Dockerfile כדי לעדכן את הקובץ services-config.yaml במאגר על סמך השינויים שבוצעו ב-/etc/systemd בעומס העבודה שהועבר.
כדי לעדכן את קובץ האימג' בקונטיינר לשינוי בשירות קיים:
מוסיפים את הפקודה
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" ]
יוצרים את קובץ האימג' המעודכן ומעבירים אותו בדחיפה ל-Container Registry עם תג גרסה מעודכן, ומוודאים שנותנים מספיק זמן לסיום הבנייה. בדוגמה הבאה, התמונה נמצאת בספרייה הנוכחית:
gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
פורסים את קובץ האימג' החדש:
kubectl set image deployment/myWorkload my-app=gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL --record
הוספת שירותים
כדי להוסיף שירות לקובץ האימג' של הקונטיינר:
מוסיפים את הפקודה
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" ]
יוצרים את קובץ האימג' המעודכן ומעבירים אותו בדחיפה ל-Container Registry עם תג גרסה מעודכן, ומוודאים שנותנים מספיק זמן לסיום הבנייה. בדוגמה הבאה, התמונה נמצאת בספרייה הנוכחית:
gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
פורסים את קובץ האימג' החדש:
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, אחת לכל שירות.