Membatasi akses untuk mengubah dan memilih ComputeClass

Anda dapat menggunakan ComputeClasses Google Kubernetes Engine (GKE) untuk membuat node yang memenuhi berbagai persyaratan workload. Pod dapat menggunakan ComputeClass untuk membuat hardware. Bergantung pada ComputeClass, hardware tersebut mungkin banyak diminati, ketersediaannya terbatas, atau relatif mahal untuk perusahaan Anda. Tutorial ini menunjukkan cara menggunakan RBAC Kubernetes dan ValidatingAdmissionPolicies untuk membatasi pembuatan, penghapusan, modifikasi, dan pemilihan ComputeClass.

Pembatasan ini dapat membantu Anda mencegah situasi seperti berikut:

  • Pod yang tidak memerlukan hardware khusus seperti GPU atau TPU akan memilih ComputeClass yang meminta hardware tersebut.
  • Entitas yang tidak sah membuat atau mengubah ComputeClass untuk mendapatkan akses ke hardware yang dicadangkan untuk beban kerja penting.

Dokumen ini menggunakan contoh ValidatingAdmissionPolicy yang memblokir jenis penyalahgunaan umum, seperti toleransi ComputeClass karakter pengganti atau pemilihan ComputeClass tertentu yang tidak diizinkan. Anda dapat mengubah ValidatingAdmissionPolicy untuk memenuhi persyaratan khusus organisasi Anda, seperti memblokir workload dari tim tertentu agar tidak menggunakan ComputeClass.

Tujuan

  • Gunakan ValidatingAdmissionPolicy untuk membatasi ComputeClass yang dapat dipilih Pod di setiap namespace ke daftar yang disetujui.
  • Gunakan kontrol akses berbasis peran (RBAC) untuk membatasi siapa yang dapat membuat, mengubah, atau menghapus ComputeClass di cluster Anda.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, baca bagian Pembersihan.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Instal Google Cloud CLI.

  3. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  4. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  5. Buat atau pilih Google Cloud project.

    Peran yang diperlukan untuk memilih atau membuat project

    • Pilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project mana pun yang telah diberi peran.
    • Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator (roles/resourcemanager.projectCreator), yang berisi izin resourcemanager.projects.create. Pelajari cara memberikan peran.
    • Buat Google Cloud project:

      gcloud projects create PROJECT_ID

      Ganti PROJECT_ID dengan nama untuk Google Cloud project yang Anda buat.

    • Pilih project Google Cloud yang Anda buat:

      gcloud config set project PROJECT_ID

      Ganti PROJECT_ID dengan nama project Google Cloud Anda.

  6. Jika Anda menggunakan project yang sudah ada untuk panduan ini, pastikan Anda memiliki izin yang diperlukan untuk menyelesaikan panduan ini. Jika berhasil membuat project baru, berarti Anda sudah memiliki izin yang diperlukan.

  7. Verifikasi bahwa penagihan diaktifkan untuk project Google Cloud Anda.

  8. Aktifkan Kubernetes Engine API:

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin (roles/serviceusage.serviceUsageAdmin), yang berisi izin serviceusage.services.enable. Pelajari cara memberikan peran.

    gcloud services enable container.googleapis.com
  9. Instal Google Cloud CLI.

  10. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  11. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  12. Buat atau pilih Google Cloud project.

    Peran yang diperlukan untuk memilih atau membuat project

    • Pilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project mana pun yang telah diberi peran.
    • Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator (roles/resourcemanager.projectCreator), yang berisi izin resourcemanager.projects.create. Pelajari cara memberikan peran.
    • Buat Google Cloud project:

      gcloud projects create PROJECT_ID

      Ganti PROJECT_ID dengan nama untuk Google Cloud project yang Anda buat.

    • Pilih project Google Cloud yang Anda buat:

      gcloud config set project PROJECT_ID

      Ganti PROJECT_ID dengan nama project Google Cloud Anda.

  13. Jika Anda menggunakan project yang sudah ada untuk panduan ini, pastikan Anda memiliki izin yang diperlukan untuk menyelesaikan panduan ini. Jika berhasil membuat project baru, berarti Anda sudah memiliki izin yang diperlukan.

  14. Verifikasi bahwa penagihan diaktifkan untuk project Google Cloud Anda.

  15. Aktifkan Kubernetes Engine API:

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin (roles/serviceusage.serviceUsageAdmin), yang berisi izin serviceusage.services.enable. Pelajari cara memberikan peran.

    gcloud services enable container.googleapis.com
  16. Jika Anda menggunakan shell lokal, instal komponen kubectl:
    gcloud components install kubectl
  17. Pastikan Anda memiliki cluster GKE yang menggunakan versi 1.30 atau yang lebih baru. Anda juga dapat membuat cluster Autopilot untuk tutorial ini.
  18. Konfigurasi cluster Anda untuk Google Grup untuk RBAC:
    1. Siapkan grup gke-security-groups di domain Anda.
    2. Aktifkan Google Grup untuk RBAC di cluster Anda.

    Untuk mengetahui informasi selengkapnya, lihat Menyiapkan Google Grup.

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan guna membuat kebijakan RBAC dan objek Kubernetes di cluster Anda, minta administrator untuk memberi Anda peran IAM Kubernetes Engine Admin (role/container.admin) di project Anda. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Menyiapkan lingkungan

