Node pool khusus di Google Distributed Cloud (GDC) dengan air gap memungkinkan Anda mengisolasi workload container untuk memperkuat keamanan cluster Kubernetes dan mengontrol penempatan pod. Pemisahan ini membantu mengurangi risiko serangan eskalasi hak istimewa. Untuk menyiapkan pool khusus, Anda menerapkan taint dan label, mencocokkannya dengan toleransi workload dan aturan afinitas node, serta memverifikasi penjadwalan.
Dokumen ini ditujukan untuk admin IT dalam grup administrator platform yang mengelola cluster Kubernetes dan developer dalam grup operator aplikasi yang menjalankan container. Untuk mengetahui informasi selengkapnya, lihat Ringkasan isolasi node dan 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. Peran yang Anda perlukan bergantung pada apakah Anda bekerja dalam cluster bersama yang tercakup dalam organisasi atau cluster standar yang tercakup dalam project. Untuk mengetahui informasi selengkapnya, lihat Konfigurasi cluster Kubernetes.
Peran cluster bersama
Hubungi Admin Org IAM Anda untuk meminta peran berikut guna melakukan taint dan memberi label pada node pool di cluster bersama:
User Cluster Admin (
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.User Cluster Developer (
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 IAM Project Admin Anda untuk meminta peran berikut guna melakukan taint dan memberi label pada node pool di cluster standar:
Cluster Admin (
cluster-admin): membuat, menghapus, mengedit, atau melihat semua resource dalam 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.Standard Cluster Admin (
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 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_KUBECONFIGdalam petunjuk ini.Login dan buat file kubeconfig untuk server API pengelolaan.
Gunakan jalur kubeconfig server API pengelolaan untuk mengganti
MANAGEMENT_API_SERVERdalam petunjuk ini.Pilih nama tertentu untuk taint node dan label node yang ingin Anda gunakan untuk node pool khusus. Misalnya,
workloadType=untrusted.
Taint dan beri 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:
Edit bagian
nodePoolsresource kustomClustersecara 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_VALUEGanti kode berikut:
TAINT_KEY: bagian kunci taint dari pasangan nilai kunci yang terkait denganTAINT_EFFECTpenjadwalan. Misalnya,workloadType.TAINT_VALUE: bagian nilai taint dari pasangan nilai kunci yang terkait denganTAINT_EFFECTpenjadwalan. 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: key-value pair untuk label node, yang sesuai dengan pemilih yang Anda tentukan dalam manifes workload.
Terapkan resource
Clusteruntuk membuat node pool baru:kubectl apply -f cluster.yaml --kubeconfig MANAGEMENT_API_SERVERGanti
MANAGEMENT_API_SERVERdengan jalur kubeconfig server API zonal tempat cluster Kubernetes dihosting.
Taint dan beri label pada node pool yang ada
Untuk menerapkan taint atau label ke node pool yang ada, Anda harus menerapkan perubahan pada 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:
Cantumkan node dalam node pool khusus:
kubectl get node --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG \ -l baremetal.cluster.gke.io/node-pool=NODE_POOL_NAMEGanti 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.
Untuk setiap node dalam node pool, terapkan taint:
kubectl taint nodes NODE_ID \ TAINT_KEY=TAINT_VALUE:TAINT_EFFECT \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGGanti variabel berikut:
NODE_ID: ID worker node di node pool khusus.TAINT_KEY=TAINT_VALUE: pasangan nilai kunci yang terkait denganTAINT_EFFECTpenjadwalan. Contohnya,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.
Untuk setiap node dalam node pool, terapkan label yang sesuai dengan pemilih yang akan Anda tentukan dalam workload container:
kubectl label NODE_ID \ LABEL_KEY:LABEL_VALUE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGGanti variabel berikut:
NODE_ID: ID worker node di node pool khusus.LABEL_KEY:LABEL_VALUE: key-value pair untuk label node, yang sesuai dengan pemilih yang Anda tentukan dalam manifes workload.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 beban kerja pada node pool tersebut.
Untuk mengonfigurasi workload container agar berjalan di node pool khusus, selesaikan langkah-langkah berikut:
Tambahkan bagian berikut ke bagian
.spec.template.specdari file manifes workload container Anda, seperti resource kustomDeployment: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.TAINT_VALUE: nilai taint yang Anda terapkan ke node pool khusus.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.LABEL_VALUE: nilai label node yang Anda terapkan ke node pool khusus.
Misalnya, resource
Deploymentberikut menambahkan toleransi untuk taintworkloadType=untrusted:NoExecutedan aturan afinitas node untuk label nodeworkloadType=untrusted: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: SECRETPerbarui workload container Anda:
kubectl apply -f deployment.yaml -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGGanti variabel berikut:
NAMESPACE: namespace workload container Anda. Untuk cluster bersama, ini harus berupa namespace project. Untuk cluster standar, namespace-nya bisa apa saja.KUBERNETES_CLUSTER_KUBECONFIG: jalur kubeconfig untuk cluster Kubernetes.
GDC akan 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_KUBECONFIGGanti variabel berikut:
NAMESPACE: namespace workload container Anda. Untuk cluster bersama, ini harus berupa namespace project. Untuk cluster standar, namespace-nya bisa apa saja.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-95rzkapPastikan workload Anda berjalan di node pool khusus.
Langkah berikutnya
- Workload container di GDC
- Men-deploy aplikasi container dengan tingkat ketersediaan tinggi
- Workload Kubernetes untuk HA