¿Cómo puedo solucionar el error «You must be logged in to the server (Unauthorized)» cuando me conecto al servidor API de Amazon EKS?

10 minutos de lectura
0

Utilizo comandos kubectl para conectarme al servidor de la interfaz de programación de aplicaciones (API) de Amazon Elastic Kubernetes Service (Amazon EKS). Se ha mostrado el mensaje «error: You must be logged in to the server (Unauthorized)».

Breve descripción

Este error aparece cuando Amazon EKS no autentica la entidad de AWS Identity and Access Management (IAM) configurada en kubectl.

Se le autentica y autoriza para acceder a su clúster de Amazon EKS en función de la entidad de IAM (usuario o rol) que utilice. Por lo tanto, compruebe lo siguiente:

  • Ha configurado la herramienta kubectl de modo que utilice su rol o usuario de IAM.
  • Su entidad de IAM está asignada al ConfigMap de aws-auth.

Para solucionar este problema, debe completar los pasos de una de las siguientes secciones según su caso:

  • Es el creador del clúster
  • No es el creador del clúster

Solución

Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), compruebe si está ejecutando una versión reciente de la AWS CLI.

Es el creador del clúster

Se le considerará el creador del clúster si se ha utilizado su entidad de IAM para crear el clúster de Amazon EKS.

1.    Ejecute la siguiente consulta en Información de registros de Amazon CloudWatch para identificar el ARN del creador del clúster:

En primer lugar, seleccione el grupo de registros de su clúster de Amazon EKS (por ejemplo: /aws/eks/my-cluster/cluster). A continuación, ejecute la siguiente consulta:

fields @logstream, @timestamp, @message
| sort @timestamp desc
| filter @logStream like /authenticator/
| filter @message like "username=kubernetes-admin"
| limit 50

Nota: Asegúrese de haber activado los registros de autenticación de Amazon EKS.

Esta consulta devuelve la entidad de IAM que está asignada como creadora del clúster:

@message
time="2022-05-26T18:55:30Z" level=info msg="access granted" arn="arn:aws:iam::123456789000:user/testuser" client="127.0.0.1:57586" groups="[system:masters]" method=POST path=/authenticate uid="aws-iam-authenticator:123456789000:AROAFFXXXXXXXXXX" username=kubernetes-admin

2.    Asegúrese de haber configurado la AWS CLI con la entidad de IAM creadora del clúster. Para comprobar si la entidad de IAM está configurada para la AWS CLI en su entorno de shell, ejecute el siguiente comando:

$ aws sts get-caller-identity

También puede ejecutar este comando con un perfil específico:

$ aws sts get-caller-identity --profile MY-PROFILE

El resultado devuelve el nombre de recurso de Amazon (ARN) de la entidad de IAM que está configurada para la AWS CLI.

Ejemplo:

{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}

Confirme si la entidad de IAM que se devuelve coincide con la entidad de IAM creadora del clúster. Si la entidad de IAM devuelta no es la creadora del clúster, actualice la configuración de la AWS CLI de modo que se utilice la entidad de IAM creadora del clúster.

3.    Actualice o genere el archivo kubeconfig mediante el siguiente comando:

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region

Nota:

  • Sustituya eks-cluster-name por el nombre de su clúster.
  • Sustituya aws-region por el nombre de su región de AWS.

Para especificar un perfil de la AWS CLI, ejecute el siguiente comando:

$ aws eks update-kubeconfig --name eks-cluster-name —region aws-region —profile my-profile

Nota:

  • Sustituya eks-cluster-name por el nombre de su clúster.
  • Sustituya aws-region por el nombre de su región.
  • Sustituya my-profile por el nombre de su perfil.

4.    Para confirmar que el archivo kubeconfig esté actualizado, ejecute el siguiente comando:

$ kubectl config view --minify

5.    Para confirmar si la entidad de IAM está autenticada y puede acceder al clúster de EKS, ejecute el siguiente comando:

$ kubectl get svc

Resultado del ejemplo:

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.100.0.1     <none>        443/TCP   77d

No es el creador del clúster

No se le considerará el creador del clúster si no se ha utilizado su entidad de IAM para crear el clúster. En tal caso, asigne su entidad de IAM al ConfigMap de aws-auth para permitir el acceso al clúster.

