Mengisolasi workload Anda di node pool khusus

Dokumen ini menjelaskan cara meningkatkan keamanan dan pengelolaan cluster Kubernetes Anda dengan mengisolasi workload container dalam node pool khusus di Google Distributed Cloud (GDC) yang terisolasi. Mengisolasi workload memberi Anda kontrol yang lebih besar atas pod dan mengurangi risiko serangan eskalasi akses di cluster Kubernetes Anda. Untuk mengetahui informasi selengkapnya tentang manfaat dan batasan node pool khusus, lihat Ringkasan isolasi node.

Ada beberapa alur kerja yang terlibat dalam mengisolasi workload container Anda, yang mencakup hal berikut:

  • Taint dan beri label pada node pool: Terapkan taint dan label ke node pool sehingga node pool tersebut menolak pod kecuali jika pod tersebut diberi label khusus untuk dijalankan di sana.

  • Tambahkan aturan toleransi dan afinitas node: Terapkan toleransi dan aturan ke pod Anda untuk memaksanya berjalan hanya di node pool yang ditentukan.

  • Pastikan pemisahan berfungsi: Pastikan node pool yang tercemar hanya menjalankan pod yang Anda beri label untuk dijalankan di sana.

Alur kerja ini ditujukan untuk audiens seperti administrator IT dalam grup administrator platform yang bertanggung jawab mengelola node pool cluster Kubernetes, dan developer aplikasi dalam grup operator aplikasi yang bertanggung jawab mengelola workload container. Untuk mengetahui informasi selengkapnya, lihat Audiens untuk dokumentasi GDC dengan air gap.

Sebelum memulai

Untuk menyelesaikan tugas dalam dokumen ini, Anda harus meminta izin yang diperlukan dan menyiapkan lingkungan Anda.

Meminta peran IAM

Anda harus memiliki peran tertentu untuk mendapatkan izin yang diperlukan guna mengisolasi workload container di cluster Kubernetes Anda. Peran yang Anda perlukan bergantung pada apakah Anda bekerja dalam cluster bersama yang memiliki cakupan organisasi atau cluster standar yang memiliki cakupan project. Untuk mengetahui informasi selengkapnya, lihat Konfigurasi cluster Kubernetes.

Peran cluster bersama

Hubungi Admin IAM Organisasi Anda untuk meminta peran berikut guna memberi taint dan label pada node pool di cluster bersama:

  • Admin Cluster Pengguna (user-cluster-admin): membuat, menghapus, mengedit, atau melihat resource cluster bersama yang dihosting di server API pengelolaan. Peran ini memberikan akses ke node pool cluster bersama.

  • Developer Cluster Pengguna (user-cluster-developer): membuat, menghapus, mengedit, atau melihat cluster bersama. Peran ini memberikan akses ke API bidang data yang dihosting dalam cluster bersama.

Peran ini tidak terikat ke namespace.

Peran cluster standar

Hubungi Admin IAM Project Anda untuk meminta peran berikut guna memberi taint dan label pada node pool di cluster standar:

  • Admin Cluster (cluster-admin): membuat, menghapus, mengedit, atau melihat semua resource di cluster standar. Peran ini memberikan akses ke API bidang data yang dihosting dalam cluster standar yang mengatur resource cluster.

  • Developer Cluster (cluster-developer): membuat, menghapus, mengedit, atau melihat cluster standar. Peran ini memberikan akses ke API bidang data yang dihosting dalam cluster standar yang mengatur cluster.

  • Admin Cluster Standar (standard-cluster-admin): membuat, menghapus, mengedit, atau melihat resource cluster standar yang dihosting di server API pengelolaan. Peran ini memberikan akses ke node pool cluster standar.

Peran ini terikat ke namespace project Anda.

Menyiapkan lingkungan Anda

Untuk menjalankan perintah terhadap a cluster Kubernetes menggunakan API, pastikan Anda memiliki resource berikut:

  • Login dan buat file kubeconfig untuk cluster Kubernetes.

  • Gunakan jalur kubeconfig cluster Kubernetes untuk mengganti KUBERNETES_CLUSTER_KUBECONFIG dalam petunjuk ini.

  • Login dan buat file kubeconfig untuk server API pengelolaan.

  • Gunakan jalur kubeconfig server API pengelolaan untuk mengganti MANAGEMENT_API_SERVER dalam petunjuk ini.

  • Pilih nama tertentu untuk taint node dan label node yang ingin Anda gunakan untuk kumpulan node khusus. Misalnya, workloadType=untrusted.

