Configurar o plug-in CNI da Amazon VPC para usar IRSA - Amazon EKS

Ajudar a melhorar esta página

Quer contribuir para este guia do usuário? Escolha o link Editar esta página no GitHub, disponível no painel direito de cada página. Suas contribuições ajudarão a tornar nosso guia do usuário melhor para todos.

Configurar o plug-in CNI da Amazon VPC para usar IRSA

O plug-in CNI do Amazon VPC para Kubernetes é o plug-in de rede para a rede Pod em clusters do Amazon EKS. O plug-in é responsável por alocar os endereços IP da VPC para os nós do Kubernetes e configurar as redes necessárias para os Pods em cada nó. O plugin:

  • Requer permissões do AWS Identity and Access Management (IAM). Se o cluster usar a família IPv4, as permissões serão especificadas na política gerenciada AmazonEKS_CNI_Policy` da AWS. Se o cluster usar a família IPv6, as permissões deverão ser adicionadas a uma política do IAM criada por você. Para obter instruções, consulte Criar uma política do IAM para clusters que usam a família IPv6. É possível anexar a política a Amazon EKS node IAM role ou a uma função do IAM separada. Para obter instruções sobre como anexar a política ao perfil do IAM do nó do Amazon EKS, consulte Perfil do IAM em nós do Amazon EKS. Recomendamos atribuir a uma função separada, conforme detalhado neste tópico.

  • Cria e está configurado para usar uma conta de serviço Kubernetes chamada aws-node quando ele for implantado. A conta de serviço está vinculada a um clusterrole do Kubernetes chamado aws-node, ao qual são atribuídas as permissões necessárias do Kubernetes.

nota

Os Pods para o Amazon VPC CNI plugin for Kubernetes têm acesso às permissões atribuídas a Amazon EKS node IAM role, a menos que você bloqueie o acesso ao IMDS. Para obter mais informações, consulte Restringir o acesso ao perfil da instância atribuído ao nó de processamento.

Etapa 1: Criar o perfil do IAM Amazon VPC CNI plugin for Kubernetes

  1. Determine a família de IP do seu cluster.

    aws eks describe-cluster --name my-cluster | grep ipFamily

    Veja um exemplo de saída abaixo.

    "ipFamily": "ipv4"

    Em vez disso, a saída pode retornar ipv6.

  2. Crie o perfil do IAM. Você pode usar eksctl ou kubectl e a CLI AWS para criar seu perfil do IAM.

    eksctl
    • Crie um perfil do IAM e anexe a política do IAM a esse perfil por meio do comando que corresponde à família de IP do cluster. O comando cria e implementa uma pilha do AWS CloudFormation que cria um perfil do IAM, anexa a política que você especifica a ela e anota a conta de serviço aws-node do Kubernetes existente com o ARN do perfil do IAM criado.

      • IPv4

        Substitua my-cluster pelo seu próprio valor.

        eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster my-cluster \ --role-name AmazonEKSVPCCNIRole \ --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --override-existing-serviceaccounts \ --approve
      • IPv6

        Substitua my-cluster pelo seu próprio valor. Substitua 111122223333 pelo ID da sua conta e substitua AmazonEKS_CNI_IPv6_Policy pelo nome da sua política IPv6. Se não tiver uma política IPv6, consulte Criar uma política do IAM para clusters que usam a família IPv6 para criá-la. Para utilizar IPv6 com seu cluster, este deve atender a vários requisitos. Para ter mais informações, consulte Saiba mais sobre endereços IPv6 para clusters, Pods e serviços.

        eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster my-cluster \ --role-name AmazonEKSVPCCNIRole \ --attach-policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \ --override-existing-serviceaccounts \ --approve
    kubectl e a AWS CLI
    1. Exiba a URL do provedor OIDC do cluster.

      aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text

      Veja um exemplo de saída abaixo.

      https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE

      Se nenhum resultado for retornado, você deverá criar um provedor OIDC do IAM do seu cluster.

    2. Copie o conteúdo a seguir em um arquivo chamado vpc-cni-trust-policy.json. Substitua 111122223333 pelo ID de sua conta e EXAMPLED539D4633E53DE1B71EXAMPLE pelo resultado retornado na etapa anterior. Substitua region-code pela região da AWS em que seu cluster se encontra.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-node" } } } ] }
    3. Crie a função. Você pode substituir AmazonEKSVPCCNIRole por qualquer nome que desejar.

      aws iam create-role \ --role-name AmazonEKSVPCCNIRole \ --assume-role-policy-document file://"vpc-cni-trust-policy.json"
    4. Anexe a política do IAM necessária à função. Execute o comando que corresponde à família de IP do seu cluster.

      • IPv4

        aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --role-name AmazonEKSVPCCNIRole
      • IPv6

        Substitua 111122223333 pelo ID da sua conta e AmazonEKS_CNI_IPv6_Policy pelo nome da sua política IPv6. Se não tiver uma política IPv6, consulte Criar uma política do IAM para clusters que usam a família IPv6 para criá-la. Para utilizar IPv6 com seu cluster, este deve atender a vários requisitos. Para ter mais informações, consulte Saiba mais sobre endereços IPv6 para clusters, Pods e serviços.

        aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \ --role-name AmazonEKSVPCCNIRole
    5. Execute o seguinte comando para anotar a conta de serviço aws-node com o ARN do perfil do IAM criado por você anteriormente: Substitua os valores de exemplo por seus próprios valores.

      kubectl annotate serviceaccount \ -n kube-system aws-node \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
  3. (Opcional) Configure o tipo de endpoint do AWS Security Token Service usado por sua conta de serviço Kubernetes. Para ter mais informações, consulte Configure o endpoint do AWS Security Token Service para uma conta de serviço.

Etapa 2: Reimplantar os do Amazon VPC CNI plugin for KubernetesPods

  1. Exclua e recrie os Pods existentes associados à conta de serviço para aplicar as variáveis de ambiente de credenciais. A anotação não é aplicada a Pods que estejam sendo executados sem a anotação. O comando a seguir exclui os aws-node DaemonSet Pods existentes e os implanta com a anotação da conta de serviço.

    kubectl delete Pods -n kube-system -l k8s-app=aws-node
  2. Confirme se todos os Pods foram reiniciados.

    kubectl get pods -n kube-system -l k8s-app=aws-node
  3. Descreva um dos Pods e verifique se as variáveis de ambiente AWS_WEB_IDENTITY_TOKEN_FILE e AWS_ROLE_ARN existem. Substitua cpjw7 pelo nome de um dos Pods retornados no resultado da etapa anterior.

    kubectl describe pod -n kube-system aws-node-cpjw7 | grep 'AWS_ROLE_ARN:\|AWS_WEB_IDENTITY_TOKEN_FILE:'

    Veja um exemplo de saída abaixo.

    AWS_ROLE_ARN: arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token AWS_ROLE_ARN: arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token

    Dois conjuntos de resultados duplicados são retornados porque o Pod contém dois contêineres. Os dois contêineres têm os mesmos valores.

    Se o seu Pod estiver usando o endpoint AWS Regional, a seguinte linha também será retornada na saída anterior.

    AWS_STS_REGIONAL_ENDPOINTS=regional

Etapa 3: Remover a política CNI do perfil do IAM do nó

Se o perfil do IAM do nó do Amazon EKS tiver atualmente a política AmazonEKS_CNI_Policy do IAM (IPv4) ou uma política IPv6 anexada e você tiver criado um perfil do IAM separado, anexado a política a ele e atribuído a conta de serviço aws-node do Kubernetes, recomendamos remover a política do perfil de nó com o comando da AWS CLI que corresponde à família de IPs do cluster. Substitua AmazonEKSNodeRole pelo nome da sua função de nó.

  • IPv4

    aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
  • IPv6

    Substitua 111122223333 pelo ID da sua conta e AmazonEKS_CNI_IPv6_Policy pelo nome da sua política IPv6.

    aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy

Criar uma política do IAM para clusters que usam a família IPv6

Se você tiver criado um cluster que usa a família IPv6 e esse cluster tiver a versão 1.10.1 ou superior do complemento Amazon VPC CNI plugin for Kubernetes configurado, será necessário criar uma política do IAM que você possa atribuir a um perfil do IAM. Se você tiver um cluster que não foi configurado com a família IPv6 no momento da criação, será necessário criar um novo cluster para usar IPv6. Para obter mais informações sobre como usar o IPv6 com o seu cluster, consulte Saiba mais sobre endereços IPv6 para clusters, Pods e serviços.

  1. Copie o texto a seguir e salve-o em um arquivo chamado vpc-cni-ipv6-policy.json.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssignIpv6Addresses", "ec2:DescribeInstances", "ec2:DescribeTags", "ec2:DescribeNetworkInterfaces", "ec2:DescribeInstanceTypes" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": [ "arn:aws:ec2:*:*:network-interface/*" ] } ] }
  2. Crie a política do IAM.

    aws iam create-policy --policy-name AmazonEKS_CNI_IPv6_Policy --policy-document file://vpc-cni-ipv6-policy.json