Configuração do Amazon VPC CNI plugin for Kubernetes a fim de usar perfis do IAM para contas de serviço (IRSA) - Amazon EKS

Configuração do Amazon VPC CNI plugin for Kubernetes a fim de usar perfis do IAM para contas de serviço (IRSA)

O Amazon VPC CNI plugin for Kubernetes é o plugin de rede para redes de 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:

  • Ele exige permissões AWS Identity and Access Management (IAM). Se o cluster usa a família IPv4, as permissões são especificadas na política AmazonEKS_CNI_Policy gerenciada pela AWS. Se o seu cluster utiliza a família IPv6, as permissões devem ser adicionadas a um política do IAM que você mesmo cria.É possível anexar a política a Amazon EKS node IAM role ou a uma função do IAM separada. 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.

Pré-requisitos

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

Como criar o perfil do IAM
  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 AWS CLI 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 implanta uma pilha do AWS CloudFormation que cria um perfil do IAM, anexa a ela a política que você especificar e anota a conta de serviço do aws-node Kubernetes existente com o ARN do perfil do IAM criada.

    • IPv4

      Substitua my-cluster pelos seus próprios valores.

      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 pelos seus próprios valores. Substitua 111122223333 pelo ID da conta e AmazonEKS_CNI_IPv6_Policy pelo nome da política de 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 Endereços IPv6 para clusters, Pods e services.

      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 and the 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 denominado vpc-cni-trust-policy.json. Substitua 111122223333 pelo ID da conta e EXAMPLED539D4633E53DE1B71EXAMPLE pela saída retornada na etapa anterior. Substitua region-code pela Região da AWS em que está o cluster.

      { "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. É possível substituir AmazonEKSVPCCNIRole por qualquer nome que você escolher.

      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 conta e AmazonEKS_CNI_IPv6_Policy pelo nome da política de 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 Endereços IPv6 para clusters, Pods e services.

        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 example values pelos 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 utilizado pela sua conta de serviço Kubernetes. Para ter mais informações, consulte Configuração do endpoint do AWS Security Token Service para uma conta de serviço.

Etapa 2: Reimplantar os Pods do Amazon VPC CNI plugin for Kubernetes

  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 utilizando o endpoint da Região da AWS, a linha a seguir 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 a função do IAM de nó do Amazon EKS atualmente tem a AmazonEKS_CNI_Policypolítica do IAM (IPv4) ou uma políticaIPv6anexada a ela, e você criou uma função do IAM separada, anexou a política a ela e a atribuiu à conta de serviço aws-node, então recomendamos que você remova a política da sua função de nó com o comando Kubernetes correspondente à AWS CLI família de IP do seu cluster. Substitua AmazonEKSNodeRole pelo nome da função do 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 conta e AmazonEKS_CNI_IPv6_Policy pelo nome da política de 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 Endereços IPv6 para clusters, Pods e services.

  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