Ir para o conteúdo

Como soluciono problemas com o complemento CNI do Amazon VPC para o Amazon EKS?

8 minuto de leitura
0

Quero usar o complemento da interface de rede de contêineres (CNI) da Amazon Virtual Private Cloud (Amazon VPC) em meus clusters do Amazon Elastic Kubernetes Service (Amazon EKS). No entanto, recebo erros.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Se o nó de processamento não estiver pronto porque o complemento CNI do Amazon VPC não foi inicializado, você receberá uma mensagem de erro semelhante ao exemplo a seguir:

“container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized”

Para verificar esse problema, execute o seguinte comando:

kubectl describe node node_name

Observação: substitua node_name pelo nome do nó. Você pode encontrar a mensagem de erro cni plugin no initialized na saída.

Realize as seguintes ações para solucionar o problema.

Confirme se você instalou o complemento CNI do Amazon VPC

Se os pods aws-node no cluster estiverem ausentes, você receberá uma mensagem de erro semelhante ao exemplo a seguir nos logs do containerd:

“cni config load failed: no network config found in /etc/cni/net.d: cni plugin not initialized: failed to load cni config”

Para resolver esse problema, instale o complemento Amazon VCP CNI.

Verifique se há problemas de permissões do IAM

Para usar o complemento Amazon VPC CNI, utilize a política gerenciada AmazonEKS_CNI_Policy do AWS Identity and Access Management (AWS IAM). Ou, se você usar uma política personalizada, certifique-se de que ela inclua as seguintes permissões:

 "ec2:AssignPrivateIpAddresses",
 "ec2:AttachNetworkInterface",
 "ec2:CreateNetworkInterface",
 "ec2:DeleteNetworkInterface",
 "ec2:DescribeInstances",
 "ec2:DescribeTags",
 "ec2:DescribeNetworkInterfaces",
 "ec2:DescribeInstanceTypes",
 "ec2:DescribeSubnets",
 "ec2:DetachNetworkInterface",
 "ec2:ModifyNetworkInterfaceAttribute",
 "ec2:UnassignPrivateIpAddresses"
 "ec2:CreateTags"

Para identificar as permissões do IAM ausentes, verifique os logs do daemon L-IPAM (IPAMD) no diretório de host /var/log/aws-routed-eni/ipamd.log. Se o complemento CNI do Amazon VPC não tiver uma permissão de IAM necessária, você receberá uma mensagem de erro semelhante ao exemplo a seguir:

{"level":"error","ts":"2023-11-18T01:08:34.083Z","caller":"aws-k8s-agent/main.go:28","msg":"Initialization failure: ipamd init: failed to retrieve attached ENIs info: UnauthorizedOperation: You are not authorized to perform this operation. User: arn:aws:sts::XXXXXXXXXXXXXXXXXXXX:assumed-role/rolename is not authorized to perform: ec2:DescribeNetworkInterfaces because no identity-based policy allows the ec2:DescribeNetworkInterfaces action\n\tstatus code: 403, request id: request id"}

O exemplo de mensagem de erro anterior mostra que o complemento requer a permissão ec2:DescribeNetworkInterfaces.

Se você não tiver acesso direto ao nó de processamento, verifique os pods aws-node no nó de processamento. Para identificar o pod aws-node no nó de processamento, execute o seguinte comando:

kubectl describe node node_name

Observação: substitua node_name pelo nome do nó. Verifique na seção Non-terminated Pods da saída o nome do pod aws-node.

Em seguida, execute o comando a seguir para ver os detalhes sobre o pod aws-node:

kubectl describe pod pod-name -n kube-system

Observação: substitua pod-name pelo nome do pod aws-node.

Na saída, marque Evento para obter informações sobre permissões ausentes.

Exemplo de saída:

Type Reason Age From Message
---- ------ ---- ---- -------
Warning MissingIAMPermissions 105s (x2 over 105s) aws-node Unauthorized operation: failed to call ec2:DescribeNetworkInterfaces due to missing permissions. Please refer https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/iam-policy.md to attach relevant policy to IAM role in the event section you can able to see the error message also you can check the AWS cloud trail event for the particular instance by filtering the cloudtrail with username and provide the instanceID there.

Ou use o AWS CloudTrail para verificar eventos específicos. Por exemplo, verifique o nome de usuário e o ID da instância da chamada de API DescribeNetworkInterfaces para determinar se ela foi executada.

Verifique se há problemas de rede

O complemento CNI do Amazon VPC deve alcançar o endpoint do servidor de API e o endpoint Amazon Elastic Compute Cloud (Amazon EC2) quando executado. Se uma das conexões falhar, o complemento não poderá ser inicializado e os nós passarão para o status NotReady.

Para verificar a mensagem de erro específica, revise os logs do IPAMD no diretório de host /var/log/aws-routed-eni/ipamd.log. Certifique-se de que os pods kube-proxy e CoreDNS possam ser executados sem erros.

Verifique as versões dos componentes complementares

É uma prática recomendada atualizar os componentes principais para a versão mais recente. Se a versão do complemento não corresponder à sua versão do cluster Kubernetes, o complemento não poderá ser inicializado. Verifique se a versão do complemento é compatível com a versão do cluster Kubernetes.

