Gruppi di sicurezza per pod - Amazon EKS

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 e r6g. La famiglia di istanze t3 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 e LoadBalancer che utilizzano le istanze target con un externalTrafficPolicy set per Local 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 e vpc-resource-controller gli account del servizio Kubernetes devono essere specificati in Kubernetes ClusterRoleBinding per il Role che le psp è assegnato. Se si utilizza Amazon EKS psp, Role, e ClusterRoleBinding, questa è la eks:podsecuritypolicy:authenticated ClusterRoleBinding. Ad esempio, è necessario aggiungere gli account di servizio alla sezione subjects:, 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

  1. 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.

  2. Aggiungere la AmazonEKSVPCResourceController policy gestita dal ruolo del cluster associato al cluster Amazon EKS. La policy consente 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
  3. Abilitare il plug-in CNI per gestire le interfacce di rete per i pod impostando la proprietà ENABLE_POD_ENI variabile a true nel aws-node DaemonSet. Una volta che questa impostazione è settata su true, per ogni nodo nel cluster il plug-in aggiunge un'etichetta con il valore vpc.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 descrizione aws-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 su true 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 il kubelet 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"}]}}}}'
  4. Creare uno spazio dei nomi Kubernetes in cui implementare le risorse.

    kubectl create namespace my-namespace
  5. Distribuisre un Amazon EKS SecurityGroupPolicy al cluster.

    1. Salvare la seguente policy di sicurezza di esempio in un file denominato my-security-group-policy.yaml. È possibile sostituire podSelector con serviceAccountSelector se si preferisce selezionare i pod in base alle etichette degli account di servizio. É necessario specificare uno selettore. Un podSelector vuoto (ad esempio: podSelector: {}) seleziona tutti i pod nello spazio dei nomi. Un serviceAccountSelector vuoto seleziona tutti gli account di servizio nello spazio dei nomi. È necessario specificare 1-5 ID gruppo di sicurezza per groupIds. 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.

    2. Implementare la policy.

      kubectl apply -f my-security-group-policy.yaml
  6. Implementare un'applicazione di esempio con un'etichetta che corrisponda al valore my-role per podSelector specificato nel passaggio precedente.

    1. 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
    2. 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 è visibile Insufficient 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 istanza m5.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 di Pending finché non viene eliminato un altro pod a cui sono associati gruppi di sicurezza.

      Se si esegue kubectl describe pod my-deployment-xxxxxxxxxx-xxxxx -n my-namespace 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.

      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 container

      Non è 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