Gruppi di sicurezza per pod
I gruppi di sicurezza per i pod integrano i gruppi di sicurezza Amazon EC2 con i pod Kubernetes. È possibile utilizzare i gruppi di sicurezza Amazon EC2 per definire regole che consentono il traffico di rete in entrata e in uscita da e verso i pod distribuiti ai nodi in esecuzione su molti tipi di istanza Amazon EC2 e Fargate. Per una descrizione dettagliata di questa funzionalità, consultare il blog post Introduzione ai gruppi di sicurezza per i pod
Considerazioni
Prima di implementare i gruppi di sicurezza per i pod, considerare i limiti e le condizioni seguenti:
-
I flussi di traffico da e verso i pod con gruppi di sicurezza associati non sono soggetti ad esecuzione su Policy di rete Calico ma la loro applicazione è esclusivamente limitata al gruppo di sicurezza Amazon EC2. La community sta compiendo un grosso sforzo per eliminare tale limitazione.
-
I pod in esecuzione su nodi Amazon EC2 possono essere su qualsiasi versione Kubernetes supportata da Amazon EKS, ma i pod in esecuzione su Fargate devono essere in un cluster versione 1.18 o successiva.
-
I gruppi di sicurezza per i pod non possono essere utilizzati con i nodi Windows.
-
I gruppi di sicurezza per pod non possono essere utilizzati con cluster configurati per la famiglia IPv6 che contengono nodi Amazon EC2. Tuttavia, è possibile utilizzare gruppi di sicurezza per pod con cluster configurati per la famiglia IPv6 che contengono solo nodi Fargate. Per ulteriori informazioni, consulta . Assegnazione di indirizzi IPv6 ai pod e ai servizi.
-
I gruppi di sicurezza per i pod sono supportati dalla maggior parte di famiglie di istanze Amazon EC2 basate su Nitro, tra cui le famiglie di istanze
m5
,c5
,r5
,p3
,m6g
,c6g
er6g
. La famiglia di istanzet3
non è supportata. Per un elenco completo delle istanze supportate, consultare Istanze e interfacce di rete di filiali supportate da Amazon EC2. I nodi devono essere di un tipi di istanza supportato. -
La fonte NAT è disabilitata per il traffico in uscita dai pod con gruppi di sicurezza assegnati, in modo che vengano applicate le regole dei gruppi di sicurezza in uscita. Per accedere a Internet, è necessario avviare pod con gruppi di sicurezza assegnati su nodi distribuiti in una sottorete privata configurata con un gateway NAT o un'istanza. I pod con gruppi di sicurezza assegnati distribuiti alle sottoreti pubbliche non sono in grado di accedere a Internet.
-
Servizi Kubernetes di tipo
NodePort
eLoadBalancer
che utilizzano le istanze target con unexternalTrafficPolicy
set perLocal
non sono supportati con i pod a cui si assegnano i gruppi di sicurezza. Per ulteriori informazioni sull'utilizzo di un bilanciatore del carico con target di istanza, consultare Bilanciamento del carico di rete su Amazon EKS. -
Se si utilizzano anche le policy di sicurezza dei pod per limitare l'accesso alla mutazione del pod, l'opzione
eks-vpc-resource-controller
evpc-resource-controller
gli account del servizio Kubernetes devono essere specificati in KubernetesClusterRoleBinding
per ilRole
che lepsp
è assegnato. Se si utilizza Amazon EKS psp, Role, e ClusterRoleBinding, questa è laeks:podsecuritypolicy:authenticated
ClusterRoleBinding
. Ad esempio, è necessario aggiungere gli account di servizio alla sezionesubjects:
, come mostrato nell'esempio seguente:... subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: system:authenticated - kind: ServiceAccount name: vpc-resource-controller - kind: ServiceAccount name: eks-vpc-resource-controller
-
Se si utilizzano allo stesso tempo una rete personalizzata e i gruppi di sicurezza per i pod, il gruppo di sicurezza specificato dai gruppi di sicurezza per i pod viene utilizzato in alternativa al gruppo di protezione specificato nella
ENIconfig
. -
I pod che utilizzano gruppi di sicurezza devono contenere
terminationGracePeriodSeconds
nelle loro specifiche pod. Questo perché il plug-in CNI Amazon EKS di Amazon EKS VPC interroga il server API per recuperare l'indirizzo IP del pod prima di eliminare la rete pod sull'host. Senza questa impostazione, il plug-in non rimuove la rete pod sull'host. -
I pod che utilizzano i gruppi di sicurezza non sono supportati nei cluster che utilizzano Nodelocal DNSCache
(Cache DNS locale del nodo).
Implementare i gruppi di sicurezza per i pod
Per implementare i gruppi di sicurezza per i pod
-
Se si utilizzano gruppi di sicurezza solo per i pod di Fargate e non si dispone di nodi Amazon EC2 nel cluster, passare al passaggio 4. Controllare la versione del plug-in CNI corrente con il seguente comando.
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
L'output è simile all'esempio seguente.
amazon-k8s-cni-init:
1.7.5-eksbuild.1
amazon-k8s-cni:1.7.5-eksbuild.1
Se la versione del plug-in CNI è precedente alla 1.7.7, aggiornare il plugin CNI alla versione 1.7.7 o successiva. Per ulteriori informazioni, consulta . Aggiornamento del componente aggiuntivo Amazon EKS CNI di Amazon VPC.
-
Aggiungere la
AmazonEKSVPCResourceController
policy gestita dal ruolo del cluster associato al cluster Amazon EKS. La policyconsente al ruolo di gestire le interfacce di rete, i relativi indirizzi IP privati e i relativi allegati e distacchi da e verso le istanze. Il seguente comando aggiunge la policy al ruolo del cluster denominato
.eksClusterRole
aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController \ --role-name
eksClusterRole
-
Abilitare il plug-in CNI per gestire le interfacce di rete per i pod impostando la proprietà
ENABLE_POD_ENI
variabile atrue
nelaws-node
DaemonSet. Una volta che questa impostazione è settata sutrue
, per ogni nodo nel cluster il plug-in aggiunge un'etichetta con il valorevpc.amazonaws.com/has-trunk-attached=true
. Il controller di risorse VPC crea e allega un'interfaccia di rete speciale chiamata interfaccia di rete trunk con la descrizioneaws-k8s-trunk-eni
.kubectl set env daemonset aws-node -n kube-system ENABLE_POD_ENI=true
Nota L'interfaccia di rete trunk è inclusa nel numero massimo di interfacce di rete supportate dal tipo di istanza. Per un elenco del numero massimo di interfacce supportate da ciascun tipo di istanza, consultare la sezione Indirizzi IP per interfaccia di rete per tipo di istanza nella Guida per l'utente di Amazon EC2 per istanze Linux. Se il nodo ha già allegato il numero massimo di interfacce di rete standard, il controller di risorse VPC riserverà uno spazio. Sarà necessario ridimensionare i pod in esecuzione abbastanza da consentire al controller di scollegare ed eliminare un'interfaccia di rete standard, creare l'interfaccia di rete trunk e allegarla all'istanza.
É possibile vedere quale dei nodi ha
aws-k8s-trunk-eni
impostato sutrue
con il seguente comando.kubectl get nodes -o wide -l vpc.amazonaws.com/has-trunk-attached=true
Una volta creata l'interfaccia di rete del trunk, ai pod possono essere assegnati indirizzi IP secondari dalla rete trunk o dalle interfacce di rete standard. L'interfaccia trunk viene eliminata automaticamente se il nodo viene eliminato.
Quando si distribuisce un gruppo di sicurezza per un pod in un passaggio successivo, il controller di risorse VPC crea un'interfaccia di rete speciale denominata interfaccia di rete di filiali con una descrizione di
aws-k8s-branch-eni
e associa i gruppi di sicurezza. Le interfacce di rete di filiali vengono create in aggiunta alle interfacce di rete standard e trunk allegate al nodo. Se si utilizzano probe liveness o readiness, è inoltre necessario disabilitare il demux precoce TCP, in modo che ilkubelet
può connettersi a pod su interfacce di rete di filiali tramite TCP. Per disabilitare TCP early demux, eseguire il comando seguente:kubectl patch daemonset aws-node \ -n kube-system \ -p '{"spec": {"template": {"spec": {"initContainers": [{"env":[{"name":"DISABLE_TCP_EARLY_DEMUX","value":"true"}],"name":"aws-vpc-cni-init"}]}}}}'
-
Creare uno spazio dei nomi Kubernetes in cui implementare le risorse.
kubectl create namespace
my-namespace
-
Distribuisre un Amazon EKS
SecurityGroupPolicy
al cluster.-
Salvare la seguente policy di sicurezza di esempio in un file denominato
my-security-group-policy.yaml
. È possibile sostituirepodSelector
conserviceAccountSelector
se si preferisce selezionare i pod in base alle etichette degli account di servizio. É necessario specificare uno selettore. UnpodSelector
vuoto (ad esempio:podSelector: {}
) seleziona tutti i pod nello spazio dei nomi. UnserviceAccountSelector
vuoto seleziona tutti gli account di servizio nello spazio dei nomi. È necessario specificare 1-5 ID gruppo di sicurezza pergroupIds
. Se si specificano più ID, la combinazione di tutte le regole in tutti i gruppi di sicurezza sarà valida per i pod selezionati.apiVersion: vpcresources.k8s.aws/v1beta1 kind: SecurityGroupPolicy metadata: name:
my-security-group-policy
namespace:my-namespace
spec:podSelector
: matchLabels: role:my-role
securityGroups: groupIds: -sg-abc123
Importante -
I gruppi di sicurezza specificati nella policy devono essere esistenti. Se non lo sono, quando si distribuisce un pod che corrisponde al selettore, il pod rimane bloccato nel processo di creazione. Se si descrive il pod, si otterrà un messaggio di errore simile al seguente:
An error occurred (InvalidSecurityGroupID.NotFound) when calling the CreateNetworkInterface operation: The securityGroup ID '
.sg-abc123
' does not exist -
Il gruppo di sicurezza deve consentire la comunicazione in ingresso dal gruppo di protezione del cluster (per
kubelet
) su tutte le porte per cui sono stati configurati i probe. -
Il gruppo di sicurezza deve consentire la comunicazione in uscita a un gruppo di sicurezza che consenta la porta TCP e UDP in ingresso 53 (per i pod CoreDNS) da esso.
-
Se si utilizzano le policy di gruppo di sicurezza con Fargate, assicurarsi che il gruppo di sicurezza disponga di regole che consentono ai pod di comunicare con il piano di controllo Kubernetes. Il modo più semplice per eseguire questa operazione consiste nello specificare il gruppo di sicurezza del cluster come uno dei gruppi di sicurezza.
-
Le policy dei gruppi di sicurezza si applicano solo ai nuovi pod pianificati. Non incidono sui pod in esecuzione.
-
-
Implementare la policy.
kubectl apply -f
my-security-group-policy.yaml
-
-
Implementare un'applicazione di esempio con un'etichetta che corrisponda al valore
permy-role
specificato nel passaggio precedente.podSelector
-
Aggiungere i seguenti contenuti al file.
apiVersion: apps/v1 kind: Deployment metadata: name:
my-deployment
namespace:my-namespace
labels: app:my-app
spec: replicas:1
selector: matchLabels: app:my-app
template: metadata: labels: app:my-app
role:my-role
spec: containers: - name:my-container
image:my-image
ports: - containerPort:80
-
Implementare l'applicazione con il seguente comando. Quando si implementa l'applicazione, il plug-in CNI corrisponde
role
all'etichetta e i gruppi di sicurezza specificati nel passaggio precedente vengono applicati al pod.kubectl apply -f
my-security-group-policy.yaml
Nota -
Se il pod è bloccato nello stato
Waiting
quando si descrive il pod è visibileInsufficient permissions: Unable to create Elastic Network Interface.
, verificare di aver aggiunto la policy IAM al ruolo cluster IAM in un passaggio precedente. -
Se il pod è bloccato nello stato
Pending
, verificare che il tipo di istanza del nodo sia elencato in Istanze e interfacce di rete di filiali supportate da Amazon EC2 e che non sia già stato raggiunto il numero massimo di interfacce di rete di rete di filiali supportate dal tipo di istanza moltiplicato per il numero di nodi nel gruppo di nodi. Ad esempio, una istanzam5.large
supporta nove interfacce di rete di filiali. Se il gruppo di nodi dispone di cinque nodi, è possibile creare un massimo di 45 interfacce di rete di filiali per il gruppo di nodi. Il 46° pod che si tenta di implementare si troverà in uno stato diPending
finché non viene eliminato un altro pod a cui sono associati gruppi di sicurezza.
Se si esegue
kubectl describe pod
e si visualizza un messaggio simile al seguente, può essere ignorato in modo sicuro. Questo messaggio potrebbe essere visualizzato quando il plug-in CNI tenta di impostare la rete host e fallisce durante la creazione dell'interfaccia di rete. Il plug-in CNI registra questo evento fino a quando non viene creata l'interfaccia di rete.my-deployment-xxxxxxxxxx-xxxxx
-nmy-namespace
Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "
e24268322e55c8185721f52df6493684f6c2c3bf4fd59c9c121fd4cdc894579f
" network for pod "my-deployment-59f5f68b58-c89wx
": networkPlugin cni failed to set up pod "my-deployment-59f5f68b58-c89wx_my-namespace
" network: add cmd: failed to assign an IP address to containerNon è possibile superare il numero massimo di pod eseguibili sul tipo di istanza. Per un elenco del numero massimo di pod che eseguibili su ogni tipo di istanza, vedere eni-max-pods.txt
su GitHub. Quando si elimina un pod a cui sono associati gruppi di sicurezza o si elimina il nodo su cui è in esecuzione il pod, il controller di risorse VPC elimina l'interfaccia di rete di filiali. Se si elimina un cluster con pod che utilizzano pod per i gruppi di sicurezza, il controller non elimina le interfacce di rete di filiali. Sarà quindi necessario eliminarle personalmente. -
-
Istanze e interfacce di rete di filiali supportate da Amazon EC2
La tabella seguente elenca il numero di interfacce di rete di filiali utilizzabili con ogni tipo di istanza Amazon EC2 supportato.
Tipo di istanza | Interfacce di rete di filiali |
---|---|
a1.medium | 10 |
a1.large | 9 |
a1.xlarge | 18 |
a1.2xlarge | 38 |
a1.4xlarge | 54 |
a1.metal | 54 |
c5.large | 9 |
c5.xlarge | 18 |
c5.2xlarge | 38 |
c5.4xlarge | 54 |
c5.9xlarge | 54 |
c5.12xlarge | 54 |
c5.18xlarge | 107 |
c5.24xlarge | 107 |
c5.metal | 107 |
c5a.large | 9 |
c5a.xlarge | 18 |
c5a.2xlarge | 38 |
c5a.4xlarge | 54 |
c5a.8xlarge | 54 |
c5a.12xlarge | 54 |
c5a.16xlarge | 107 |
c5a.24xlarge | 107 |
c5d.large | 9 |
c5d.xlarge | 18 |
c5d.2xlarge | 38 |
c5d.4xlarge | 54 |
c5d.9xlarge | 54 |
c5d.12xlarge | 54 |
c5d.18xlarge | 107 |
c5d.24xlarge | 107 |
c5d.metal | 107 |
c5n.large | 9 |
c5n.xlarge | 18 |
c5n.2xlarge | 38 |
c5n.4xlarge | 54 |
c5n.9xlarge | 54 |
c5n.18xlarge | 107 |
c5n.metal | 107 |
c6g.medium | 4 |
c6g.large | 9 |
c6g.xlarge | 18 |
c6g.2xlarge | 38 |
c6g.4xlarge | 54 |
c6g.8xlarge | 54 |
c6g.12xlarge | 54 |
c6g.16xlarge | 107 |
c6g.metal | 107 |
g4dn.xlarge | 39 |
g4dn.2xlarge | 39 |
g4dn.4xlarge | 59 |
g4dn.8xlarge | 58 |
g4dn.12xlarge | 54 |
g4dn.16xlarge | 118 |
g4dn.metal | 107 |
i3en.large | 5 |
i3en.xlarge | 12 |
i3en.2xlarge | 28 |
i3en.3xlarge | 38 |
i3en.6xlarge | 54 |
i3en.12xlarge | 114 |
i3en.24xlarge | 107 |
i3en.metal | 107 |
inf1.xlarge | 38 |
inf1.2xlarge | 38 |
inf1.6xlarge | 54 |
inf1.24xlarge | 107 |
m5.large | 9 |
m5.xlarge | 18 |
m5.2xlarge | 38 |
m5.4xlarge | 54 |
m5.8xlarge | 54 |
m5.12xlarge | 54 |
m5.16xlarge | 107 |
m5.24xlarge | 107 |
m5.metal | 107 |
m5a.large | 9 |
m5a.xlarge | 18 |
m5a.2xlarge | 38 |
m5a.4xlarge | 54 |
m5a.8xlarge | 54 |
m5a.12xlarge | 54 |
m5a.16xlarge | 107 |
m5a.24xlarge | 107 |
m5ad.large | 9 |
m5ad.xlarge | 18 |
m5ad.2xlarge | 38 |
m5ad.4xlarge | 54 |
m5ad.8xlarge | 54 |
m5ad.12xlarge | 54 |
m5ad.16xlarge | 107 |
m5ad.24xlarge | 107 |
m5d.large | 9 |
m5d.xlarge | 18 |
m5d.2xlarge | 38 |
m5d.4xlarge | 54 |
m5d.8xlarge | 54 |
m5d.12xlarge | 54 |
m5d.16xlarge | 107 |
m5d.24xlarge | 107 |
m5d.metal | 107 |
m5dn.large | 9 |
m5dn.xlarge | 18 |
m5dn.2xlarge | 38 |
m5dn.4xlarge | 54 |
m5dn.8xlarge | 54 |
m5dn.12xlarge | 54 |
m5dn.16xlarge | 107 |
m5dn.24xlarge | 107 |
m5n.large | 9 |
m5n.xlarge | 18 |
m5n.2xlarge | 38 |
m5n.4xlarge | 54 |
m5n.8xlarge | 54 |
m5n.12xlarge | 54 |
m5n.16xlarge | 107 |
m5n.24xlarge | 107 |
m6g.medium | 4 |
m6g.large | 9 |
m6g.xlarge | 18 |
m6g.2xlarge | 38 |
m6g.4xlarge | 54 |
m6g.8xlarge | 54 |
m6g.12xlarge | 54 |
m6g.16xlarge | 107 |
m6g.metal | 107 |
p3.2xlarge | 38 |
p3.8xlarge | 54 |
p3.16xlarge | 114 |
p3dn.24xlarge | 107 |
r5.large | 9 |
r5.xlarge | 18 |
r5.2xlarge | 38 |
r5.4xlarge | 54 |
r5.8xlarge | 54 |
r5.12xlarge | 54 |
r5.16xlarge | 107 |
r5.24xlarge | 107 |
r5.metal | 107 |
r5a.large | 9 |
r5a.xlarge | 18 |
r5a.2xlarge | 38 |
r5a.4xlarge | 54 |
r5a.8xlarge | 54 |
r5a.12xlarge | 54 |
r5a.16xlarge | 107 |
r5a.24xlarge | 107 |
r5ad.large | 9 |
r5ad.xlarge | 18 |
r5ad.2xlarge | 38 |
r5ad.4xlarge | 54 |
r5ad.8xlarge | 54 |
r5ad.12xlarge | 54 |
r5ad.16xlarge | 107 |
r5ad.24xlarge | 107 |
r5d.large | 9 |
r5d.xlarge | 18 |
r5d.2xlarge | 38 |
r5d.4xlarge | 54 |
r5d.8xlarge | 54 |
r5d.12xlarge | 54 |
r5d.16xlarge | 107 |
r5d.24xlarge | 107 |
r5d.metal | 107 |
r5dn.large | 9 |
r5dn.xlarge | 18 |
r5dn.2xlarge | 38 |
r5dn.4xlarge | 54 |
r5dn.8xlarge | 54 |
r5dn.12xlarge | 54 |
r5dn.16xlarge | 107 |
r5dn.24xlarge | 107 |
r5n.large | 9 |
r5n.xlarge | 18 |
r5n.2xlarge | 38 |
r5n.4xlarge | 54 |
r5n.8xlarge | 54 |
r5n.12xlarge | 54 |
r5n.16xlarge | 107 |
r5n.24xlarge | 107 |
r6g.medium | 4 |
r6g.large | 9 |
r6g.xlarge | 18 |
r6g.2xlarge | 38 |
r6g.4xlarge | 54 |
r6g.8xlarge | 54 |
r6g.12xlarge | 54 |
r6g.16xlarge | 107 |
z1d.large | 13 |
z1d.xlarge | 28 |
z1d.2xlarge | 58 |
z1d.3xlarge | 54 |
z1d.6xlarge | 54 |
z1d.12xlarge | 107 |
z1d.metal | 107 |