1.    Asegúrese de haber configurado la AWS CLI con su entidad de IAM. Para ver la entidad de IAM configurada para la AWS CLI en su entorno de shell, ejecute el siguiente comando:

$ aws sts get-caller-identity

También puede ejecutar este comando con un perfil específico:

$ aws sts get-caller-identity --profile my-profile

El resultado devuelve el ARN de la entidad de IAM configurada para la AWS CLI.

Ejemplo:

{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}

Confirme que la entidad de IAM que se devuelve sea su entidad de IAM. Si la entidad de IAM devuelta no es la que se usó para interactuar con el clúster, actualice primero la configuración de la AWS CLI de modo que se utilice la entidad de IAM correcta. A continuación, vuelva a intentar acceder al clúster mediante kubectl. Si el problema persiste, continúe con el paso 2.

2.    Si la entidad de IAM devuelta no es la creadora del clúster, añada su entidad de IAM al ConfigMap de aws-auth. Esto permite que la entidad de IAM acceda al clúster.

Solo el administrador del clúster puede modificar ConfigMap de aws-auth. Por lo tanto, realice una de las siguientes acciones:

  • Siga las instrucciones de la sección Es el creador del clúster para acceder al clúster mediante la entidad de IAM creadora del clúster.
  • Pida al administrador del clúster que realice esta acción.

Ejecute el siguiente comando para comprobar si su entidad de IAM está en el ConfigMap de aws-auth:

eksctl get iamidentitymapping --cluster cluster-name

Alternativa:

kubectl describe configmap aws-auth -n kube-system

Si su entidad de IAM está en el ConfigMap de aws-auth, puede saltar al paso 3.

Asigne su entidad de IAM automáticamente mediante la ejecución del siguiente comando:

eksctl create iamidentitymapping \
    --cluster $CLUSTER-NAME \
    --region $REGION \
    --arn arn:aws:iam::XXXXXXXXXXXX:user/testuser \
    --group system:masters \
    --no-duplicate-arns \
    --username admin-user1

También puede asignar su entidad de IAM manualmente; para ello, edite el ConfigMap de aws-auth:

$ kubectl edit configmap aws-auth --namespace kube-system

Para añadir un usuario de IAM, añada el ARN del usuario de IAM a mapUsers.

Ejemplo:

mapUsers: |
  - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
    username: testuser
    groups:
      - system:masters

Para agregar un rol de IAM, añada el ARN del rol de IAM a mapRoles.

Ejemplo:

mapRoles: |
  - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
    username: testrole
    groups:
      - system:masters

Importante:

  • El rol de IAM debe asignarse sin la ruta. Para obtener más información sobre los requisitos de la ruta de rolearn, consulte la sección El ConfigMap de aws-auth no concede acceso al clúster en Solución de problemas de IAM.
  • Para especificar el rol de IAM para un rol de IAM de AWS IAM Identity Center (sucesor de AWS Single Sign-On), elimine la ruta «/aws-reserved/sso.amazonaws.com/REGION» del ARN del rol. De lo contrario, la entrada del ConfigMap no podrá autorizarle como usuario válido.
  • El grupo system:masters concede acceso como superusuario para realizar cualquier acción en cualquier recurso. Para obtener más información, consulte Default roles and role bindings. Para restringir el acceso de este usuario, puede crear un recurso de enlace de roles y un rol de Amazon EKS. Para ver un ejemplo de acceso restringido en el caso de los usuarios que ven los recursos en la consola de Amazon EKS, siga los pasos 2 y 3 de Permisos necesarios.

3.    Ejecute el siguiente comando para actualizar o generar el archivo kubeconfig. Asegúrese de que la AWS CLI esté configurada con la entidad de IAM que se muestra en el paso 1.

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region

Nota:

  • Sustituya eks-cluster-name por el nombre de su clúster.
  • Sustituya aws-region por el nombre de su región de AWS.

También puede ejecutar este comando con un perfil específico:

$ aws eks update-kubeconfig --name eks-cluster-name —region aws-region —profile my-profile

Nota:

  • Sustituya eks-cluster-name por el nombre de su clúster.
  • Sustituya aws-region por el nombre de su región de AWS.
  • Sustituya my-profile por el nombre de su perfil.