Untuk menyiapkan cluster Anda untuk tugas pembuatan dan verifikasi dalam tutorial ini, ikuti langkah-langkah berikut:

  1. Buat koneksi ke cluster Anda:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda.
    • CONTROL_PLANE_LOCATION: region atau zona bidang kontrol cluster, seperti us-central1 atau us-central1-a.
  2. Buat namespace yang akan digunakan untuk tutorial ini. Anda juga dapat menggunakan namespace yang sudah ada di cluster.

    kubectl create namespace computeclass-vap-tutorial
    
  3. Buat kebijakan RBAC yang memberikan akses untuk mengelola ValidatingAdmissionPolicies dan ValidatingAdmissionPolicyBindings:

    1. Simpan manifes berikut sebagai 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
      

      Ganti USER_ACCOUNT dengan alamat email akun pengguna Anda.

    2. Buat kebijakan RBAC:

      kubectl apply -f validatingadmissionpolicy-editor.yaml
      
  4. Buat ComputeClass di cluster Anda. Jika cluster sudah memiliki ComputeClass, lewati langkah ini.

    1. Simpan manifes berikut sebagai access-computeclass.yaml:

      apiVersion: cloud.google.com/v1
      kind: ComputeClass
      metadata:
        name: access-restriction-class
      spec:
        priorities:
        - machineFamily: e2
        nodePoolAutoCreation:
          enabled: true
        whenUnsatisfiable: ScaleUpAnyway
      
    2. Buat ComputeClass:

      kubectl apply -f access-computeclass.yaml
      

Membuat ValidatingAdmissionPolicy

Untuk membatasi ComputeClass yang dapat dipilih Pod, Anda membuat ValidatingAdmissionPolicy dan menerapkannya di namespace tertentu. Anda menggunakan spesifikasi ValidatingAdmissionPolicy untuk mengontrol cara Pod dapat memilih ComputeClass. Langkah-langkah berikut menunjukkan cara membuat dan menerapkan kebijakan ini:

  1. Simpan manifes ValidatingAdmissionPolicy berikut sebagai 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.
    

    Ganti COMPUTECLASS_NAME dengan nama ComputeClass yang ingin Anda cegah agar tidak dipilih oleh Pod.

    ValidatingAdmissionPolicy ini memiliki properti berikut:

    • Pemicu untuk Pod statis atau Pod dalam Deployment.
    • Menemukan Pod yang melakukan salah satu hal berikut:

      • Gunakan pemilih node atau aturan afinitas node untuk memilih ComputeClass tertentu yang tidak diizinkan secara eksplisit.
      • Gunakan toleransi yang sesuai dengan taint node untuk ComputeClass tertentu yang tidak diizinkan.
      • Gunakan toleransi yang cocok dengan semua taint node dalam cluster.

    ValidatingAdmissionPolicy ini adalah contoh. Anda dapat menggunakan ekspresi untuk memicu kebijakan berdasarkan kondisi Anda sendiri, seperti mencegah Pod yang memiliki label tertentu memilih ComputeClass tertentu.

  2. Buat ValidatingAdmissionPolicy:

    kubectl apply -f restrict-computeclass-usage-vap.yaml
    
  3. Simpan ValidatingAdmissionPolicyBinding berikut sebagai 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 ini menerapkan ValidatingAdmissionPolicy dari langkah sebelumnya di namespace computeclass-vap-tutorial. Nilai di kolom validationActions menolak Pod atau Deployment yang melanggar ValidatingAdmissionPolicy dan menambahkan entri ke log audit Kubernetes.

  4. Buat ValidatingAdmissionPolicyBinding:

    kubectl apply -f restrict-computeclass-usage-binding.yaml
    

Mengonfigurasi kebijakan RBAC

