Comment puis-je augmenter les limites nofile et nproc pour les pods AWS Fargate dans Amazon EKS ?

Lecture de 5 minute(s)
0

Je souhaite augmenter les limites nofile et nproc pour les pods AWS Fargate dans Amazon Elastic Kubernetes Service (Amazon EKS).

Brève description

Lorsque vous exécutez des applications sur Fargate, vous pouvez recevoir l'une des erreurs suivantes liées à vos paramètres ulimit sur vos pods Fargate :

  • Trop de fichiers ouverts.
  • Erreur de threads insuffisants OU exécution : échec de création d'un nouveau thread du système d'exploitation.
  • Aucune ressource n'est disponible pour créer le processus.

Pour augmenter les limites nofile et nproc, utilisez la commande bash, la commande sh ou un conteneur Init.

Remarque : Vous ne pouvez pas configurer les paramètres ulimit pour les pods Fargate. La limite flexible nofile et nproc par défaut est 1024 et la limite stricte est 65535. Pour plus d’informations, consultez la section Considérations relatives à AWS Fargate.

Résolution

Pour lancer les pods Fargate sur Amazon EKS, procédez comme suit :

  1. Créez un rôle d'exécution du pod Fargate.
  2. Créez un profil Fargate pour votre cluster.
  3. Mettez à jour le coreDNS.

Pour plus d'informations, consultez la section Mise en route d’AWS Fargate à l'aide d'Amazon EKS.

Utiliser la commande bash

Pour utiliser la commande bash afin d'augmenter les limites nofile et nproc, procédez comme suit :

  1. Exécutez l'exemple de manifeste de pod suivant :
    Remarque : Remplacez example-nofile-limit et example-nproc-limit par vos nouvelles limites nofile et nproc entre 1024 et 65535.

    apiVersion: v1
    kind: Pod
    metadata:
      name: ubuntu
      namespace: fargate
      labels:
        app: ubuntu
    spec:
      containers:
      - image: ubuntu:18.04
        command: ["/bin/bash", "-c", "echo 'ulimit -Sn example-nofile-limit' >> /root/.bashrc && echo 'ulimit -Su example-nproc-limit' >> /root/.bashrc && sleep 100"]
        imagePullPolicy: IfNotPresent
        name: ubuntu-test
      restartPolicy: Always
  2. Appliquez le manifeste précédent pour créer un nouveau pod dans l'espace de noms Fargate :
    Remarque : Remplacez example-file-name par le nom de fichier du manifeste de pod précédent.

    kubectl apply -f example-file-name
  3. Lorsque le pod est en cours d'exécution, exécutez la commande suivante pour vérifier les nouvelles limites nofile et nproc :

    ~ % kubectl exec -it ubuntu -n fargate -- /bin/bash

    Exemple de sortie :

    root@ubuntu:/# ulimit -a
    core file size (blocks, -c) unlimited
    data seg size (kbytes, -d) unlimited
    scheduling priority (-e) 0
    file size (blocks, -f) unlimited
    pending signals (-i) 30446
    max locked memory (kbytes, -l) unlimited
    max memory size (kbytes, -m) unlimited
    open files (-n) example-nofile-limit
    pipe size (512 bytes, -p) 8
    POSIX message queues (bytes, -q) 819200
    real-time priority (-r) 0
    stack size (kbytes, -s) 10240
    cpu time (seconds, -t) unlimited
    max user processes (-u) example-nproc-limit
    virtual memory (kbytes, -v) unlimited
    file locks (-x) unlimited
    root@ubuntu:/# ulimit -Sn
    example-nofile-limit
    root@ubuntu:/# ulimit -Su
    example-nproc-limit

Utiliser la commande sh

