סנכרון תרשימי Helm מ-Artifact Registry

בדף הזה מוסבר איך לסנכרן תרשימי Helm מ-Artifact Registry על ידי יצירה של תרשים Helm והעברה שלו למאגר ב-Artifact Registry. הוא מכיל גם הגדרת דוגמה לסנכרון תרשים ממאגר Helm.

אתם יכולים להגדיר את סנכרון תצורות כך שיסנכרן ממאגרי Helm. אפשר לאחסן תרשימי Helm ב-Artifact Registry, שהוא מאגר Helm המומלץ ל- Google Cloud. כדי להשתמש בתכונה הזו, צריך להפעיל את ממשקי ה-API של RootSync ו-RepoSync. ‫סנכרון תצורות מעבד תרשימי Helm באמצעות helm template, ולכן הוא לא תומך בניהול מלא של מחזור החיים של Helm.

גרסאות Helm ו-Kustomize שצורפו מפרט את גרסאות Kustomize ו-Helm שצורפו לגרסה המתאימה של סנכרון תצורות.

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

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. התקינו את ה-CLI של Google Cloud.

  3. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  4. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  5. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  6. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  7. מפעילים את ממשקי ה-API של GKE,‏ סנכרון תצורות ו-Artifact Registry:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable container.googleapis.com  anthosconfigmanagement.googleapis.com  artifactregistry.googleapis.com
  8. התקינו את ה-CLI של Google Cloud.

  9. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  10. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  11. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  12. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  13. מפעילים את ממשקי ה-API של GKE,‏ סנכרון תצורות ו-Artifact Registry:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    gcloud services enable container.googleapis.com  anthosconfigmanagement.googleapis.com  artifactregistry.googleapis.com
  14. ליצור אשכול שעומד בדרישות של סנכרון תצורות או לקבל גישה לאשכול כזה, ולוודא שהוא פועל בגרסה העדכנית של סנכרון תצורות.
  15. מתקינים את nomos CLI או משדרגים אותו לגרסה העדכנית.
  16. מתקינים את Helm 3.8.0 ואילך. בגרסאות קודמות של Helm, התמיכה בתרשימים בפורמט OCI היא תכונה ניסיונית.
  17. מפעילים איחוד זהויות של עומסי עבודה ל-GKE באשכול.

מגבלות

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

  • תרשימי ה-Helm הבאים כוללים משימות ולא מומלצים לפריסה על ידי סנכרון תצורות:

    מידע נוסף על הסיבות לכך שלא מומלץ להשתמש ב-Jobs עם סנכרון תצורות זמין במאמר למה לא מומלץ לנהל Jobs באמצעות סנכרון תצורות.

יצירת מאגר Artifact Registry

בקטע הזה, יוצרים מאגר ב-Artifact Registry. מידע נוסף על יצירת מאגרי Artifact Registry זמין במאמר יצירת מאגרים.

  1. מפעילים את Artifact Registry API:

    gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
    
  2. יוצרים מאגר Artifact Registry:

    gcloud artifacts repositories create AR_REPO_NAME \
       --repository-format=docker \
       --location=AR_REGION \
       --description="Config Sync Helm repo" \
       --project=PROJECT_ID
    

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

  • PROJECT_ID: מזהה הפרויקט של הארגון.
  • AR_REPO_NAME: מזהה המאגר.
  • AR_REGION: המיקום האזורי או הרב-אזורי של המאגר.

משתנים שנעשה בהם שימוש בקטעים הבאים:

  • FLEET_HOST_PROJECT_ID: אם אתם משתמשים באיחוד זהויות של עומסי עבודה ל-GKE, הערך הזה זהה לערך של PROJECT_ID. אם אתם משתמשים באיחוד זהויות של עומסי עבודה ל-GKE, זהו מזהה הפרויקט של ה-Fleet שהאשכול רשום בו.
  • GSA_NAME: השם של חשבון השירות המותאם אישית של Google שרוצים להשתמש בו כדי להתחבר ל-Artifact Registry.
  • KSA_NAME: חשבון השירות של Kubernetes עבור ה-reconciler.
    • אם שם המאגר RootSync הוא root-sync, מוסיפים root-reconciler למאגרי הבסיס. אחרת, מוסיפים את root-reconciler-ROOT_SYNC_NAME.
    • אם שם מאגר מרחב השמות הוא RepoSync, צריך להוסיף ns-reconciler-NAMESPACE. repo-sync אחרת, מוסיפים ns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH כאשר REPO_SYNC_NAME_LENGTH הוא מספר התווים ב-REPO_SYNC_NAME.

מתן הרשאת קריאה

כדי להשתמש בחשבון שירות של Kubernetes לאימות ב-Artifact Registry, מבצעים את השלבים הבאים:

