שימוש באילוצים של מדיניות העלות והאמינות

‫Policy Controller מגיע עם ספריית ברירת מחדל של תבניות אילוץ שאפשר להשתמש בהן עם חבילת המדיניות בנושא עלות ואמינות. החבילה הזו עוזרת לאמץ שיטות מומלצות להרצת אשכולות GKE חסכוניים בלי לפגוע בביצועים או באמינות של עומסי העבודה.

בדף הזה מוסבר איך להחיל חבילת מדיניות באופן ידני. אפשרות אחרת היא להחיל חבילות מדיניות ישירות.

מגבלות של חבילת כללי מדיניות בנושא עלות ואמינות

שם המגבלה תיאור המגבלה
cost-reliability-v2023-pod-disruption-budget נדרשת הגדרה של PodDisruptionBudget עבור Deployments,‏ ReplicaSets,‏ StatefulSets ו-ReplicationControllers.
cost-reliability-v2023-pod-resources-best-practices הדרישה היא שהמאגרי התגים יגדירו בקשות למשאבים ויפעלו לפי השיטות המומלצות.
cost-reliability-v2023-required-labels כל ה-Pods וה-Controllers (ReplicaSet,‏ Deployment,‏ StatefulSet ו-DaemonSet) צריכים לכלול את התוויות הנדרשות: environment,‏ team ו-app.
cost-reliability-v2023-restrict-repos הגבלת קובצי אימג' של קונטיינרים לרשימת מאגרים מותרים כדי להשתמש ב-Artifact Registry וליהנות מהזרמת תמונות.
cost-reliability-v2023-spotvm-termination-grace נדרש terminationGracePeriodSeconds של 15 שניות או פחות עבור Pods ו-Pod Templates עם nodeSelector או nodeAfffinty ל-gke-spot.

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

  1. מתקינים ומאתחלים את Google Cloud CLI, שמספק את הפקודות gcloud ו-kubectl שמשמשות בהוראות האלה. אם אתם משתמשים ב-Cloud Shell, ‏ Google Cloud CLI מותקן מראש.
  2. מתקינים את Policy Controller באשכול עם ספריית ברירת המחדל של תבניות אילוץ. בנוסף, צריך להפעיל תמיכה באילוצים שלמותיים כי החבילה הזו מכילה אילוצים כאלה.

הגדרת Policy Controller לאילוצים של הפניות

  1. שומרים את מניפסט ה-YAML הבא בקובץ בשם policycontroller-config.yaml. קובץ המניפסט מגדיר את Policy Controller כך שיעקוב אחרי סוגים ספציפיים של אובייקטים.

    apiVersion: config.gatekeeper.sh/v1alpha1
    kind: Config
    metadata:
      name: config
      namespace: "gatekeeper-system"
    spec:
      sync:
        syncOnly:
          - group: ""
            version: "v1"
            kind: "Service"
          - group: "policy"
            version: "v1"
            kind: "PodDisruptionBudget"
    
  2. החלת מניפסט policycontroller-config.yaml:

    kubectl apply -f policycontroller-config.yaml
    

הגדרת האשכול ועומס העבודה

  1. כל pod שנבחר על ידי service חייב לכלול בדיקות מוכנות.
  2. כל המאפיינים deployment, replicaset, statefulset ו-replicationcontroller חייבים לכלול poddisruptionbudget.
  3. כל מאגרי התגים צריכים לכלול בקשות מסוג cpu ו-memory, והמגבלה של memory צריכה להיות שווה לבקשות מסוג memory בהתאם לשיטות המומלצות.
  4. מוסיפים תוויות environment,‏ team ו-app לכל ה-Pods ולכל תבניות ה-Pods.
  5. כדי להפעיל סטרימינג של תמונות, צריך לארח קובצי אימג' בקונטיינר באמצעות Artifact Registry באותו אזור כמו האשכול. מאשרים את הגישה ל-Artifact Registry הרלוונטי לפי הדוגמה שבמאמר cost-reliability-v2023-restrict-repos.
  6. כל הפודים והתבניות של הפודים שמשתמשים ב-gke-spot חייבים לכלול terminationGracePeriodSeconds באורך של 15 שניות או פחות.

חבילת מדיניות בנושא עלות ואמינות של ביקורת

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