Solucionar erros do complemento CNI do Amazon VPC

Para identificar erros de complemento, use o SSH para se conectar ao nó de processamento em que o complemento não pode atribuir o endereço IP. Em seguida, revise os logs do IPAMD no arquivo /var/log/aws-routed-eni/ipamd.log para ver se há mensagens de erro.

Falha ao atribuir erro de IP

O erro Failed to assign ip ocorre quando o complemento CNI do Amazon VPC não pode atribuir endereços IP a pods que estão programados para os nós de processamento. Para identificar o erro, você também pode verificar a página de histórico de eventos do CloudTrail em busca do evento AssignPrivateIpAddresses.

Para determinar se a sub-rede atribuída não tem endereços IP disponíveis, execute o seguinte comando describe-subnets da AWS CLI:

aws ec2 describe-subnets --filters "Name=vpc-id,Values= VPCID" | jq '.Subnets[] | .SubnetId + "=" + "\(.AvailableIpAddressCount)"'

Observação: substitua o VPCID pelo seu ID de VPC.

O erro Failed to assign ip também pode ocorrer quando você define os valores das variáveis de ambiente WARM_ENI_TARGET, WARM_IP_TARGET ou MINIMUM_IP_TARGET como muito baixos. Certifique-se de que seu intervalo CIDR de sub-rede seja amplo o suficiente e tenha alocações de endereço IP suficientes para seu caso de uso. Para obter mais informações, consulte WARM_ENI_TARGET, WARM_IP_TARGET e MINIMUM_IP_TARGET no site do GitHub.

Para verificar os valores das variáveis de ambiente, execute o seguinte comando para ver os detalhes do seu pod:

kubectl describe pod pod-name -n kube-system

Observação: substitua pod-name pelo nome do pod aws-node.

É possível atualizar as variáveis de ambiente no DaemonSet aws-node:

env:
  - name: WARM_ENI_TARGET
    value: "1"
  - name: WARM_IP_TARGET
    value: "5"
  - name: MINIMUM_IP_TARGET
    value: "25"

Ou execute o seguinte comando para atualizar as variáveis de ambiente:

kubectl set env ds aws-node -n kube-system WARM_ENI_TARGET=1 WARM_IP_TARGET=5 MINIMUM_IP_TARGET=25

Se você usa o modo de delegação de prefixo e não usa um intervalo de sub-rede de pod dedicado, a fragmentação da sub-rede pode fazer com que o complemento falhe. O complemento deve atribuir um intervalo contínuo de prefixos /28 para IPv4 e /80 para IPv6 à interface de rede. Para obter mais informações sobre delegação de prefixo, consulte ENABLE_PREFIX_DELEGATION no site do GitHub.

Não é possível verificar diretamente a fragmentação da sub-rede. Em vez disso, verifique se você ainda tem mais de 16 endereços IP disponíveis em seu intervalo CIDR de sub-rede. Se você tiver endereços IP suficientes e ainda receber frequentemente o erro Failed to assign ip, o problema geralmente é a fragmentação da sub-rede. Para solucionar esse problema, é uma prática recomendada usar redes personalizadas com delegação de prefixo para estabelecer sub-redes dedicadas para os pods. Para obter mais informações, consulte AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG no site do GitHub.

Falha ao obter o erro de configuração ENI do pod

Se você usa AWS_VPC_K8S_CNI_CUSTOM_NETWORK\ _CFG para ativar redes personalizadas, mas não criar um recurso ENIConfig, receberá uma mensagem de erro semelhante ao exemplo a seguir:

“{"level":"error","ts":"","caller":"ipamd/ipamd.go:798","msg":"Failed to get pod ENI config"}”

Para verificar se o recurso ENIConfig existe no cluster, execute o seguinte comando:

kubectl get eniconfig -o yaml

Se o recurso personalizado ENIConfig não existir, então crie um. Para obter mais informações sobre redes personalizadas, consulte AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG no site do GitHub.

Falha ao assistir ao erro

Se você não gravar o arquivo YAML no formato correto, poderá receber uma mensagem de erro semelhante ao exemplo a seguir:

“Failed to watch *v1alpha1.ENIConfig: failed to list *v1alpha1.ENIConfig:json: cannot unmarshal string into Go struct field ENIConfigSpec.items.spec.securityGroups of type []string”

Esse problema geralmente ocorre quando há uma incompatibilidade entre os dados JSON e a definição do tipo de dados Go. O exemplo de mensagem de erro anterior mostra que há um problema com o campo securityGroups.

Para solucionar esse problema, execute o seguinte comando para verificar seus dados JSON:

kubectl describe ENIConfig

Na saída do comando, verifique a sintaxe com base no problema identificado na mensagem de erro. Por exemplo, certifique-se de que o campo securityGroups em seu JSON seja uma matriz de cadeias de caracteres, não uma única string.

Exemplo de saída:

cat >$az_1.yaml <<EOF
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
  name: us-west-2a
spec:
  securityGroups:
    - sg-0123456789abcdef0
  subnet: subnet-0123456789abcdef0
EOF
AWS OFICIALAtualizada há um ano