מקצים את תפקיד הקורא ב-Artifact Registry ‏ (roles/artifactregistry.reader) ב-IAM לחשבון השירות ב-Kubernetes שיש לו מאגר של איחוד זהויות של עומסי עבודה ל-GKE:

gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
    --location=AR_REGION \
    --member="serviceAccount:FLEET_HOST_PROJECT_ID.svc.id.goog[config-management-system/KSA_NAME]" \
    --role=roles/artifactregistry.reader \
    --project=PROJECT_ID

דחיפת תרשים Helm למאגר Artifact Registry

בקטע הזה מורידים תרשים Helm ציבורי ומעבירים אותו בדחיפה ל-Artifact Registry.

  1. שולפים את חבילת mysql-9.3.1.tgz ממאגר Helm הציבורי ומורידים אותה באופן מקומי:

    helm pull mysql --repo https://charts.bitnami.com/bitnami --version 9.3.1
    
  2. אימות באמצעות טוקן גישה:

    ‫Linux / macOS

    gcloud auth print-access-token | helm registry login -u oauth2accesstoken \
    --password-stdin https://AR_REGION-docker.pkg.dev
    

    Windows

    gcloud auth print-access-token
    ya29.8QEQIfY_...
    
    helm registry login -u oauth2accesstoken -p "ya29.8QEQIfY_..." \
    https://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
    

    בפקודה הזו, oauth2accesstoken הוא שם המשתמש שבו צריך להשתמש כשמבצעים אימות באמצעות טוקן גישה, ו-gcloud auth print-access-token היא הפקודה לקבלת טוקן הגישה. אסימון הגישה הוא הסיסמה לאימות. אימות באמצעות טוקן גישה הוא שיטת האימות הבטוחה ביותר.

  3. מעלים את תרשים Helm ל-Artifact Registry:

    helm push mysql-9.3.1.tgz oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
    

הגדרת סנכרון תצורות לסנכרון מתרשים Helm

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

אם רוצים לשנות את ערכי ברירת המחדל של תרשים Helm, אפשר לעשות זאת על ידי ציון ערכים בשדה spec.helm.values או על ידי הוספת הפניה ל-ConfigMap באמצעות השדה spec.helm.valuesFileRefs. מידע נוסף על השדות האופציונליים זמין במאמר הגדרות למאגר Helm.

ערכים

  1. יוצרים אובייקט RootSync עם שם ייחודי:

    cat <<EOF>> ROOT_SYNC_NAME.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: ROOT_SYNC_NAME
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      sourceType: helm
      helm:
        repo: oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
        chart: mysql
        version: 9.3.1
        releaseName: my-mysql
        namespace: test
        auth: k8sserviceaccount
        # Use the optional field spec.helm.values to override default values.
        # You can use the same format as the default values file to override
        # default values.
        values:
          image:
            pullPolicy: Always
          primary:
            resources:
              limits:
                cpu: 250m
                memory: 256Mi
              requests:
                cpu: 250m
                memory: 256Mi
    EOF
    

    מחליפים את ROOT_SYNC_NAME בשם של אובייקט RootSync. השם צריך להיות ייחודי באשכול ולא יכול להכיל יותר מ-26 תווים. אם התקנתם את סנכרון תצורות באמצעות Google Cloud המסוף או Google Cloud CLI, צריך לבחור שם אחר במקום root-sync.

    בדוגמה הזו, תרשים ה-Helm נפרס במרחב השמות test כי המשאבים שלו מכילים namespace: {{ .Release.Namespace }} בתבניות שלו.

    אפשר להשתמש ב-helm.values כדי לשנות את ערכי ברירת המחדל. מידע על השדות האופציונליים זמין במאמר הגדרות למאגר Helm.

  2. מחילים את אובייקט RootSync:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  3. מוודאים ש-Config Sync מסנכרן מהתמונה:

    nomos status --contexts=$(kubectl config current-context)
    

    הפלט אמור להיראות כך:

    Connecting to clusters...
    
    *cluster-name
      --------------------
      <root>:root-sync   oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/mysql:9.3.1
      SYNCED             9.3.1
      Managed resources:
          NAMESPACE  NAME                       STATUS    SOURCEHASH
          default    configmap/my-mysql         Current   9.3.1
          default    secret/my-mysql            Current   9.3.1
          default    service/my-mysql           Current   9.3.1
          default    service/my-mysql-headless  Current   9.3.1
          default    serviceaccount/my-mysql    Current   9.3.1
          default    statefulset.apps/my-mysql  Current   9.3.1
    

    סיימתם לסנכרן את תרשים Helm עם האשכול.

