Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Utilizza una politica di gruppo di sicurezza per Amazon EKS Pod
Per utilizzare i gruppi di sicurezza per Pods, è necessario disporre di un gruppo di sicurezza esistente. I passaggi seguenti mostrano come utilizzare la politica del gruppo di sicurezza per un Pod. Salvo diversa indicazione, completa tutti i passaggi dallo stesso terminale perché nei passaggi seguenti vengono utilizzate variabili che non persistono tra i terminali.
Se hai un Pod con EC2 le istanze Amazon, è necessario configurare il plug-in prima di utilizzare questa procedura. Per ulteriori informazioni, consulta Configura il Amazon VPC CNI plugin for Kubernetes per gruppi di sicurezza per Amazon EKS Pods.
-
Crea un Kubernetes namespace in cui distribuire le risorse. È possibile sostituire
my-namespace
con il nome di uno spazio dei nomi che si desidera utilizzare.kubectl create namespace my-namespace
-
EKS
SecurityGroupPolicy
Implementa un Amazon nel tuo cluster.-
Copia i seguenti contenuti sul dispositivo. Puoi sostituire
podSelector
conserviceAccountSelector
se preferisci selezionare Pods in base alle etichette degli account di servizio. É necessario specificare uno selettore. Un campo vuotopodSelector
(esempio:podSelector: {}
) seleziona tutto Pods nello spazio dei nomi. Puoi cambiaremy-role
al nome del tuo ruolo. UnserviceAccountSelector
vuoto seleziona tutti gli account di servizio nello spazio dei nomi. Puoi sostituiremy-security-group-policy
con un nome per la tuaSecurityGroupPolicy
manomy-namespace
con lo spazio dei nomi in cui vuoi creare ilSecurityGroupPolicy
file.È necessario sostituire
my_pod_security_group_id
con l'ID di un gruppo di sicurezza esistente. Se non disponi di un gruppo di sicurezza esistente, devi crearne uno. Per ulteriori informazioni, consulta i gruppi EC2 di sicurezza Amazon per le istanze Linux nella Amazon EC2 User Guide. Puoi specificare 1-5 gruppi di sicurezza. IDs Se si specifica più di un ID, la combinazione di tutte le regole di tutti i gruppi di sicurezza ha effetto per il gruppo di sicurezza selezionato Pods.cat >my-security-group-policy.yaml <<EOF apiVersion: vpcresources.k8s.aws/v1beta1 kind: SecurityGroupPolicy metadata: name: my-security-group-policy namespace: my-namespace spec: podSelector: matchLabels: role: my-role securityGroups: groupIds: - my_pod_security_group_id EOF
Importante
Il gruppo o i gruppi di sicurezza specificati per Pods devono soddisfare i seguenti criteri:
-
Devono essere esistenti. Se non esistono, allora, quando si distribuisce un Pod che corrisponde al selettore, il tuo Pod rimane bloccato nel processo di creazione. Se descrivi il Pod, vedrai un messaggio di errore simile al seguente:
An error occurred (InvalidSecurityGroupID.NotFound) when calling the CreateNetworkInterface operation: The securityGroup ID '
.sg-05b1d815d1EXAMPLE
' does not exist -
Devono consentire la comunicazione in entrata dal gruppo di sicurezza applicato ai tuoi nodi (per
kubelet
) su tutte le porte per le quali hai configurato le sonde. -
Devono consentire la comunicazione in uscita attraverso le
UDP
porte 53TCP
e verso un gruppo di sicurezza assegnato al Pods (o nodi che Pods run on) in esecuzione CoreDNS. Il gruppo di sicurezza per te CoreDNS Pods deve consentire il traffico in entrataTCP
e sullaUDP
porta 53 proveniente dal gruppo di sicurezza specificato. -
Devono disporre delle regole in entrata e in uscita necessarie per comunicare con gli altri Pods con cui devono comunicare.
-
Devono avere regole che consentano Pods per comunicare con Kubernetes piano di controllo se si utilizza il gruppo di sicurezza con Fargate. Il modo più semplice per eseguire questa operazione consiste nello specificare il gruppo di sicurezza del cluster come uno dei gruppi di sicurezza.
Le politiche dei gruppi di sicurezza si applicano solo ai nuovi programmi Pods. Non influiscono sulla corsa Pods.
-
-
Implementare la policy.
kubectl apply -f my-security-group-policy.yaml
-
-
Implementate un'applicazione di esempio con un'etichetta che corrisponda a
my-role
valore perpodSelector
che hai specificato in un passaggio precedente.-
Copia i seguenti contenuti sul dispositivo. Sostituisci il
example values
con il tuo e poi esegui il comando modificato. Se sostituiscimy-role
, assicurati che sia lo stesso valore che hai specificato per il selettore in un passaggio precedente.cat >sample-application.yaml <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment namespace: my-namespace labels: app: my-app spec: replicas: 4 selector: matchLabels: app: my-app template: metadata: labels: app: my-app role: my-role spec: terminationGracePeriodSeconds: 120 containers: - name: nginx image: public.ecr.aws/nginx/nginx:1.23 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-app namespace: my-namespace labels: app: my-app spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80 EOF
-
Implementare l'applicazione con il seguente comando. Quando si distribuisce l'applicazione, Amazon VPC CNI plugin for Kubernetes corrisponde all'
role
etichetta e i gruppi di sicurezza specificati nel passaggio precedente vengono applicati a Pod.kubectl apply -f sample-application.yaml
-
-
Visualizza il Pods distribuito con l'applicazione di esempio. Nella parte restante di questo argomento, questo terminale è indicato come
TerminalA
.kubectl get pods -n my-namespace -o wide
Di seguito viene riportato un output di esempio:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-deployment-5df6f7687b-4fbjm 1/1 Running 0 7m51s 192.168.53.48 ip-192-168-33-28.region-code.compute.internal <none> <none> my-deployment-5df6f7687b-j9fl4 1/1 Running 0 7m51s 192.168.70.145 ip-192-168-92-33.region-code.compute.internal <none> <none> my-deployment-5df6f7687b-rjxcz 1/1 Running 0 7m51s 192.168.73.207 ip-192-168-92-33.region-code.compute.internal <none> <none> my-deployment-5df6f7687b-zmb42 1/1 Running 0 7m51s 192.168.63.27 ip-192-168-33-28.region-code.compute.internal <none> <none>
Nota
Prova questi suggerimenti, se ce ne sono. Pods sono bloccati
-
Se ce ne sono Pods sono bloccati nello
Waiting
stato, quindi scappanokubectl describe pod
. Se lo vedimy-deployment-xxxxxxxxxx-xxxxx
-nmy-namespace
Insufficient permissions: Unable to create Elastic Network Interface.
, conferma di aver aggiunto la IAM policy al ruolo del IAM cluster in un passaggio precedente. -
Se ce ne sono Pods sono bloccati nello
Pending
stato, verifica che il tipo di istanza del nodo sia elencato in limits.goe che il prodotto ottenuto dal numero massimo di interfacce di rete di filiale supportate dal tipo di istanza moltiplicato per il numero di nodi nel gruppo di nodi non sia già stato raggiunto. 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 46esimo Pod quello che tenterai di schierare resterà in carica fino all'Pending
altro Pod a cui sono associati gruppi di sicurezza viene eliminato.
Se si esegue
kubectl describe pod
e si visualizza un messaggio simile al seguente, può essere ignorato in modo sicuro. Questo messaggio potrebbe apparire quando Amazon VPC CNI plugin for Kubernetes tenta di configurare la rete host e fallisce durante la creazione dell'interfaccia di rete. Il plug-in 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-5df6f7687b-4fbjm": networkPlugin cni failed to set up Pod "my-deployment-5df6f7687b-4fbjm-c89wx_my-namespace" network: add cmd: failed to assign an IP address to container
Non è possibile superare il numero massimo di Pods che può essere eseguito sul tipo di istanza. Per un elenco del numero massimo di Pods che puoi eseguire su ogni tipo di istanza, consulta eni-max-pods.txt
su GitHub. Quando si elimina un Pod a cui sono associati gruppi di sicurezza o elimina il nodo che Pod è in esecuzione, il controller VPC delle risorse elimina l'interfaccia di rete della filiale. Se si elimina un cluster con Pods utilizzo di Pods per i gruppi di sicurezza, il controller non elimina le interfacce di rete delle filiali, quindi dovrai eliminarle tu stesso. Per informazioni su come eliminare le interfacce di rete, consulta Delete a network interface nella Amazon EC2 User Guide. -
-
In un terminale separato, accedi a uno dei Pods. Per il resto di questo argomento, questo terminale viene denominato
TerminalB
. Sostituisci5df6f7687b
-4fbjm
kubectl exec -it -n my-namespace my-deployment-5df6f7687b-4fbjm -- /bin/bash
-
Confermare il funzionamento dell'applicazione di esempio dalla shell in
TerminalB
.curl my-app
Di seguito viene riportato un output di esempio:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
Hai ricevuto l'output perché Pods l'esecuzione dell'applicazione è associata al gruppo di sicurezza che hai creato. Tale gruppo contiene una regola che consente tutto il traffico tra tutti Pods a cui è associato il gruppo di sicurezza. DNSè consentito il traffico in uscita da quel gruppo di sicurezza verso il gruppo di sicurezza del cluster, che è associato ai nodi. I nodi eseguono il CoreDNS Pods, qual è il tuo Pods ho cercato il nome di.
-
Da
TerminalA
, rimuovi le regole del gruppo di sicurezza che consentono la DNS comunicazione con il gruppo di sicurezza del cluster dal tuo gruppo di sicurezza. Se non hai aggiunto le DNS regole al gruppo di sicurezza del cluster in un passaggio precedente, sostituiscile$my_cluster_security_group_id
con l'ID del gruppo di sicurezza in cui hai creato le regole.aws ec2 revoke-security-group-ingress --group-id $my_cluster_security_group_id --security-group-rule-ids $my_tcp_rule_id aws ec2 revoke-security-group-ingress --group-id $my_cluster_security_group_id --security-group-rule-ids $my_udp_rule_id
-
Tentare di accedere nuovamente all'applicazione da
TerminalB
.curl my-app
Di seguito viene riportato un output di esempio:
curl: (6) Could not resolve host: my-app
Il tentativo fallisce perché Pod non è più in grado di accedere a CoreDNS Pods, a cui è associato il gruppo di sicurezza del cluster. Il gruppo di sicurezza del cluster non dispone più delle regole del gruppo di sicurezza che consentono la DNS comunicazione dal gruppo di sicurezza associato al Pod.
Se si tenta di accedere all'applicazione utilizzando gli indirizzi IP restituiti per uno dei Pods in un passaggio precedente, si riceve comunque una risposta perché tutte le porte sono consentite Pods a cui è associato il gruppo di sicurezza e non è richiesta la ricerca del nome.
-
Una volta terminata la sperimentazione, puoi rimuovere la policy, l'applicazione e il gruppo di sicurezza del gruppo di sicurezza di esempio che hai creato. Esegui i comandi seguenti da
TerminalA
.kubectl delete namespace my-namespace aws ec2 revoke-security-group-ingress --group-id $my_pod_security_group_id --security-group-rule-ids $my_inbound_self_rule_id wait sleep 45s aws ec2 delete-security-group --group-id $my_pod_security_group_id