Dokumen ini menjelaskan cara meningkatkan keamanan dan pengelolaan cluster Kubernetes Anda dengan mengisolasi workload container dalam kumpulan node khusus di Google Distributed Cloud (GDC) yang terisolasi dari internet. Mengisolasi workload memberi Anda kontrol yang lebih besar atas pod dan mengurangi risiko serangan eskalasi hak istimewa 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 secara khusus untuk dijalankan di sana.
Menambahkan aturan toleransi dan afinitas node: Terapkan toleransi dan aturan ke pod Anda untuk memaksanya berjalan hanya di node pool yang ditentukan.
Memastikan pemisahan berfungsi: Pastikan kumpulan node 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 untuk mengelola kumpulan node cluster Kubernetes, dan developer aplikasi dalam grup operator aplikasi yang bertanggung jawab untuk mengelola workload container. Untuk mengetahui informasi selengkapnya, lihat dokumentasi Audiens untuk GDC yang terisolasi dari internet.
Sebelum memulai
Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:
Pilih nama tertentu untuk taint node dan label node yang ingin Anda gunakan untuk kumpulan node khusus. Misalnya,
workloadType=untrusted
.Jika perlu, minta Admin IAM Organisasi untuk memberi Anda peran User Cluster Developer (
user-cluster-developer
), yang tidak terikat ke namespace.
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.
Untuk menambahkan taint dan label ke node pool baru, selesaikan langkah-langkah berikut:
Edit bagian
nodePools
resource kustomCluster
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 denganTAINT_EFFECT
penjadwalan. Misalnya,workloadType
.TAINT_VALUE
: bagian nilai taint dari pasangan nilai kunci yang terkait denganTAINT_EFFECT
penjadwalan. Misalnya,untrusted
.TAINT_EFFECT
: salah satu nilai efek berikut:NoSchedule
: pod yang tidak menoleransi taint ini tidak dijadwalkan di node; pod yang 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.
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. Jika Anda belum membuat file kubeconfig untuk server API di zona target, lihat Sumber daya server API Zonal Management untuk mengetahui informasi selengkapnya.
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.
Untuk menambahkan taint dan label ke node pool yang ada, selesaikan langkah-langkah berikut:
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.
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 node pekerja di node pool khusus.TAINT_KEY=TAINT_VALUE
: pasangan nilai kunci yang terkait denganTAINT_EFFECT
penjadwalan. Contohnya,workloadType=untrusted
.TAINT_EFFECT
: salah satu nilai efek berikut:NoSchedule
: pod yang tidak menoleransi taint ini tidak dijadwalkan di node; pod yang 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 di kumpulan node, terapkan label yang sesuai dengan pemilih yang akan Anda tentukan dalam beban kerja penampung:
kubectl label NODE_ID \ LABEL_KEY:LABEL_VALUE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
Ganti variabel berikut:
NODE_ID
: ID node pekerja di node pool khusus.LABEL_KEY:LABEL_VALUE
: pasangan nilai kunci 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 kumpulan node khusus, tidak ada beban kerja yang dapat dijadwalkan pada kumpulan tersebut kecuali memiliki toleransi yang sesuai dengan taint yang Anda tambahkan. Tambahkan toleransi ke spesifikasi beban kerja Anda agar pod tersebut dapat dijadwalkan pada kumpulan node yang tercemar.
Jika memberi label pada kumpulan node khusus, Anda juga dapat menambahkan aturan afinitas node untuk memberi tahu GDC agar hanya menjadwalkan beban kerja Anda pada kumpulan node tersebut.
Untuk mengonfigurasi workload container agar berjalan di node pool khusus, selesaikan langkah-langkah berikut:
Tambahkan bagian berikut ke bagian
.spec.template.spec
dari file manifes workload kontainer Anda, seperti resource kustomDeployment
:# Several lines of code are omitted here. spec: template: spec: 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" # Several lines of code are omitted here.
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 dijadwalkan di node; pod yang 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
Deployment
berikut menambahkan toleransi untuk taintworkloadType=untrusted:NoExecute
dan 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: SECRET
Perbarui workload container Anda:
kubectl apply -f deployment.yaml -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
Ganti variabel berikut:
NAMESPACE
: namespace project workload kontainer Anda.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.
Mencantumkan pod dalam namespace tertentu:
kubectl get pods -o=wide -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
Ganti variabel berikut:
NAMESPACE
: namespace project workload kontainer Anda.KUBERNETES_CLUSTER_KUBECONFIG
: jalur kubeconfig untuk cluster Kubernetes.
Outputnya terlihat mirip dengan yang berikut ini:
pod/kube-abc-12tyuj pod/kube-abc-39oplef pod/kube-abc-95rzkap
Pastikan workload Anda berjalan di node pool khusus.
Langkah berikutnya
- Beban kerja container di GDC
- Men-deploy aplikasi container yang memiliki ketersediaan tinggi
- Workload Kubernetes untuk HA