Memberi taint dan label pada node pool baru

Saat Anda menerapkan taint atau label ke node pool baru, semua node, termasuk node yang ditambahkan nanti, akan otomatis mendapatkan taint dan label yang ditentukan. Anda tidak dapat menghapus taint atau label dari node pool setelah diterapkan.

Untuk menambahkan taint dan label ke node pool baru, selesaikan langkah-langkah berikut:

  1. Edit bagian nodePools dari resource kustom Cluster secara langsung saat membuat node pool:

    nodePools:
      # Several lines of code are omitted here.
      - machineTypeName: n2-standard-2-gdc
        name: nodepool-1
        nodeCount: 3
        taints:
        - key: "TAINT_KEY"
          value: "TAINT_VALUE"
          effect: "TAINT_EFFECT"
        labels:
          LABEL_KEY: LABEL_VALUE
    

    Ganti kode berikut:

    • TAINT_KEY: bagian kunci taint dari pasangan nilai kunci yang terkait dengan penjadwalan TAINT_EFFECT. Misalnya, workloadType.
    • TAINT_VALUE: bagian nilai taint dari pasangan nilai kunci yang terkait dengan penjadwalan TAINT_EFFECT. Misalnya, untrusted.
    • TAINT_EFFECT: salah satu nilai efek berikut:
      • NoSchedule: pod yang tidak menoleransi taint ini tidak akan dijadwalkan pada node; pod yang sudah ada tidak dikeluarkan dari node.
      • PreferNoSchedule: Kubernetes menghindari penjadwalan pod yang tidak menoleransi taint ini ke node.
      • NoExecute: pod dikeluarkan dari node jika sudah berjalan di node, dan tidak dijadwalkan ke node jika belum berjalan di node.
    • LABEL_KEY: LABEL_VALUE: pasangan nilai kunci untuk label node, yang sesuai dengan pemilih yang Anda tentukan dalam manifes workload Anda.
  2. Terapkan resource Cluster untuk membuat node pool baru:

    kubectl apply -f cluster.yaml --kubeconfig MANAGEMENT_API_SERVER
    

    Ganti MANAGEMENT_API_SERVER dengan jalur kubeconfig server API zonal tempat cluster Kubernetes dihosting.

Memberi taint dan label pada node pool yang ada

Untuk menerapkan taint atau label ke node pool yang ada, Anda harus menerapkan perubahan ke setiap node yang ada. Anda tidak dapat mengupdate konfigurasi node pool secara dinamis.

Anda tidak dapat menghapus taint atau label dari node pool setelah diterapkan.

Untuk menambahkan taint dan label ke node pool yang ada, selesaikan langkah-langkah berikut:

  1. Cantumkan node di node pool khusus:

    kubectl get node --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG \
        -l baremetal.cluster.gke.io/node-pool=NODE_POOL_NAME
    

    Ganti variabel berikut:

    • KUBERNETES_CLUSTER_KUBECONFIG: jalur kubeconfig untuk cluster Kubernetes.
    • NODE_POOL_NAME: nama node pool khusus Anda.

    Catat setiap ID node dari semua node di node pool dari output.

  2. Untuk setiap node di node pool, terapkan taint:

    kubectl taint nodes NODE_ID \
        TAINT_KEY=TAINT_VALUE:TAINT_EFFECT \
        --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
    

    Ganti variabel berikut:

    • NODE_ID: ID worker node di node pool khusus.
    • TAINT_KEY=TAINT_VALUE: pasangan nilai kunci yang terkait dengan penjadwalan TAINT_EFFECT. Misalnya, workloadType=untrusted.
    • TAINT_EFFECT: salah satu nilai efek berikut:
      • NoSchedule: pod yang tidak menoleransi taint ini tidak akan dijadwalkan pada node; pod yang sudah ada tidak dikeluarkan dari node.
      • PreferNoSchedule: Kubernetes menghindari penjadwalan pod yang tidak menoleransi taint ini ke node.
      • NoExecute: pod dikeluarkan dari node jika sudah berjalan di node, dan tidak dijadwalkan ke node jika belum berjalan di node.
    • KUBERNETES_CLUSTER_KUBECONFIG: jalur kubeconfig untuk cluster Kubernetes.
  3. Untuk setiap node di node pool, terapkan label yang sesuai dengan pemilih yang akan Anda tentukan dalam workload container Anda:

    kubectl label NODE_ID \
        LABEL_KEY:LABEL_VALUE \
        --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
    

    Ganti variabel berikut:

    • NODE_ID: ID worker node di node pool khusus.
    • LABEL_KEY:LABEL_VALUE: pasangan nilai kunci untuk label node, yang sesuai dengan pemilih yang Anda tentukan dalam manifes workload Anda.
    • KUBERNETES_CLUSTER_KUBECONFIG: jalur kubeconfig untuk cluster Kubernetes.