valuesFileRefs

  1. יוצרים אובייקט RootSync עם שם ייחודי:

    cat <<EOF>> ROOT_SYNC_NAME.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: ROOT_SYNC_NAME
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      sourceType: helm
      helm:
        repo: oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
        chart: mysql
        version: 9.3.1
        releaseName: my-mysql
        auth: k8sserviceaccount
        # use the optional field spec.helm.valuesFilesRefs to override default values
        # by referencing a ConfigMap
        valuesFileRefs:
        - name: CONFIGMAP_NAME
          dataKey: DATA_KEY
    
    EOF
    

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

    • ROOT_SYNC_NAME: השם של אובייקט RootSync. השם צריך להיות ייחודי באשכול ולא יכול להכיל יותר מ-26 תווים. אם התקנתם את סנכרון תצורות באמצעות המסוף Google Cloud או Google Cloud CLI, צריך לבחור שם אחר במקום root-sync.
    • CONFIGMAP_NAME: השם של ה-ConfigMap. זה יכול להיות כל שם תקין של ConfigMap שמתקבל על ידי Kubernetes ושייחודי באשכול שלכם.
    • ‫(optional) DATA_KEY: מפתח הנתונים ב-ConfigMap שרוצים לקרוא ממנו את הערכים. ערך ברירת המחדל הוא values.yaml.
  2. יוצרים את אובייקט ConfigMap עם הערכים שלכם:

    cat <<EOF>> CONFIGMAP_NAME.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: CONFIGMAP_NAME
      namespace: config-management-system
    immutable: true
    # You can use the same format as the default values file to override
    # default values.
    data:
      DATA_KEY: |-
        image:
          pullPolicy: Always
        primary:
          resources:
            limits:
              cpu: 250m
              memory: 256Mi
            requests:
              cpu: 250m
              memory: 256Mi
    
    EOF
    

    אם לא ציינתם ערך למאפיין DATA_KEY ב-RootSync, הערך צריך להיות ברירת המחדל values.yaml.

  3. מחילים את אובייקט ConfigMap:

    kubectl apply -f CONFIGMAP_NAME.yaml
    
  4. מחילים את אובייקט RootSync:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  5. מוודאים ש-Config Sync מסנכרן מהתמונה:

    nomos status --contexts=$(kubectl config current-context)
    

    הפלט אמור להיראות כך:

    Connecting to clusters...
    
    *cluster-name
      --------------------
      <root>:root-sync   oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/mysql:9.3.1
      SYNCED             9.3.1
      Managed resources:
          NAMESPACE  NAME                       STATUS    SOURCEHASH
          default    configmap/my-mysql         Current   9.3.1
          default    secret/my-mysql            Current   9.3.1
          default    service/my-mysql           Current   9.3.1
          default    service/my-mysql-headless  Current   9.3.1
          default    serviceaccount/my-mysql    Current   9.3.1
          default    statefulset.apps/my-mysql  Current   9.3.1
    

    סיימתם לסנכרן את תרשים Helm עם האשכול.

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

    kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy
    
  6. מכיוון ש-ConfigMap הוא בלתי ניתן לשינוי, כדי לשנות את הערכים צריך ליצור ConfigMap חדש ולעדכן את spec.helm.valuesFileRefs במפרט של RootSync או RepoSync כך שיצביע על ה-ConfigMap החדש. יצירת ConfigMap חדש מבטיחה ששינויים בערכים יגרמו לתרשים Helm לעבור עיבוד מחדש. זה שימושי כשצריך לעדכן כמה ConfigMap שמופיעים ב-spec.helm.valuesFileRefs בו-זמנית במהלך העיבוד מחדש. כדי לשנות את הערכים שמשמשים לעיבוד התרשים, יוצרים ConfigMap חדש עם שם אחר:

    cat <<EOF>> CONFIGMAP_NAME-2.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: CONFIGMAP_NAME-2
      namespace: config-management-system
    immutable: true
    # You can use the same format as the default values file to override
    # default values.
    data:
      DATA_KEY: |-
        image:
          pullPolicy: Never
        primary:
          resources:
            limits:
              cpu: 100m
              memory: 256Mi
            requests:
              cpu: 250m
              memory: 200Mi
    
    EOF
    
  7. מעדכנים את אובייקט RootSync כך שיפנה אל ConfigMap החדש:

    cat <<EOF>> ROOT_SYNC_NAME.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: ROOT_SYNC_NAME
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      sourceType: helm
      helm:
        repo: oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
        chart: mysql
        version: 9.3.1
        releaseName: my-mysql
        namespace: test
        auth: k8sserviceaccount
        # use the optional field spec.helm.valuesFilesRefs to override default values
        # by referencing a ConfigMap
        valuesFileRefs:
        - name: CONFIGMAP_NAME-2
          dataKey: DATA_KEY
    
    EOF
    
  8. מחילים את אובייקט ConfigMap:

    kubectl apply -f CONFIGMAP_NAME-2.yaml
    
  9. מחילים את אובייקט RootSync:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  10. מוודאים ש-Config Sync מסנכרן מהתמונה:

    nomos status --contexts=$(kubectl config current-context)
    

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

    kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy
    

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