אפשר להחיל את כללי המדיניות האלה עם spec.enforcementAction שמוגדר כ-dryrun באמצעות kubectl,‏ kpt או סנכרון תצורות.

kubectl

  1. (אופציונלי) מציגים בתצוגה מקדימה את האילוצים של המדיניות באמצעות kubectl:

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023
    
  2. מחילים את אילוצי המדיניות באמצעות kubectl:

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023
    

    הפלט שיתקבל:

    gkespotvmterminationgrace.constraints.gatekeeper.sh/cost-reliability-v2023-spotvm-termination-grace created
    k8sallowedrepos.constraints.gatekeeper.sh/cost-reliability-v2023-restrict-repos created
    k8spoddisruptionbudget.constraints.gatekeeper.sh/cost-reliability-v2023-pod-disruption-budget created
    k8spodresourcesbestpractices.constraints.gatekeeper.sh/cost-reliability-v2023-pod-resources-best-practices created
    k8srequiredlabels.constraints.gatekeeper.sh/cost-reliability-v2023-required-labels created
    
  3. מוודאים שאילוצי המדיניות הותקנו ובודקים אם יש הפרות באשכול:

    kubectl get constraints -l policycontroller.gke.io/bundleName=cost-reliability-v2023
    

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

    NAME                                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    gkespotvmterminationgrace.constraints.gatekeeper.sh/cost-reliability-v2023-spotvm-termination-grace   dryrun               0
    
    NAME                                                                                                         ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spodresourcesbestpractices.constraints.gatekeeper.sh/cost-reliability-v2023-pod-resources-best-practices   dryrun               0
    
    NAME                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8spoddisruptionbudget.constraints.gatekeeper.sh/cost-reliability-v2023-pod-disruption-budget   dryrun               0
    
    NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8sallowedrepos.constraints.gatekeeper.sh/cost-reliability-v2023-restrict-repos   dryrun               0
    
    NAME                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/cost-reliability-v2023-required-labels   dryrun               0
    

kpt

  1. מתקינים ומגדירים את kpt.

    ההוראות האלה משתמשות ב-kpt כדי להתאים אישית ולפרוס משאבי Kubernetes.

  2. מורידים את חבילת המדיניות PCI-DSS v3.2.1 מ-GitHub באמצעות kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023
    
  3. מריצים את הפונקציה set-enforcement-action kpt כדי להגדיר את פעולת האכיפה של המדיניות לערך dryrun:

    kpt fn eval cost-reliability-v2023 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
    -- enforcementAction=dryrun
    
  4. מאתחלים את ספריית העבודה באמצעות kpt, שיוצר משאב למעקב אחרי שינויים:

    cd cost-reliability-v2023 kpt live init
    
  5. מחילים את אילוצי המדיניות באמצעות kpt:

    kpt live apply
    
  6. מוודאים שאילוצי המדיניות הותקנו ובודקים אם יש הפרות באשכול:

    kpt live status --output table --poll-until current
    

    הסטטוס CURRENT מאשר שההתקנה של ההגבלות בוצעה בהצלחה.

סנכרון תצורות

  1. מתקינים ומגדירים את kpt.

    ההוראות האלה משתמשות ב-kpt כדי להתאים אישית ולפרוס משאבי Kubernetes.

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

  2. עוברים לספריית הסנכרון של סנכרון תצורות:

    cd SYNC_ROOT_DIR
    

    כדי ליצור או להוסיף .gitignore באמצעות resourcegroup.yaml:

    echo resourcegroup.yaml >> .gitignore
    
  3. יוצרים ספרייה ייעודית של policies:

    mkdir -p policies
    
  4. מורידים את חבילת המדיניות בנושא עלות ואמינות מ-GitHub באמצעות kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/cost-reliability-v2023 policies/cost-reliability-v2023
    
  5. מריצים את הפונקציה set-enforcement-action kpt כדי להגדיר את פעולת האכיפה של המדיניות לערך dryrun:

    kpt fn eval policies/cost-reliability-v2023 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  6. (אופציונלי) מציגים בתצוגה מקדימה את אילוצי המדיניות שייווצרו:

    kpt live init policies/cost-reliability-v2023
    kpt live apply --dry-run policies/cost-reliability-v2023
    
  7. אם ספריית הסנכרון של סנכרון תצורות משתמשת ב-Kustomize, צריך להוסיף את policies/cost-reliability-v2023 ל-root kustomization.yaml. אחרת, מסירים את הקובץ policies/cost-reliability-v2023/kustomization.yaml:

    rm SYNC_ROOT_DIR/policies/cost-reliability-v2023/kustomization.yaml
    
  8. דחיפת השינויים למאגר סנכרון תצורות:

    git add SYNC_ROOT_DIR/policies/cost-reliability-v2023 git commit -m 'Adding Cost and Reliability policy audit enforcement'
    git push
    
  9. מאמתים את סטטוס ההתקנה:

    watch gcloud beta container fleet config-management status --project PROJECT_ID
    

    הסטטוס SYNCED מאשר שהמדיניות הותקנה.

