I node pool dedicati in Google Distributed Cloud (GDC) con air gap ti consentono di isolare i workload dei container per rafforzare la sicurezza del cluster Kubernetes e controllare il posizionamento dei pod. Questa separazione contribuisce a ridurre il rischio di attacchi di escalation dei privilegi. Per configurare i pool dedicati, applica incompatibilità ed etichette, abbinale alle tolleranze dei workload e alle regole di affinità dei nodi e verifica la pianificazione.
Questo documento è rivolto agli amministratori IT del gruppo di amministratori della piattaforma che gestiscono i cluster Kubernetes e agli sviluppatori del gruppo di operatori di applicazioni che eseguono i container. Per saperne di più, consulta la panoramica dell'isolamento dei nodi e la documentazione relativa ai segmenti di pubblico per GDC con air gap.
Prima di iniziare
Per completare le attività descritte in questo documento, devi richiedere le autorizzazioni necessarie e preparare l'ambiente.
Richiedi ruoli IAM
Devi disporre di ruoli specifici per ottenere le autorizzazioni necessarie per isolare i workload dei container nel tuo cluster Kubernetes. I ruoli necessari dipendono dal fatto che tu stia lavorando all'interno di un cluster condiviso con ambito a livello di organizzazione o di un cluster standard con ambito a livello di progetto. Per saperne di più, consulta Configurazioni dei cluster Kubernetes.
Ruoli cluster condivisi
Contatta l'amministratore dell'organizzazione IAM per richiedere i seguenti ruoli per applicare taint ed etichette a un pool di nodi in un cluster condiviso:
Amministratore cluster utente (
user-cluster-admin): crea, elimina, modifica o visualizza le risorse di un cluster condiviso ospitato sul server API di gestione. Questo ruolo fornisce l'accesso ai pool di nodi del cluster condiviso.Sviluppatore cluster utente (
user-cluster-developer): crea, elimina, modifica o visualizza un cluster condiviso. Questo ruolo fornisce l'accesso alle API del piano dati ospitate all'interno del cluster condiviso.
Questi ruoli non sono associati a uno spazio dei nomi.
Ruoli cluster standard
Contatta l'amministratore del progetto IAM per richiedere i seguenti ruoli per applicare taint ed etichette a un pool di nodi in un cluster standard:
Amministratore cluster (
cluster-admin): crea, elimina, modifica o visualizza tutte le risorse in un cluster standard. Questo ruolo fornisce l'accesso alle API del piano dati ospitate all'interno del cluster standard che gestiscono le risorse del cluster.Sviluppatore cluster (
cluster-developer): crea, elimina, modifica o visualizza un cluster standard. Questo ruolo fornisce l'accesso alle API del piano dati ospitate all'interno del cluster standard che gestiscono il cluster.Amministratore cluster standard (
standard-cluster-admin): crea, elimina, modifica o visualizza le risorse di un cluster standard ospitato sul server API di gestione. Questo ruolo fornisce l'accesso ai pool di nodi del cluster standard.
Questi ruoli sono associati allo spazio dei nomi del progetto.
prepara l'ambiente
Per eseguire comandi su un cluster Kubernetes utilizzando l'API, assicurati di disporre delle seguenti risorse:
Accedi e genera il file kubeconfig per il cluster Kubernetes.
Utilizza il percorso kubeconfig del cluster Kubernetes per sostituire
KUBERNETES_CLUSTER_KUBECONFIGin queste istruzioni.Accedi e genera il file kubeconfig per il server API di gestione.
Utilizza il percorso kubeconfig del server API di gestione per sostituire
MANAGEMENT_API_SERVERin queste istruzioni.Scegli un nome specifico per il taint e l'etichetta del nodo che vuoi utilizzare per i node pool dedicati. Ad esempio,
workloadType=untrusted.
Applica taint ed etichette a un nuovo pool di nodi
Quando applichi un taint o un'etichetta a un nuovo pool di nodi, tutti i nodi, inclusi quelli aggiunti in un secondo momento, riceveranno automaticamente i taint e le etichette specificati. Non puoi rimuovere un taint o un'etichetta da un pool di nodi dopo averlo applicato.
Per aggiungere un taint e un'etichetta a un nuovo pool di nodi, completa i seguenti passaggi:
Modifica la sezione
nodePoolsdella risorsa personalizzataClusterdirettamente durante la creazione del 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_VALUESostituisci quanto segue:
TAINT_KEY: la parte della chiave taint della coppia chiave-valore associata a unaTAINT_EFFECTdi pianificazione. Ad esempio:workloadType.TAINT_VALUE: la parte del valore del taint della coppia chiave-valore associata a unTAINT_EFFECTdi pianificazione. Ad esempio:untrusted.TAINT_EFFECT: uno dei seguenti valori di effetto:NoSchedule: i pod che non tollerano questa incompatibilità non vengono pianificati sul nodo; i pod esistenti non vengono rimossi dal nodo.PreferNoSchedule: Kubernetes evita di pianificare pod che non tollerano questa incompatibilità sul nodo.NoExecute: il pod viene rimosso dal nodo se è già in esecuzione sul nodo, mentre non viene pianificato sul nodo se non è ancora in esecuzione sul nodo stesso.
LABEL_KEY: LABEL_VALUE: le coppie chiave-valore per le etichette dei nodi, che corrispondono ai selettori specificati nei manifest dei workload.
Applica la risorsa
Clusterper creare il nuovo pool di nodi:kubectl apply -f cluster.yaml --kubeconfig MANAGEMENT_API_SERVERSostituisci
MANAGEMENT_API_SERVERcon il percorso kubeconfig del server API di zona in cui è ospitato il cluster Kubernetes.
Applica taint ed etichette a un pool di nodi esistente
Per applicare un taint o un'etichetta a un pool di nodi esistente, devi applicare le modifiche a ogni nodo esistente. Non puoi aggiornare dinamicamente le configurazioni pool di nodi.
Non puoi rimuovere un taint o un'etichetta da un pool di nodi dopo averlo applicato.
Per aggiungere un taint e un'etichetta a un pool di nodi esistente, completa i seguenti passaggi:
Elenca i nodi nel pool di nodi dedicato:
kubectl get node --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG \ -l baremetal.cluster.gke.io/node-pool=NODE_POOL_NAMESostituisci le seguenti variabili:
KUBERNETES_CLUSTER_KUBECONFIG: il percorso kubeconfig per il cluster Kubernetes.NODE_POOL_NAME: il nome del tuo node pool dedicato.
Prendi nota di ogni ID nodo di tutti i nodi nel pool di nodi dall'output.
Per ogni nodo nel pool di nodi, applica le incompatibilità:
kubectl taint nodes NODE_ID \ TAINT_KEY=TAINT_VALUE:TAINT_EFFECT \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGSostituisci le seguenti variabili:
NODE_ID: l'ID del nodo worker nel pool di nodi dedicato.TAINT_KEY=TAINT_VALUE: una coppia chiave-valore associata a una pianificazioneTAINT_EFFECT. Ad esempioworkloadType=untrusted.TAINT_EFFECT: uno dei seguenti valori di effetto:NoSchedule: i pod che non tollerano questa incompatibilità non vengono pianificati sul nodo; i pod esistenti non vengono rimossi dal nodo.PreferNoSchedule: Kubernetes evita di pianificare pod che non tollerano questa incompatibilità sul nodo.NoExecute: il pod viene rimosso dal nodo se è già in esecuzione sul nodo, mentre non viene pianificato sul nodo se non è ancora in esecuzione sul nodo stesso.
KUBERNETES_CLUSTER_KUBECONFIG: il percorso kubeconfig per il cluster Kubernetes.
Per ogni nodo nel pool di nodi, applica le etichette corrispondenti ai selettori che definirai nei workload dei container:
kubectl label NODE_ID \ LABEL_KEY:LABEL_VALUE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGSostituisci le seguenti variabili:
NODE_ID: l'ID del nodo worker nel pool di nodi dedicato.LABEL_KEY:LABEL_VALUE: le coppie chiave-valore per le etichette dei nodi, che corrispondono ai selettori che specifichi nei manifest dei workload.KUBERNETES_CLUSTER_KUBECONFIG: il percorso kubeconfig per il cluster Kubernetes.
Aggiungi una tolleranza e una regola di affinità dei nodi
Dopo aver applicato un taint al pool di nodi dedicato, non è possibile pianificare workload su questo node pool, a meno che non abbiano una tolleranza corrispondente al taint aggiunto. Aggiungi la tolleranza alla specifica dei tuoi workload per consentire la pianificazione dei pod nel pool di nodi con taint.
Se hai etichettato il pool di nodi dedicato, puoi anche aggiungere una regola di affinità dei nodi per indicare a GDC di pianificare i workload solo su quel node pool.
Per configurare il workload del container in modo che venga eseguito nel pool di nodi dedicato, completa i seguenti passaggi:
Aggiungi le seguenti sezioni alla sezione
.spec.template.specdel file manifest del workload del container, ad esempio una risorsa personalizzataDeployment: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"Sostituisci quanto segue:
TAINT_KEY: la chiave taint applicata al pool di nodi dedicato.TAINT_VALUE: il valore del taint applicato al pool di nodi dedicato.TAINT_EFFECT: uno dei seguenti valori di effetto:NoSchedule: i pod che non tollerano questa incompatibilità non vengono pianificati sul nodo; i pod esistenti non vengono rimossi dal nodo.PreferNoSchedule: Kubernetes evita di pianificare pod che non tollerano questa incompatibilità sul nodo.NoExecute: il pod viene rimosso dal nodo se è già in esecuzione sul nodo, mentre non viene pianificato sul nodo se non è ancora in esecuzione sul nodo stesso.
LABEL_KEY: la chiave dell'etichetta del nodo che hai applicato al pool di nodi dedicato.LABEL_VALUE: il valore dell'etichetta del nodo che hai applicato al pool di nodi dedicato.
Ad esempio, la seguente risorsa
Deploymentaggiunge una tolleranza per la contaminazioneworkloadType=untrusted:NoExecutee una regola di affinità dei nodi per l'etichetta del nodoworkloadType=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: SECRETAggiorna il workload del container:
kubectl apply -f deployment.yaml -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGSostituisci le seguenti variabili:
NAMESPACE: lo spazio dei nomi del workload del container. Per i cluster condivisi, deve essere uno spazio dei nomi del progetto. Per i cluster standard, può essere qualsiasi spazio dei nomi.KUBERNETES_CLUSTER_KUBECONFIG: il percorso kubeconfig per il cluster Kubernetes.
GDC ricrea i pod interessati. La regola di affinità dei nodi forza i pod nel pool di nodi dedicato che hai creato. La tolleranza consente di posizionare solo questi pod sui nodi.
Verifica che la separazione funzioni
Verifica che i pod designati siano in esecuzione nel pool di nodi etichettato.
Elenca i pod nello spazio dei nomi specificato:
kubectl get pods -o=wide -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGSostituisci le seguenti variabili:
NAMESPACE: lo spazio dei nomi del workload del container. Per i cluster condivisi, deve essere uno spazio dei nomi del progetto. Per i cluster standard, può essere qualsiasi spazio dei nomi.KUBERNETES_CLUSTER_KUBECONFIG: il percorso kubeconfig per il cluster Kubernetes.
L'output è simile al seguente:
pod/kube-abc-12tyuj pod/kube-abc-39oplef pod/kube-abc-95rzkapVerifica che i workload siano in esecuzione nel pool di nodi dedicato.
Passaggi successivi
- Workload dei container in GDC
- Esegui il deployment di un'applicazione container ad alta affidabilità
- Workload Kubernetes per l'alta affidabilità