¿Cómo soluciono los problemas durante la configuración de Cluster Autoscaler en un clúster de Amazon EKS?

9 minutos de lectura
0

Quiero solucionar problemas al iniciar Cluster Autoscaler en mi clúster de Amazon Elastic Kubernetes Service (Amazon EKS).

Descripción breve

Asegúrese de comprobar lo siguiente antes de empezar:

  • Instaló o actualizó eksctl a la versión más reciente.
  • Reemplazó los valores de ejemplo de los fragmentos de código con sus propios valores.

Nota: La variable --region no siempre se usa en los comandos porque se usa el valor predeterminado para su región de AWS. Compruebe el valor predeterminado ejecutando el comando de configuración de la Interfaz de la línea de comandos de AWS (AWS CLI). Si necesita cambiar la región de AWS, utilice el indicador --region.

Nota: Si recibe errores al ejecutar los comandos de AWS CLI, confirme que está ejecutando una versión reciente de AWS CLI.

Resolución

El pod de Cluster Autoscaler tiene el estado CrashLoopBackOff

Compruebe el estado del pod de Cluster Autoscaler mediante la ejecución del siguiente comando:

kubectl get pods -n kube-system | grep cluster-autoscaler

El siguiente es un ejemplo de un pod de Cluster Autoscaler que tiene el estado CrashLoopBackOff:

NAME                            READY   STATUS             RESTARTS      AGE
cluster-autoscaler-xxxx-xxxxx   0/1     CrashLoopBackOff   3 (20s ago)   99s

Para ver los registros del pod de Cluster Autoscaler, ejecute el siguiente comando:

kubectl logs -f -n kube-system -l app=cluster-autoscaler

Si los registros indican que hay problemas con los permisos de AWS Identity and Access Management (IAM), haga lo siguiente:

  • Compruebe que haya un proveedor de OIDC asociado al clúster de Amazon EKS.
  • Compruebe que la cuenta del servicio Cluster Autoscaler esté anotada con el rol de IAM.
  • Compruebe que la política de IAM correcta esté adjunta al rol de IAM anterior.
  • Compruebe que la relación de confianza esté configurada correctamente.

Nota: El siguiente es un ejemplo de un registro que indica problemas con los permisos de IAM:

Failed to create AWS Manager: cannot autodiscover ASGs: AccessDenied: User: xxx is not authorized to perform: autoscaling: DescribeTags because no identity-based policy allows the autoscaling:DescribeTags action status code: 403, request id: xxxxxxxx

Importante: Asegúrese de comprobar todos los comandos de la AWS CLI proporcionados y de reemplazar todas las instancias de cadenas de ejemplo con sus valores. Por ejemplo, sustituya example-cluster con su clúster.

Comprobar que haya un proveedor de OIDC asociado al clúster de EKS

1.    Compruebe que dispone de un proveedor de IAM OpenID Connect (OIDC) para su clúster mediante la ejecución del siguiente comando:

oidc_id=$(aws eks describe-cluster --name example-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)

2.    Compruebe que ya haya en su cuenta un proveedor OIDC de IAM con el ID de su clúster mediante el siguiente comando:

aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

Nota: Si se devuelven resultados, significa que ya tiene un proveedor de OIDC de IAM para su clúster y puede omitir el siguiente paso. Si no se devuelve ningún resultado, debe crear un proveedor de IAM OIDC para su clúster en el siguiente paso.

3.    Cree un proveedor de identidades OIDC de IAM para su clúster mediante la ejecución del siguiente comando:

eksctl utils associate-iam-oidc-provider --cluster example-cluster --approve

Comprobar que la cuenta del servicio Cluster Autoscaler esté anotada con el rol de IAM

Compruebe que la cuenta del servicio esté anotada con el rol de IAM mediante el siguiente comando:

kubectl get serviceaccount cluster-autoscaler -n kube-system -o yaml

El resultado esperado es el siguiente:

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/<cluster_auto_scaler_iam_role>
  name: cluster-autoscaler
  namespace: kube-system