הצגת הפרות מדיניות

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

אפשר גם להשתמש ב-kubectl כדי לראות את ההפרות באשכול באמצעות הפקודה הבאה:

  kubectl get constraint -l policycontroller.gke.io/bundleName=cost-reliability-v2023 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
  

אם יש הפרות, אפשר לראות רשימה של הודעות ההפרה לכל אילוץ באמצעות הפקודה:

  kubectl get constraint -l policycontroller.gke.io/bundleName=cost-reliability-v2023 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
  

שינוי פעולת האכיפה של חבילת המדיניות בנושא עלות ואמינות

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

kubectl

  1. משתמשים ב-kubectl כדי להגדיר את פעולת האכיפה של כללי המדיניות ל-warn:

    kubectl get constraints -l policycontroller.gke.io/bundleName=cost-reliability-v2023 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
    
  2. מוודאים שפעולת האכיפה של הגבלות המדיניות עודכנה:

    kubectl get constraints -l policycontroller.gke.io/bundleName=cost-reliability-v2023
    

kpt

  1. מריצים את הפונקציה set-enforcement-action kpt כדי להגדיר את פעולת האכיפה של המדיניות לערך warn:

    kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  2. החלת אילוצי המדיניות:

    kpt live apply
    

סנכרון תצורות

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

  1. עוברים לספריית הסנכרון של סנכרון תצורות:

    cd SYNC_ROOT_DIR
    
  2. מריצים את הפונקציה set-enforcement-action kpt כדי להגדיר את פעולת האכיפה של המדיניות לערך warn:

    kpt fn eval policies/cost-reliability-v2023 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. דחיפת השינויים למאגר סנכרון תצורות:

    git add SYNC_ROOT_DIR/policies/cost-reliability-v2023
    git commit -m 'Adding Cost and Reliability policy bundle warn enforcement'
    git push
    
  4. מאמתים את סטטוס ההתקנה:

    nomos status
    

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

בדיקת אכיפת המדיניות

יוצרים באשכול משאב שלא עומד בדרישות באמצעות הפקודה הבאה:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: wp-non-compliant
  labels:
    app: wordpress
spec:
  containers:
    - image: wordpress
      name: wordpress
      ports:
      - containerPort: 80
        hostPort: 80
        name: wordpress
EOF

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

Warning: [cost-reliability-v2023-pod-resources-best-practices] Container <wordpress> must set <cpu> request.
Warning: [cost-reliability-v2023-pod-resources-best-practices] Container <wordpress> must set <memory> request.
Warning: [cost-reliability-v2023-required-labels] This app is missing one or more required labels: `environment`, `team`, and `app`.
Warning: [cost-reliability-v2023-restrict-repos] container <wordpress> has an invalid image repo <wordpress>, allowed repos are ["gcr.io/gke-release/", "gcr.io/anthos-baremetal-release/", "gcr.io/config-management-release/", "gcr.io/kubebuilder/", "gcr.io/gkeconnect/", "gke.gcr.io/"]
pod/wp-non-compliant created

הסרה של חבילת מדיניות בנושא עלות ואמינות

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

kubectl

משתמשים ב-kubectl כדי להסיר את כללי המדיניות:

  kubectl delete constraint -l policycontroller.gke.io/bundleName=cost-reliability-v2023
  

kpt

מסירים את כללי המדיניות:

  kpt live destroy
  

סנכרון תצורות

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

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

    git rm -r SYNC_ROOT_DIR/policies/cost-reliability-v2023
    git commit -m 'Removing Cost and Reliability policies'
    git push
    
  2. בודקים את הסטטוס:

    nomos status
    

    האשכול אמור להציג סטטוס של SYNCED עם המשאבים שהוסרו.