Pour utiliser la commande sh afin d'augmenter les limites nofile et nproc, procédez comme suit :

  1. Exécutez l'exemple de manifeste de pod suivant :
    Remarque : Remplacez example-nofile-limit et example-nproc-limit par vos nouvelles limites nofile et nproc.

    apiVersion: v1
    kind: Pod
    metadata:
      name: alpine
      namespace: fargate
      labels:
        app: alpine
    spec:
      containers:
      - image: alpine:latest
        command: ["sh", "-c", "echo 'ulimit -Sn example-nofile-limit' >> /etc/.shrc && echo 'ulimit -Su example-nproc-limit' >> /etc/.shrc && sleep 100"]
        imagePullPolicy: IfNotPresent
        name: alpine
        env:
        - name: ENV
          value: /etc/.shrc
      restartPolicy: Always
  2. Lorsque le pod est en cours d'exécution, exécutez la commande suivante pour vérifier les nouvelles limites nofile et nproc :

    ~ % kubectl exec -it alpine -n fargate -- sh

    Exemple de sortie :

    / # ulimit -a
    core file size (blocks) (-c) unlimited
    data seg size (kb) (-d) unlimited
    scheduling priority (-e) 0
    file size (blocks) (-f) unlimited
    pending signals (-i) 30446
    max locked memory (kb) (-l) unlimited
    max memory size (kb) (-m) unlimited
    open files (-n) example-nofile-limit
    POSIX message queues (bytes) (-q) 819200
    real-time priority (-r) 0
    stack size (kb) (-s) 10240
    cpu time (seconds) (-t) unlimited
    max user processes (-u) example-nproc-limit
    virtual memory (kb) (-v) unlimited
    file locks (-x) unlimited

Utiliser des conteneurs Init

Si vous ne souhaitez pas exécuter la commande sh dans le conteneur principal, utilisez un conteneur Init pour exécuter la même commande. Pour plus d'informations, consultez la section Conteneurs Init sur le site Web de Kubernetes.

Pour utiliser un conteneur Init afin d'augmenter les limites nofile et nproc, procédez comme suit :

  1. Exécutez l'exemple de manifeste de pod suivant :
    Remarque : Remplacez example-nofile-limit et example-nproc-limit par vos nouvelles limites nofile et nproc.

    apiVersion: v1
    kind: Pod
    metadata:
      name: alpine
      namespace: fargate
      labels:
        app: alpine
    spec:
      containers:
      - name: alpine
        image: alpine:latest
        imagePullPolicy: IfNotPresent
        command: ['sh', '-c', 'echo The app is running! && sleep 3600']
        env:
        - name: ENV
          value: /etc/.shrc
        volumeMounts:
          - name: data
            mountPath: /etc
      initContainers:
      - name: init
        image: alpine:latest
        command: ["sh", "-c", "echo 'ulimit -Sn example-nofile-limit' >> /etc/.shrc && echo 'ulimit -Su example-nproc-limit' >> /etc/.shrc && sleep 10"]
        volumeMounts:
          - name: data
            mountPath: /etc
      volumes:
        - name: data
          emptyDir: {}
      restartPolicy: Always
  2. Lorsque le pod est en cours d'exécution, exécutez la commande suivante pour vérifier les nouvelles limites nofile et nproc :

    ~ % kubectl exec -it alpine -n fargate -- sh

    Exemple de sortie :

    ~ # env
    KUBERNETES_SERVICE_PORT=443
    KUBERNETES_PORT=tcp://10.100.0.1:443
    HOSTNAME=alpine
    SHLVL=1
    HOME=/
    ENV=/etc/.shrc
    ~ # ulimit -a
    core file size (blocks) (-c) unlimited
    data seg size (kb) (-d) unlimited
    scheduling priority (-e) 0
    file size (blocks) (-f) unlimited
    pending signals (-i) 30446
    max locked memory (kb) (-l) unlimited
    max memory size (kb) (-m) unlimited
    open files (-n) example-nofile-limit
    POSIX message queues (bytes) (-q) 819200
    real-time priority (-r) 0
    stack size (kb) (-s) 10240
    cpu time (seconds) (-t) unlimited
    max user processes (-u) example-nproc-limit
    virtual memory (kb) (-v) unlimited
    file locks (-x) unlimited
AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an