4.    Para confirmar que el archivo kubeconfig esté actualizado, ejecute el siguiente comando:

$ kubectl config view --minify

5.    Para confirmar que se haya autenticado su usuario o rol de IAM, intente acceder de nuevo al clúster. Por ejemplo, puede ejecutar el siguiente comando para confirmar si se ha solucionado el error:

$ kubectl get svc

Resultado del ejemplo:

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.100.0.1     <none>        443/TCP   77d

Consejos adicionales para solucionar el problema

Si el error persiste, siga los siguientes consejos para identificar el problema y solucionarlo.

Cuando ejecuta un comando kubectl, se envía una solicitud al servidor de API de clúster de Amazon EKS. A continuación, el autenticador de Amazon EKS intenta autenticar esta solicitud. Por lo tanto, compruebe los registros del autenticador de EKS en CloudWatch para identificar el problema.

1.    Asegúrese de haber activado el registro en su clúster de Amazon EKS.

2.    Abra Información de aplicaciones de Amazon CloudWatch.

3.    Seleccione el grupo de registros para su clúster. Ejemplo: «/aws/eks/example-cluster/cluster».

4.    Ejecute la siguiente consulta:

fields @timestamp, @message
| filter @logStream like /authenticator/
| sort @timestamp desc
| limit 1000

Ejecute comandos kubectl para identificar las líneas de registro del mismo intervalo de tiempo en el que se produjo el error. Encontrará más información sobre la causa del error en los registros del autenticador de Amazon EKS.

  • Si el problema se debe al uso de una entidad de IAM incorrecta para kubectl, revise la configuración de la AWS CLI y kubeconfig de kubectl. Asegúrese de utilizar el rol de IAM correcto. Por ejemplo, supongamos que los registros tienen un aspecto similar al siguiente. Este resultado significa que la entidad de IAM utilizada por kubectl no se puede validar. Asegúrese de que la entidad de IAM utilizada por kubectl exista en IAM y de que el acceso programático de la entidad esté activado.
time="2022-12-26T20:46:48Z" level=warning msg="access denied" client="127.0.0.1:43440" error="sts getCallerIdentity failed: error from AWS (expected 200, got 403). Body: {\"Error\":{\"Code\":\"InvalidClientTokenId\",\"Message\":\"The security token included in the request is invalid.\",\"Type\":\"Sender\"},\"RequestId\":\"a9068247-f1ab-47ef-b1b1-cda46a27be0e\"}" method=POST path=/authenticate
  • Si el problema se debe a que su entidad de IAM no está asignada en el ConfigMap de aws-auth o está asignada incorrectamente, revise el ConfigMap de aws-auth. Asegúrese de que la entidad de IAM esté asignada correctamente y cumpla los requisitos que se detallan en la sección No es el creador del clúster. En este caso, los registros del autenticador de EKS tienen un aspecto similar al siguiente:
time="2022-12-28T15:37:19Z" level=warning msg="access denied" arn="arn:aws:iam::XXXXXXXXXX:role/admin-test-role" client="127.0.0.1:33384" error="ARN is not mapped" method=POST path=/authenticate
  • Si se ha actualizado el ConfigMap de aws-auth y ha perdido el acceso al clúster, podrá acceder al clúster mediante la entidad de IAM del creador del clúster. Esto se debe a que no es necesario asignar el creador del clúster en el ConfigMap de aws-auth.
  • Si se ha eliminado la entidad de IAM creadora del clúster, primero vuelva a crear el mismo usuario o rol de IAM. A continuación, acceda al clúster mediante esta entidad de IAM siguiendo los pasos de la sección Es el creador del clúster.
  • Si el creador del clúster es un rol de IAM creado para un usuario de SSO que se ha eliminado, no podrá volver a crear este rol de IAM. En tal caso, póngase en contacto con AWS Support para obtener ayuda.

Información relacionada

Turning on IAM user and role access to your cluster

¿Cómo puedo proporcionar acceso a otros usuarios y roles de IAM tras la creación del clúster en Amazon EKS?

Solución de problemas de Amazon EKS

Using RBAC authorization en el sitio web de Kubernetes

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año