Questo documento spiega come migliorare la sicurezza e la gestione del cluster Kubernetes isolando i carichi di lavoro dei container all'interno di node pool dedicati in Google Distributed Cloud (GDC) air-gapped. L'isolamento dei carichi di lavoro offre un maggiore controllo sui pod e riduce il rischio di attacchi di escalation dei privilegi nel cluster Kubernetes. Per saperne di più sui vantaggi e sulle limitazioni dei node pool dedicati, consulta la panoramica sull'isolamento dei nodi.
Esistono diversi workflow per l'isolamento dei carichi di lavoro dei container, tra cui:
Incompatibilità ed etichettatura di un node pool: applica un'incompatibilità e un'etichetta a un pool di nodi in modo che i pod non vengano eseguiti nel pool di nodi, a meno che non siano etichettati in modo specifico per essere eseguiti lì.
Aggiunta di una tolleranza e di una regola di affinità nodo: applica tolleranze e regole a i pod per forzarli a essere eseguiti solo nel pool di nodi designato.
Verifica del funzionamento della separazione: verifica che i node pool con incompatibilità eseguano solo i pod che hai etichettato per essere eseguiti lì.
Questi workflow sono destinati a un pubblico come gli amministratori IT del gruppo di amministratori della piattaforma, responsabili della gestione dei node pool di un cluster Kubernetes, e gli sviluppatori di applicazioni del gruppo di operatori di applicazioni, responsabili della gestione dei carichi di lavoro dei container. Per saperne di più, consulta Pubblico della documentazione di 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 i ruoli IAM
Devi disporre di ruoli specifici per ottenere le autorizzazioni necessarie per isolare i carichi di lavoro dei container nel cluster Kubernetes. I ruoli richiesti dipendono dal fatto che tu stia lavorando in un cluster condiviso con ambito organizzazione o in un cluster standard con ambito progetto. Per saperne di più, consulta Configurazione dei cluster Kubernetes.
Ruoli del cluster condiviso
Contatta l'amministratore IAM dell'organizzazione per richiedere i seguenti ruoli per applicare un'incompatibilità ed etichettare un pool di nodi in un cluster condiviso:
Amministratore del 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 node pool del cluster condiviso.Sviluppatore del 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 del cluster standard
Contatta l'amministratore IAM del progetto per richiedere i seguenti ruoli per applicare un'incompatibilità ed etichettare un pool di nodi in un cluster standard:
Amministratore del 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 regolano le risorse del cluster.Sviluppatore del 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 regolano il cluster.Amministratore del 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 node pool 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 l'incompatibilità del nodo e l'etichetta del nodo che vuoi utilizzare per i node pool dedicati. Ad esempio,
workloadType=untrusted.
Applica un'incompatibilità ed etichetta un nuovo pool di nodi
Quando applichi un'incompatibilità o un'etichetta a un nuovo pool di nodi, tutti i nodi, inclusi quelli aggiunti in un secondo momento, riceveranno automaticamente le incompatibilità e le etichette specificate. Non puoi rimuovere un'incompatibilità o un'etichetta da un pool di nodi dopo averla applicata.
Per aggiungere un'incompatibilità e un'etichetta a un nuovo pool di nodi, completa i seguenti passaggi:
Modifica direttamente la sezione
nodePoolsdella risorsa personalizzataClusterdurante 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 di incompatibilità della coppia chiave-valore associata a unTAINT_EFFECTdi pianificazione. Ad esempio,workloadType.TAINT_VALUE: la parte del valore di incompatibilità 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 espulsi dal nodo.PreferNoSchedule: Kubernetes evita di pianificare i pod che non tollerano questa incompatibilità sul nodo.NoExecute: il pod viene espulso dal nodo se è già in esecuzione sul nodo e non viene pianificato sul nodo se non è ancora in esecuzione sul nodo.
LABEL_KEY: LABEL_VALUE: le coppie chiave-valore per le etichette dei nodi, che corrispondono ai selettori specificati nei manifest dei carichi di lavoro.
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 zonale in cui è ospitato il cluster Kubernetes.
Applica un'incompatibilità ed etichetta un pool di nodi esistente
Per applicare un'incompatibilità 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'incompatibilità o un'etichetta da un pool di nodi dopo averla applicata.
Per aggiungere un'incompatibilità 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 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 unTAINT_EFFECT. Ad esempio,workloadType=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 espulsi dal nodo.PreferNoSchedule: Kubernetes evita di pianificare i pod che non tollerano questa incompatibilità sul nodo.NoExecute: il pod viene espulso dal nodo se è già in esecuzione sul nodo e non viene pianificato sul nodo se non è ancora in esecuzione sul nodo.
KUBERNETES_CLUSTER_KUBECONFIG: il percorso kubeconfig per il cluster Kubernetes.
Per ogni nodo nel pool di nodi, applica le etichette che corrispondono ai selettori che definirai nei carichi di lavoro 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: the coppie chiave-valore per le etichette dei nodi, che corrispondono ai selettori specificati nei manifest dei carichi di lavoro.KUBERNETES_CLUSTER_KUBECONFIG: il percorso kubeconfig per il cluster Kubernetes.
Aggiungi una tolleranza e una regola di affinità nodo
Dopo aver applicato un'incompatibilità al pool di nodi dedicato, nessun carico di lavoro può essere pianificato su di esso a meno che non abbia una tolleranza corrispondente all'incompatibilità aggiunta. Aggiungi la tolleranza alla specifica dei carichi di lavoro per consentire a questi pod di essere pianificati nel pool di nodi con incompatibilità.
Se hai etichettato il pool di nodi dedicato, puoi anche aggiungere una regola di affinità nodo per indicare a GDC di pianificare i carichi di lavoro solo su quel node pool.
Per configurare l'esecuzione del carico di lavoro del container nel pool di nodi dedicato, completa i seguenti passaggi:
Aggiungi le seguenti sezioni alla sezione
.spec.template.specdel file manifest del carico di lavoro 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 di incompatibilità che hai applicato al pool di nodi dedicato.TAINT_VALUE: il valore di incompatibilità che hai 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 espulsi dal nodo.PreferNoSchedule: Kubernetes evita di pianificare i pod che non tollerano questa incompatibilità sul nodo.NoExecute: il pod viene espulso dal nodo se è già in esecuzione sul nodo e non viene pianificato sul nodo se non è ancora in esecuzione sul nodo.
LABEL_KEY: la chiave di 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 l'incompatibilitàworkloadType=untrusted:NoExecutee una regola di affinità nodo per l'etichetta 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 carico di lavoro del container:
kubectl apply -f deployment.yaml -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGSostituisci le seguenti variabili:
NAMESPACE: lo spazio dei nomi del carico di lavoro 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à nodo forza i pod nel pool di nodi dedicato che hai creato. La tolleranza consente di inserire solo questi pod sui nodi.
Verifica del funzionamento della separazione
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 carico di lavoro 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 carichi di lavoro siano in esecuzione nel pool di nodi dedicato.
Passaggi successivi
- Carichi di lavoro dei container in GDC
- Esegui il deployment di un'applicazione containerizzata a elevata disponibilità
- Carichi di lavoro Kubernetes per l'alta disponibilità