Menambahkan aturan toleransi dan afinitas node

Setelah Anda melakukan taint pada node pool khusus, tidak ada workload yang dapat dijadwalkan pada node pool tersebut kecuali memiliki toleransi yang sesuai dengan taint yang Anda tambahkan. Tambahkan toleransi ke spesifikasi workload Anda agar pod tersebut dapat dijadwalkan pada node pool yang tercemar.

Dengan memberi label pada node pool khusus, Anda juga dapat menambahkan aturan afinitas node untuk memberi tahu GDC agar hanya menjadwalkan workload pada node pool tersebut.

Untuk mengonfigurasi workload container Anda agar berjalan di node pool khusus, selesaikan langkah-langkah berikut:

  1. Tambahkan bagian berikut ke bagian .spec.template.spec dari file manifes workload container Anda, seperti resource kustom Deployment:

    tolerations:
    - key: TAINT_KEY
      operator: Equal
      value: TAINT_VALUE
      effect: TAINT_EFFECT
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: LABEL_KEY
              operator: In
              values:
              - "LABEL_VALUE"
    

    Ganti kode berikut:

    • TAINT_KEY: kunci taint yang Anda terapkan ke node pool khusus Anda.
    • TAINT_VALUE: nilai taint yang Anda terapkan ke node pool khusus Anda.
    • TAINT_EFFECT: salah satu nilai efek berikut:
      • NoSchedule: pod yang tidak menoleransi taint ini tidak akan dijadwalkan pada node; pod yang sudah ada tidak dikeluarkan dari node.
      • PreferNoSchedule: Kubernetes menghindari penjadwalan pod yang tidak menoleransi taint ini ke node.
      • NoExecute: pod dikeluarkan dari node jika sudah berjalan di node, dan tidak dijadwalkan ke node jika belum berjalan di node.
    • LABEL_KEY: kunci label node yang Anda terapkan ke node pool khusus Anda.
    • LABEL_VALUE: nilai label node yang Anda terapkan ke node pool khusus Anda.

    Misalnya, resource Deployment berikut menambahkan toleransi untuk workloadType=untrusted:NoExecute taint dan aturan afinitas node untuk workloadType=untrusted label node:

    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: my-app
      namespace: default
      labels:
        app: my-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          tolerations:
          - key: workloadType
            operator: Equal
            value: untrusted
            effect: NoExecute
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: workloadType
                    operator: In
                    values:
                    - "untrusted"
          containers:
          - name: my-app
            image: harbor-1.org-1.zone1.google.gdc.test/harborproject/my-app
            ports:
            - containerPort: 80
          imagePullSecrets:
          - name: SECRET
    
  2. Perbarui workload container Anda:

    kubectl apply -f deployment.yaml -n NAMESPACE \
        --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
    

    Ganti variabel berikut:

    • NAMESPACE: namespace workload container Anda. Untuk cluster bersama, ini harus berupa namespace project. Untuk cluster standar, dapat berupa namespace apa pun.
    • KUBERNETES_CLUSTER_KUBECONFIG: jalur kubeconfig untuk cluster Kubernetes.

GDC membuat ulang pod yang terpengaruh. Aturan afinitas node memaksa pod ke node pool khusus yang Anda buat. Toleransi hanya mengizinkan pod tersebut ditempatkan di node.

Memastikan pemisahan berfungsi

Pastikan pod yang Anda tetapkan berjalan di node pool berlabel.

  • Cantumkan pod di namespace yang diberikan:

    kubectl get pods -o=wide -n NAMESPACE \
        --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
    

    Ganti variabel berikut:

    • NAMESPACE: namespace workload container Anda. Untuk cluster bersama, ini harus berupa namespace project. Untuk cluster standar, dapat berupa namespace apa pun.
    • KUBERNETES_CLUSTER_KUBECONFIG: jalur kubeconfig untuk cluster Kubernetes.

    Outputnya akan terlihat mirip seperti berikut:

    pod/kube-abc-12tyuj
    pod/kube-abc-39oplef
    pod/kube-abc-95rzkap
    

    Pastikan workload Anda berjalan di node pool khusus.

Langkah berikutnya