Comprobar que la política de IAM correcta esté conectada al rol de IAM anterior

Observe el siguiente ejemplo:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "autoscaling:DescribeAutoScalingInstances",
        "autoscaling:SetDesiredCapacity",
        "autoscaling:DescribeAutoScalingGroups",
        "autoscaling:DescribeTags",
        "autoscaling:DescribeLaunchConfigurations",
        "ec2:DescribeLaunchTemplateVersions",
        "ec2:DescribeInstanceTypes",
        "autoscaling:TerminateInstanceInAutoScalingGroup"
      ],
      "Resource": "*"
    }
  ]
}

Comprobar que la relación de confianza esté configurada correctamente

Observe el siguiente ejemplo:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<example_awsaccountid>:oidc-provider/oidc.eks.<example_region>.amazonaws.com/id/<example_oidcid>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.<example_region>.amazonaws.com/id/<example_oidcid>:aud": "sts.amazonaws.com",
          "oidc.eks.<example_region>.amazonaws.com/id/<example_oidcid>:sub": "system:serviceaccount:kube-system:cluster-autoscaler"
        }
      }
    }
  ]
}

Reinicie el pod de Cluster Autoscaler cuando se realice algún cambio en el rol de la cuenta del servicio o en la política de IAM.

Si los registros indican algún problema de red (por ejemplo, un tiempo de espera de E/S), haga lo siguiente:

Nota: El siguiente es un ejemplo de un registro que indica problemas de red:

Failed to create AWS Manager: cannot autodiscover ASGs: WebIdentityErr: failed to retrieve credentials caused by: RequestError: send request failed caused by: Post https://sts.region.amazonaws.com/: dial tcp: i/o timeout

1.    Compruebe que el clúster de Amazon EKS esté configurado con el ajuste de red requerido. Compruebe que la subred del nodo de trabajo tenga una tabla de enrutamiento que pueda enrutar el tráfico a los siguientes puntos de conexión, ya sea en puntos de conexión globales o regionales:

  • Amazon Elastic Compute Cloud (Amazon EC2)
  • AWS Auto Scaling
  • AWS Security Token Service (AWS STS)

2.    Asegúrese de que ni la lista de control de acceso de la red (ACL de la red) de la subred ni el grupo de seguridad del nodo de trabajo bloqueen el tráfico que se comunica con estos puntos de conexión.

3.    Si el clúster de Amazon EKS es privado, compruebe la configuración de los puntos de conexión pertinentes de Amazon Virtual Private Cloud (VPC). Por ejemplo, Amazon EC2, AWS Auto Scaling y AWS STS.

Nota: Es necesario que el grupo de seguridad de cada punto de conexión de VPC permita el grupo de seguridad del nodo de trabajo de Amazon EKS. También es necesario que permita el bloqueo CIDR de Amazon EKS VPC en el puerto 443 del tráfico de entrada.

Cluster Autoscaler no amplía ni reduce los nodos

Si Cluster Autoscaler no amplía ni reduce el tamaño de los nodos, compruebe lo siguiente:

  • Compruebe los registros del pod de Cluster Autoscaler.
  • Compruebe el etiquetado de grupos de escalamiento automático para Cluster Autoscaler.
  • Compruebe la configuración del manifiesto de implementación.
  • Compruebe la cantidad actual de nodos.
  • Compruebe la solicitud de recursos del pod.
  • Compruebe la configuración de taint del nodo en el grupo de nodos.
  • Compruebe si el nodo está anotado con scale-down-disable.

Comprobar los registros del pod de Cluster Autoscaler

Para ver los registros del pod e identificar los motivos por los que Cluster Autoscaler no amplía ni reduce la escala de los nodos, ejecute el siguiente comando:

kubectl logs -f -n kube-system -l app=cluster-autoscaler

Compruebe si el pod que está en estado de pendiente contiene alguna regla de programación, como la regla de afinidad, mediante el siguiente comando:

kubectl describe pod <example_podname> -n <example_namespace>

Consulte la sección de eventos en los resultados. En esta sección, se muestra información sobre por qué un pod está en estado pendiente.

Nota: Cluster Autoscaler respeta nodeSelector y requiredDuringSchedulingIgnoredDuringExecution en nodeAffinity, y asume que etiquetó sus grupos de nodos de la manera correspondiente. Si un pod no puede programarse con nodeSelector o requiredDuringSchedulingIgnoredDuringExecution, Cluster Autoscaler solo considera los grupos de nodos que cumplen esos requisitos de expansión. Modifique las reglas de programación definidas en los pods o nodos de tal manera que un pod se programe en un nodo.

Compruebe el etiquetado de grupos de escalamiento automático para Cluster Autoscaler.

El grupo de escalamiento automático correspondiente del grupo de nodos debe estar etiquetado para que Cluster Autoscaler detecte el grupo de escalamiento automático de la siguiente manera:

Etiqueta 1:

  • clave: k8s.io/cluster-autoscaler/example-cluster
  • valor: propio

Etiqueta 2:

  • clave: k8s.io/cluster-autoscaler/enabled
  • valor: verdadero

Comprobar la configuración del manifiesto de implementación

Para comprobar la configuración del manifiesto de implementación de Cluster Autoscaler, ejecute el siguiente comando:

kubectl -n kube-system edit deployment.apps/cluster-autoscaler

Compruebe que el manifiesto esté configurado con el argumento de node-group-auto-discovery correcto de la siguiente manera:

containers:
- command
   ./cluster-autoscaler
   --v=4
   --stderrthreshold=info
   --cloud-provider=aws
   --skip-nodes-with-local-storage=false
   --expander=least-waste
   --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/example-cluster
   --balance-similar-node-groups
   --skip-nodes-with-system-pods=false

Comprobar la cantidad actual de nodos

Para comprobar si la cantidad actual de nodos alcanzó los valores mínimos o máximos del grupo de nodos administrado, ejecute el siguiente comando:

aws eks describe-nodegroup --cluster-name <example-cluster> --nodegroup-name <example-nodegroup>

Si se alcanzan los valores mínimos o máximos, modifique los valores con los nuevos requisitos de carga de trabajo.

Comprobar la solicitud de recursos del pod

Para comprobar si los tipos de instancias de nodos actuales no pueden cumplir con la solicitud de recursos del pod, ejecute el siguiente comando:

kubectl -n <example_namespace> get pod <example_podname> -o yaml | grep resources -A6

Para cumplir con la solicitud de recursos, modifique las solicitudes de recursos del pod o cree un nuevo grupo de nodos. Al crear un nuevo grupo de nodos, asegúrese de que el tipo de instancia de los nodos cumpla con los requisitos de recursos para los pods.

Comprobar la configuración de taint del nodo en el grupo de nodos

Compruebe si las taints están configuradas para el nodo y si el pod puede tolerarlas mediante el siguiente comando:

kubectl describe node <example_nodename> | grep taint -A2

Si las taints están configuradas, elimine las taints definidas en el nodo. Si el pod no puede tolerar las taints, defina las tolerancias en el pod para que este pueda programarse en el nodo con las taints.

Comprobar si el nodo está anotado con scale-down-disable

Para comprobar si el nodo está anotado con scale-down-disable, ejecute el siguiente comando:

kubectl describe node <example_nodename> | grep scale-down-disable

El resultado esperado es el siguiente:

cluster-autoscaler.kubernetes.io/scale-down-disabled: true

Si scale-down-disable está establecido en true, elimine la anotación para que el nodo se pueda reducir verticalmente mediante el siguiente comando:

kubectl annotate node <example_nodename> cluster-autoscaler.kubernetes.io/scale-down-disabled-

Para obtener más información sobre la solución de problemas, consulte las preguntas frecuentes sobre Cluster Autoscaler en el sitio web de GitHub.


OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año