אתם יכולים להשתמש ב-ComputeClasses של Google Kubernetes Engine (GKE) כדי ליצור צמתים שעומדים בדרישות שונות של עומסי עבודה. אפשר להשתמש ב-ComputeClasses כדי ליצור חומרה ל-Pods. בהתאם ל-ComputeClass, יכול להיות שהחומרה הזו תהיה מבוקשת מאוד, הזמינות שלה תהיה מוגבלת או שהיא תהיה יקרה יחסית לארגון שלכם. במדריך הזה מוסבר איך להשתמש ב-Kubernetes RBAC וב-ValidatingAdmissionPolicies כדי להגביל את היצירה, המחיקה, השינוי והבחירה של ComputeClasses.
ההגבלות האלה יכולות לעזור לכם למנוע מצבים כמו הבאים:
- לפודים שלא צריכים חומרה מיוחדת כמו מעבדי GPU או TPU, נבחרים ComputeClasses שמבקשים את החומרה הזו.
- גורם לא מורשה יוצר או משנה ComputeClasses כדי לקבל גישה לחומרה ששמורה לעומסי עבודה קריטיים.
במסמך הזה נעשה שימוש בדוגמה של ValidatingAdmissionPolicy שחוסמת סוגים נפוצים של שימוש לרעה, כמו wildcard ComputeClass tolerations או בחירה של ComputeClasses ספציפיים שאסורים לשימוש. אפשר לשנות את ValidatingAdmissionPolicy כדי לעמוד בדרישות שספציפיות לארגון שלכם, כמו חסימת עומסי עבודה מצוותים מסוימים משימוש ב-ComputeClasses.
מטרות
- אפשר להשתמש ב-ValidatingAdmissionPolicy כדי להגביל את ComputeClasses ש-Pods יכולים לבחור בכל מרחב שמות לרשימה מאושרת.
- משתמשים בבקרת גישה מבוססת-תפקידים (RBAC) כדי להגביל את המשתמשים שיכולים ליצור, לשנות או למחוק ComputeClasses באשכולות.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים 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 .
-
אם משתמשים בפרויקט קיים, מוודאים שיש את ההרשאות הנדרשות כדי להשלים את ההדרכה. אם משתמשים בפרויקט חדש, לא צריך לוודא כי כבר יש את ההרשאות הנדרשות.
מפעילים את Kubernetes Engine API:
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידיםgcloud services enable container.googleapis.com
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים 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 .
-
אם משתמשים בפרויקט קיים, מוודאים שיש את ההרשאות הנדרשות כדי להשלים את ההדרכה. אם משתמשים בפרויקט חדש, לא צריך לוודא כי כבר יש את ההרשאות הנדרשות.
מפעילים את Kubernetes Engine API:
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידיםgcloud services enable container.googleapis.com
- אם אתם משתמשים במעטפת מקומית, צריך להתקין את הרכיב
kubectl:gcloud components install kubectl
- מוודאים שיש לכם אשכול GKE שמשתמש בגרסה 1.30 ואילך. אפשר גם ליצור אשכול Autopilot לצורך המדריך הזה.
- מגדירים את האשכול לקבוצות Google לצורך RBAC:
- מגדירים את קבוצת
gke-security-groupsבדומיין. - מפעילים את קבוצות Google עבור RBAC באשכול.
מידע נוסף מופיע במאמר בנושא הגדרת קבוצות Google.
- מגדירים את קבוצת
התפקידים הנדרשים
כדי לקבל את ההרשאות שנדרשות ליצירת כללי מדיניות של RBAC ואובייקטים של Kubernetes באשכול, צריך לבקש מהאדמין להקצות לכם את תפקיד ה-IAM Kubernetes Engine Admin (role/container.admin) בפרויקט.
כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
הכנת הסביבה
כדי להכין את האשכול למשימות היצירה והאימות במדריך הזה, פועלים לפי השלבים הבאים:
מתחברים לאשכול:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATIONמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול. -
CONTROL_PLANE_LOCATION: האזור או התחום (zone) של מישור הבקרה של האשכול, למשלus-central1אוus-central1-a.
-
יוצרים מרחב שמות לשימוש במדריך הזה. אפשר גם להשתמש בכל מרחב שמות קיים באשכול.
kubectl create namespace computeclass-vap-tutorialיוצרים מדיניות RBAC שמעניקה גישה לניהול ValidatingAdmissionPolicies ו-ValidatingAdmissionPolicyBindings:
שומרים את קובץ המניפסט הבא בשם
validatingadmissionpolicy-editor.yaml:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: validatingadmissionpolicy-editor rules: - apiGroups: ["admissionregistration.k8s.io"] resources: ["validatingadmissionpolicies","validatingadmissionpolicybindings"] verbs: ["get", "list", "create", "update", "patch", "delete"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: edit-validatingadmissionpolicies subjects: - kind: User name: USER_ACCOUNT apiGroup: rbac.authorization.k8s.io roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: validatingadmissionpolicy-editorמחליפים את
USER_ACCOUNTבכתובת האימייל של חשבון המשתמש.יוצרים את מדיניות RBAC:
kubectl apply -f validatingadmissionpolicy-editor.yaml
יוצרים ComputeClass באשכול. אם באשכול כבר יש ComputeClass, אפשר לדלג על השלב הזה.
שומרים את קובץ המניפסט הבא בשם
access-computeclass.yaml:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: access-restriction-class spec: priorities: - machineFamily: e2 nodePoolAutoCreation: enabled: true whenUnsatisfiable: ScaleUpAnywayיוצרים את ComputeClass:
kubectl apply -f access-computeclass.yaml
יצירת ValidatingAdmissionPolicy
כדי להגביל את ComputeClasses שאפשר לבחור עבור Pods, יוצרים ValidatingAdmissionPolicy ומחילים אותו במרחב שמות ספציפי. משתמשים במפרט ValidatingAdmissionPolicy כדי לקבוע איך אפשר לבחור ComputeClasses עבור Pods. כך יוצרים את המדיניות הזו ומאכפים אותה:
שומרים את המניפסט הבא של ValidatingAdmissionPolicy בתור
restrict-computeclass-usage-vap.yaml:apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicy metadata: name: restrict-computeclass-usage spec: failurePolicy: Fail # If an internal error occurs, deny the request. variables: # Check whether the admission request is for a Deployment. - name: isDeployment expression: "object.kind == 'Deployment'" # Get the Pod specification from the admission request by reading the # spec.template.spec field for Deployments or the spec field for static Pods. - name: podSpec expression: "variables.isDeployment ? object.spec.template.spec : object.spec" # Check whether a node selector or an affinity rule that explicitly requests a # disallowed ComputeClass. - name: hasForbiddenNodeSelectorOrAffinity expression: >- (has(variables.podSpec.nodeSelector) && variables.podSpec.nodeSelector['cloud.google.com/compute-class'] == 'COMPUTECLASS_NAME') || (has(variables.podSpec.affinity) && has(variables.podSpec.affinity.nodeAffinity) && has(variables.podSpec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution) && variables.podSpec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms.exists(term, has(term.matchExpressions) && term.matchExpressions.exists( exp, exp.key == 'cloud.google.com/compute-class' && exp.operator == 'In' && exp.values.exists(v, v == 'COMPUTECLASS_NAME') ) )) # Check whether the Pod has a toleration for the taint that corresponds to a # disallowed ComputeClass. - name: hasForbiddenComputeClassToleration expression: >- has(variables.podSpec.tolerations) && variables.podSpec.tolerations.exists(t, t.key == 'cloud.google.com/compute-class' && (t.operator == 'Exists' || (t.operator == 'Equal' && t.value == 'COMPUTECLASS_NAME')) && has(t.effect) && t.effect == 'NoSchedule') # Check whether the Pod has a toleration that could match any taint. - name: hasWildcardToleration expression: >- has(variables.podSpec.tolerations) && variables.podSpec.tolerations.exists(t, (t.operator == 'Exists' && !(has(t.key) && t.key != '')) ) # Trigger the ValidatingAdmissionPolicy when Pods or Deployments are created or # updated. matchConstraints: resourceRules: - apiGroups: [""] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["pods"] - apiGroups: ["apps"] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["deployments"] # Validate whether any of the expressions in the variables section evaluate to # true. validations: - expression: >- !(variables.hasForbiddenNodeSelectorOrAffinity || variables.hasForbiddenComputeClassToleration || variables.hasWildcardToleration) message: >- Pods and Deployments in this namespace cannot request ComputeClass COMPUTECLASS_NAME or use wildcard tolerations.מחליפים את
COMPUTECLASS_NAMEבשם של ComputeClass שרוצים למנוע מ-Pods לבחור.ל-ValidatingAdmissionPolicy הזה יש את המאפיינים הבאים:
- טריגרים ל-Pods סטטיים או ל-Pods בפריסות.
החיפוש ימצא Pods שמבצעים את הפעולות הבאות:
- משתמשים בבורר צמתים או בכלל זיקה לצמתים כדי לבחור במפורש ComputeClass ספציפי שאסור להשתמש בו.
- צריך להשתמש בטולרנטיות שמתאימה ל-דחייה (taint) של צומת עבור ComputeClass ספציפי שלא מותר לשימוש.
- משתמשים בטולרנטיות שתואמת לכל הדחיות של הצמתים באשכול.
זו דוגמה ל-ValidatingAdmissionPolicy. אתם יכולים להשתמש בביטויים כדי להפעיל את המדיניות על סמך התנאים שלכם, למשל כדי למנוע מ-Pods עם תוויות ספציפיות לבחור ComputeClasses מסוימים.
יוצרים את ValidatingAdmissionPolicy:
kubectl apply -f restrict-computeclass-usage-vap.yamlשומרים את ValidatingAdmissionPolicyBinding הבא בתור
restrict-computeclass-usage-binding.yaml:apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicyBinding metadata: name: restrict-computeclass-usage-binding spec: policyName: restrict-computeclass-usage validationActions: ["Deny","Audit"] matchResources: namespaceSelector: matchLabels: kubernetes.io/metadata.name: computeclass-vap-tutorial # Replace with the name of any namespace in the cluster.ה-ValidatingAdmissionPolicyBinding הזה אוכף את ה-ValidatingAdmissionPolicy מהשלב הקודם במרחב השמות
computeclass-vap-tutorial. הערכים בשדהvalidationActionsדוחים את ה-Pods או את ה-Deployments שמפירים את ValidatingAdmissionPolicy ומוסיפים רשומה ליומן הביקורת של Kubernetes.יוצרים את ValidatingAdmissionPolicyBinding:
kubectl apply -f restrict-computeclass-usage-binding.yaml
הגדרה של כללי מדיניות RBAC
בנוסף לשימוש ב-ValidatingAdmissionPolicy כדי למנוע מעומסי עבודה להשתמש ב-ComputeClasses מסוימים, אפשר להשתמש ב-RBAC כדי למנוע מחשבונות ראשיים לא מורשים ליצור ולשנות את ה-ComputeClasses באשכול. בשלבים הבאים מוסבר איך להעניק גישה ל-ComputeClasses לקבוצה ספציפית של משתמשים באמצעות קבוצות Google ל-RBAC:
יוצרים קבוצה לעורכים של ComputeClass:
במסוף Google Admin, עוברים לדף Groups.
לוחצים על יצירת קבוצה.
בדף פרטי הקבוצה, מבצעים את הפעולות הבאות:
- בשדה שם הקבוצה, מציינים
computeclass-editors. - בשדה כתובת אימייל קבוצתית, מציינים את הערך
computeclass-editors. - מסמנים את תיבת הסימון אבטחה.
- לוחצים על הבא.
- בשדה שם הקבוצה, מציינים
בדף Access type, בודקים שבתיבת הסימון Who can view members בעמודה Group members מסומנת.
לוחצים על יצירת קבוצה.
בתפריט הניווט, לוחצים על ספרייה > קבוצות.
מעבירים את העכבר מעל השורה gke-security-groups ולוחצים על צירוף חברים לקבוצה.
בתיבת הדו-שיח Add members to gke-security-groups, מציינים את
computeclass-editorsובוחרים את הקבוצה מהתוצאות.לוחצים על הוספה לקבוצה.
מוסיפים את כתובות האימייל של המשתמשים המורשים לקבוצה
computeclass-editors.שומרים את ה-ClusterRole הבא בתור
computeclass-editor-clusterrole.yaml:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: computeclass-editor rules: - apiGroups: ["cloud.google.com"] resources: ["computeclasses"] verbs: ["create","update"]יוצרים את ClusterRole:
kubectl apply -f computeclass-editor-clusterrole.yamlשומרים את ClusterRoleBinding הבא בתור
computeclass-editor-role-binding.yaml:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: computeclass-editor-role-binding subjects: - kind: Group name: computeclass-editors@GROUP_DOMAIN apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: computeclass-editor apiGroup: rbac.authorization.k8s.io # Required for role referencesמחליפים את
GROUP_DOMAINבשם הדומיין של קבוצתcomputeclass-editors.יוצרים את ClusterRoleBinding:
kubectl apply -f computeclass-editor-role-binding.yaml
אימות ההגבלות
בקטעים הבאים מוסבר איך לוודא שההגבלות שהגדרתם בקטעים הקודמים פועלות כמצופה. אם אתם מגדירים הגבלות משלכם במדיניות ValidatingAdmissionPolicies או במדיניות RBAC, אתם יכולים לבדוק את ההגבלות על ידי יצירת עומס עבודה שמפר את המדיניות הזו.
אימות של ValidatingAdmissionPolicy
שומרים את אחד מהמניפסטים הבאים, שכל אחד מהם מפר תנאי אחר של ValidatingAdmissionPolicy:
פריסה שמשתמשת בבורר צמתים כדי לבחור ComputeClass שלא מותר:
apiVersion: apps/v1 kind: Deployment metadata: name: disallowed-computeclass-deployment namespace: computeclass-vap-tutorial spec: replicas: 1 selector: matchLabels: app: forbidden-selector-app template: metadata: labels: app: forbidden-selector-app spec: containers: - name: my-app-container image: nginx:latest # The node selector triggers the policy. nodeSelector: cloud.google.com/compute-class: COMPUTECLASS_NAMEפריסה עם סבילות ל-ComputeClass אסור:
apiVersion: apps/v1 kind: Deployment metadata: name: disallowed-computeclass-deployment-toleration namespace: computeclass-vap-tutorial spec: replicas: 1 selector: matchLabels: app: forbidden-selector-app template: metadata: labels: app: forbidden-selector-app spec: containers: - name: my-app-container image: nginx:latest tolerations: - key: cloud.google.com/compute-class operator: Equal value: COMPUTECLASS_NAME effect: NoScheduleפריסה עם כלל של צירוף צומת ל-ComputeClass שלא מותר:
apiVersion: apps/v1 kind: Deployment metadata: name: disallowed-computeclass-deployment-toleration namespace: computeclass-vap-tutorial spec: replicas: 1 selector: matchLabels: app: forbidden-selector-app template: metadata: labels: app: forbidden-selector-app spec: containers: - name: my-app-container image: nginx:latest affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: cloud.google.com/compute-class operator: In values: - COMPUTECLASS_NAMEPod שיש לו טולרנטיות לכל דחיית צומת באשכול:
apiVersion: v1 kind: Pod metadata: name: disallowed-computeclass-deployment-toleration namespace: computeclass-vap-tutorial spec: containers: - name: my-app-container image: nginx:latest tolerations: - operator: Exists effect: NoSchedule
יוצרים את עומס העבודה לבדיקה:
kubectl apply -f PATH_TO_WORKLOAD_MANIFESTהפלט אמור להיראות כך:
Error from server (BadRequest): admission webhook "validation-policy.kubernetes.io" denied the request: Pods and Deployments in this namespace cannot request ComputeClass COMPUTECLASS_NAME or use wildcard tolerations.
אימות הגדרות ה-RBAC
כדי לאמת את הגדרת RBAC, פועלים לפי השלבים הבאים:
מבצעים אימות לאשכול באמצעות פרטי הכניסה של משתמש שהוא חבר בקבוצה
computeclass-editors.בודקים אם המשתמש יכול ליצור ComputeClass:
kubectl auth can-i create computeclasses.cloud.google.com \ --as=MEMBER_USERמחליפים את
MEMBER_USERבכתובת האימייל של משתמש שהוא חבר בקבוצה.הפלט הוא
yes.מבצעים אימות לאשכול באמצעות פרטי הכניסה של משתמש שלא חבר בקבוצה
computeclass-editors.בודקים אם המשתמש יכול ליצור ComputeClass:
kubectl auth can-i create computeclasses.cloud.google.com \ --as=NON_MEMBER_USERמחליפים את
NON_MEMBER_USERבכתובת האימייל של משתמש שלא חבר בקבוצה.הפלט הוא
no.
אם הפלט של הפקודה kubectl auth can-i הוא yes עבור משתמש שלא חבר בקבוצה, צריך לוודא את הדברים הבאים:
- הקבוצה
computeclass-editorsהיא חברה בקבוצהgke-security-groups. - כתובת האימייל של הקבוצה ב-ClusterRoleBinding היא כתובת האימייל המדויקת של הקבוצה, כמו
computeclass-editors@example.com.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
אם תפרסו את מדיניות ValidatingAdmissionPolicy ואת מדיניות RBAC שמוסברות במדריך הזה באשכול ייצור, GKE יחסום בקשות API ו-Pods נכנסים שמפירים את המדיניות. כדי להשאיר את המדיניות הזו פעילה, אפשר לדלג על הקטע הזה. בקטעים הבאים מוסבר איך למחוק את הפרויקט או משאבים ספציפיים אם פעלתם לפי המדריך הזה בסביבת למידה או בסביבת בדיקה.
מחיקת הפרויקט
כדי למחוק Google Cloud פרויקט:
gcloud projects delete PROJECT_ID
מחיקת משאבים בודדים
מוחקים את ComputeClass שיצרתם:
kubectl delete computeclass access-restriction-classמוחקים את ValidatingAdmissionPolicy ואת ValidatingAdmissionPolicyBinding:
kubectl delete validatingadmissionpolicy restrict-computeclass-usage kubectl delete validatingadmissionpolicybinding restrict-computeclass-usage-bindingמחיקת ClusterRoles ו-ClusterRoleBindings:
kubectl delete clusterroles \ computeclass-editor validatingadmissionpolicy-editor kubectl delete clusterrolebindings \ computeclass-editor-role-binding edit-validatingadmissionpoliciesמוחקים את מרחב השמות לדוגמה:
kubectl delete namespace computeclass-vap-tutorial
המאמרים הבאים
- שיטות מומלצות לאבטחת אשכולות
- כדאי להעמיק את הקריאה ולהכיר דוגמאות לארכיטקטורות, תרשימים ושיטות מומלצות בנושאי Google Cloud. כל אלה זמינים במרכז הארכיטקטורה של Cloud.