Selain menggunakan ValidatingAdmissionPolicy untuk mencegah workload menggunakan ComputeClass tertentu, gunakan RBAC untuk mencegah principal yang tidak sah membuat dan mengubah ComputeClass di cluster Anda. Langkah-langkah berikut menunjukkan cara memberikan akses ke ComputeClass untuk grup pengguna tertentu dengan menggunakan Google Grup untuk RBAC:

  1. Buat grup untuk editor ComputeClass:

    1. Di konsol Admin Google, buka halaman Grup.

      Buka Grup

    2. Klik Buat grup.

    3. Di halaman Detail grup, lakukan hal berikut:

      1. Di kolom Nama grup, tentukan computeclass-editors.
      2. Di kolom Email grup, tentukan computeclass-editors.
      3. Centang kotak Keamanan.
      4. Klik Berikutnya.
    4. Di halaman Jenis akses, di kolom Anggota grup, pastikan kotak centang Siapa yang dapat melihat anggota dicentang.

    5. Klik Buat grup.

    6. Di menu navigasi, klik Direktori > Grup.

    7. Arahkan kursor ke baris gke-security-groups, lalu klik Tambahkan anggota.

    8. Di dialog Add members to gke-security-groups, tentukan computeclass-editors dan pilih grup tersebut dari hasil.

    9. Klik Tambahkan ke grup.

  2. Tambahkan alamat email pengguna yang diberi otorisasi ke grup computeclass-editors.

  3. Simpan ClusterRole berikut sebagai 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"]
    
  4. Buat ClusterRole:

    kubectl apply -f computeclass-editor-clusterrole.yaml
    
  5. Simpan ClusterRoleBinding berikut sebagai 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
    

    Ganti GROUP_DOMAIN dengan nama domain grup computeclass-editors.

  6. Buat ClusterRoleBinding:

    kubectl apply -f computeclass-editor-role-binding.yaml
    

Memverifikasi batasan Anda

Bagian berikut menunjukkan cara memverifikasi bahwa batasan yang Anda konfigurasi di bagian sebelumnya berfungsi seperti yang diharapkan. Jika Anda mengonfigurasi pembatasan sendiri di ValidatingAdmissionPolicies atau kebijakan RBAC, uji pembatasan dengan membuat workload yang melanggar kebijakan tersebut.

Memverifikasi ValidatingAdmissionPolicy

  1. Simpan salah satu manifes berikut, yang masing-masing melanggar kondisi ValidatingAdmissionPolicy yang berbeda:

    • Deployment yang menggunakan pemilih node untuk memilih ComputeClass yang tidak diizinkan:

      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
      
    • Deployment yang memiliki toleransi untuk ComputeClass yang tidak diizinkan:

      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
      
    • Deployment yang memiliki aturan afinitas node untuk ComputeClass yang tidak diizinkan:

      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_NAME
      
    • Pod yang memiliki toleransi untuk taint node apa pun dalam cluster:

      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
      
  2. Buat workload pengujian:

    kubectl apply -f PATH_TO_WORKLOAD_MANIFEST
    

    Outputnya mirip dengan hal berikut ini:

    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.
    

Memverifikasi konfigurasi RBAC

Untuk memverifikasi konfigurasi RBAC, ikuti langkah-langkah berikut:

  1. Lakukan autentikasi ke cluster menggunakan kredensial pengguna yang merupakan anggota grup computeclass-editors.

  2. Periksa apakah pengguna dapat membuat ComputeClass:

    kubectl auth can-i create computeclasses.cloud.google.com \
        --as=MEMBER_USER
    

    Ganti MEMBER_USER dengan alamat email pengguna yang merupakan anggota grup.

    Outputnya adalah yes.

  3. Lakukan autentikasi ke cluster menggunakan kredensial pengguna yang bukan anggota grup computeclass-editors.

  4. Periksa apakah pengguna dapat membuat ComputeClass:

    kubectl auth can-i create computeclasses.cloud.google.com \
        --as=NON_MEMBER_USER
    

    Ganti NON_MEMBER_USER dengan alamat email pengguna yang bukan anggota grup.

    Outputnya adalah no.

Jika output perintah kubectl auth can-i adalah yes untuk pengguna yang bukan anggota grup, verifikasi hal berikut:

  • Grup computeclass-editors adalah anggota grup gke-security-groups.
  • Alamat email grup di ClusterRoleBinding Anda adalah alamat email grup yang sama persis, seperti computeclass-editors@example.com.

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Jika Anda men-deploy kebijakan ValidatingAdmissionPolicy dan RBAC dalam tutorial ini di cluster produksi, GKE akan memblokir Pod dan permintaan API yang masuk yang melanggar kebijakan tersebut. Agar kebijakan ini tetap aktif, lewati bagian ini. Bagian berikut menunjukkan cara menghapus project atau setiap resource jika Anda mengikuti tutorial ini di lingkungan pembelajaran atau pengujian.

Menghapus project

    Menghapus Google Cloud project:

    gcloud projects delete PROJECT_ID

Menghapus resource satu per satu

  1. Hapus ComputeClass yang Anda buat:

    kubectl delete computeclass access-restriction-class
    
  2. Hapus ValidatingAdmissionPolicy dan ValidatingAdmissionPolicyBinding:

    kubectl delete validatingadmissionpolicy restrict-computeclass-usage
    kubectl delete validatingadmissionpolicybinding restrict-computeclass-usage-binding
    
  3. Hapus ClusterRole dan ClusterRoleBinding:

    kubectl delete clusterroles \
        computeclass-editor validatingadmissionpolicy-editor
    kubectl delete clusterrolebindings \
        computeclass-editor-role-binding edit-validatingadmissionpolicies
    
  4. Hapus namespace contoh:

    kubectl delete namespace computeclass-vap-tutorial
    

Langkah berikutnya