Utiliser une politique de groupe de sécurité pour un Amazon EKS Pod - Amazon EKS

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utiliser une politique de groupe de sécurité pour un Amazon EKS Pod

Pour utiliser des groupes de sécurité pour Pods, vous devez disposer d'un groupe de sécurité existant. Les étapes suivantes vous montrent comment utiliser la stratégie de groupe de sécurité pour un Pod. Sauf indication contraire, effectuez toutes les étapes à partir du même terminal, car les variables utilisées dans les étapes suivantes ne sont pas conservées d'un terminal à l'autre.

Si vous avez un Pod avec EC2 les instances Amazon, vous devez configurer le plugin avant d'utiliser cette procédure. Pour de plus amples informations, veuillez consulter Configurez le Amazon VPC CNI plugin for Kubernetes pour les groupes de sécurité pour Amazon EKS Pods.

  1. Créez un Kubernetes espace de noms dans lequel déployer des ressources. Vous pouvez remplacer my-namespace avec le nom d'un espace de noms que vous souhaitez utiliser.

    kubectl create namespace my-namespace
  2. Déployez un Amazon sur EKS SecurityGroupPolicy votre cluster.

    1. Copiez les contenus suivants sur votre appareil. Vous pouvez remplacer podSelector avec serviceAccountSelector si vous préférez sélectionner Pods sur la base des étiquettes des comptes de service. Vous devez spécifier un sélecteur ou l'autre. Un champ vide podSelector (exemple :podSelector: {}) sélectionne tout Pods dans l'espace de noms. Tu peux changer my-role au nom de votre rôle. Un serviceAccountSelector vide sélectionne tous les comptes de service dans l'espace de noms. Vous pouvez remplacer my-security-group-policy avec un nom pour votre SecurityGroupPolicy et my-namespace avec l'espace de noms SecurityGroupPolicy dans lequel vous souhaitez créer le nom.

      Vous devez remplacer my_pod_security_group_id avec l'ID d'un groupe de sécurité existant. Si vous n'avez pas de groupe de sécurité existant, vous devez en créer un. Pour plus d'informations, consultez les groupes EC2 de sécurité Amazon pour les instances Linux dans le guide de EC2 l'utilisateur Amazon. Vous pouvez spécifier un groupe IDs de sécurité de 1 à 5. Si vous spécifiez plusieurs identifiants, la combinaison de toutes les règles de tous les groupes de sécurité est effective pour les éléments sélectionnés. 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
      Important

      Le ou les groupes de sécurité que vous spécifiez pour votre Pods doit répondre aux critères suivants :

      • Ils doivent exister. S'ils n'existent pas, alors, lorsque vous déployez un Pod qui correspond au sélecteur, votre Pod reste bloqué dans le processus de création. Si vous décrivez le Pod, vous verrez un message d'erreur similaire au suivant :An error occurred (InvalidSecurityGroupID.NotFound) when calling the CreateNetworkInterface operation: The securityGroup ID 'sg-05b1d815d1EXAMPLE' does not exist.

      • Ils doivent autoriser les communications entrantes depuis le groupe de sécurité appliqué à vos nœuds (pourkubelet) via tous les ports pour lesquels vous avez configuré des sondes.

      • Ils doivent autoriser les communications sortantes via TCP les UDP ports 53 vers un groupe de sécurité attribué au Pods (ou des nœuds qui Pods courir (continuer) en cours CoreDNS. Le groupe de sécurité pour votre CoreDNS Pods doit autoriser le trafic entrant TCP et le trafic du UDP port 53 en provenance du groupe de sécurité que vous spécifiez.

      • Ils doivent disposer des règles entrantes et sortantes nécessaires pour communiquer avec d'autres Pods avec lesquels ils doivent communiquer.

      • Ils doivent avoir des règles qui permettent Pods pour communiquer avec le Kubernetes plan de contrôle si vous utilisez le groupe de sécurité avec Fargate. La façon la plus simple de le faire est de spécifier le groupe de sécurité de cluster comme l'un des groupes de sécurité.

      Les politiques des groupes de sécurité ne s'appliquent qu'aux nouvelles planifications Pods. Ils n'affectent pas la course Pods.

    2. Déployez la politique.

      kubectl apply -f my-security-group-policy.yaml
  3. Déployez un exemple d'application avec une étiquette correspondant au my-role valeur pour podSelector que vous avez spécifié lors d'une étape précédente.

    1. Copiez les contenus suivants sur votre appareil. Remplacez le example values avec le vôtre, puis exécutez la commande modifiée. Si vous remplacez my-role, assurez-vous qu'il s'agit de la même valeur que celle que vous avez spécifiée pour le sélecteur à l'étape précédente.

      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
    2. Pour déployer l'application, exécutez la commande suivante. Lorsque vous déployez l'application, le Amazon VPC CNI plugin for Kubernetes correspond à l'roleétiquette et les groupes de sécurité que vous avez spécifiés à l'étape précédente sont appliqués au Pod.

      kubectl apply -f sample-application.yaml
  4. Consultez le Pods déployé avec l'exemple d'application. Pour le reste de ce sujet, ce terminal est appelé TerminalA.

    kubectl get pods -n my-namespace -o wide

    L'exemple qui suit illustre un résultat.

    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>
    Note

    Essayez ces conseils, le cas échéant Pods sont bloqués.

    • Le cas échéant Pods sont bloqués dans l'Waitingétat, puis exécutentkubectl describe pod my-deployment-xxxxxxxxxx-xxxxx -n my-namespace . Si c'est le casInsufficient permissions: Unable to create Elastic Network Interface., confirmez que vous avez ajouté la IAM politique au rôle de IAM cluster lors d'une étape précédente.

    • Le cas échéant Pods sont bloqués, vérifiez que Pending le type d'instance de votre nœud est répertorié dans limits.go et que le produit du nombre maximum d'interfaces réseau de succursales prises en charge par le type d'instance multiplié par le nombre de nœuds de votre groupe de nœuds n'est pas déjà atteint. Par exemple, une instance m5.large prend en charge neuf interfaces réseau de branche. Si votre groupe de nœuds comporte cinq nœuds, un maximum de 45 interfaces réseau de branche peut être créé pour le groupe de nœuds. Le 46e Pod que vous tentez de déployer restera en place jusqu'Pendingà un autre Pod auquel des groupes de sécurité sont associés est supprimé.

    Si vous exécutez kubectl describe pod my-deployment-xxxxxxxxxx-xxxxx -n my-namespace et recevez un message similaire au message suivant, il peut être ignoré en toute sécurité. Ce message peut apparaître lorsque Amazon VPC CNI plugin for Kubernetes tente de configurer le réseau hôte et échoue lors de la création de l'interface réseau. Le plugin journalise cet événement jusqu'à ce que l'interface réseau soit créée.

    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

    Vous ne pouvez pas dépasser le nombre maximum de Pods qui peut être exécuté sur le type d'instance. Pour une liste du nombre maximum de Pods que vous pouvez exécuter sur chaque type d'instance, voir eni-max-pods.txt sur GitHub. Lorsque vous supprimez un Pod auquel sont associés des groupes de sécurité, ou supprimez le nœud auquel le Pod est en cours d'exécution, le contrôleur de VPC ressources supprime l'interface réseau de la succursale. Si vous supprimez un cluster avec Pods utilisant Pods pour les groupes de sécurité, le contrôleur ne supprime pas les interfaces réseau des succursales. Vous devez donc les supprimer vous-même. Pour plus d'informations sur la suppression d'interfaces réseau, consultez Supprimer une interface réseau dans le guide de EC2 l'utilisateur Amazon.

  5. Dans un terminal séparé, entrez dans l'un des Pods. Dans le reste de cette rubrique, ce terminal est appeléTerminalB. Remplacez 5df6f7687b-4fbjm par l'identifiant de l'un des Pods renvoyé dans votre sortie de l'étape précédente.

    kubectl exec -it -n my-namespace my-deployment-5df6f7687b-4fbjm -- /bin/bash
  6. À partir du shell dans TerminalB, confirmez que l'exemple d'application fonctionne.

    curl my-app

    L'exemple qui suit illustre un résultat.

    <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]

    Vous avez reçu le résultat parce que tous Pods l'exécution de l'application est associée au groupe de sécurité que vous avez créé. Ce groupe contient une règle qui autorise tout le trafic entre tous Pods auquel le groupe de sécurité est associé. DNSle trafic sortant de ce groupe de sécurité est autorisé vers le groupe de sécurité du cluster, qui est associé à vos nœuds. Les nœuds exécutent le CoreDNS Pods, qui est votre Pods a fait une recherche de nom.

  7. DansTerminalA, supprimez les règles de groupe de sécurité qui autorisent DNS la communication avec le groupe de sécurité du cluster depuis votre groupe de sécurité. Si vous n'avez pas ajouté les DNS règles au groupe de sécurité du cluster lors d'une étape précédente, remplacez $my_cluster_security_group_id avec l'ID du groupe de sécurité dans lequel vous avez créé les règles.

    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
  8. À partir du TerminalB, essayez de nouveau d'accéder à l'application.

    curl my-app

    L'exemple qui suit illustre un résultat.

    curl: (6) Could not resolve host: my-app

    La tentative échoue car le Pod n'est plus en mesure d'accéder au CoreDNS Pods, auxquels le groupe de sécurité du cluster est associé. Le groupe de sécurité du cluster ne possède plus les règles de groupe de sécurité qui autorisent les DNS communications depuis le groupe de sécurité associé à votre Pod.

    Si vous tentez d'accéder à l'application en utilisant les adresses IP renvoyées pour l'un des Pods lors d'une étape précédente, vous recevez toujours une réponse car tous les ports sont autorisés entre Pods auxquels le groupe de sécurité est associé et aucune recherche de nom n'est requise.

  9. Une fois l'expérimentation terminée, vous pouvez supprimer les exemples de politique de groupe de sécurité, d'application et de groupe de sécurité que vous avez créés. Exécutez les commandes suivantes à partir du 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