Je ne peux pas comprendre comment AWS configure leur `` pool léger '' Docker sur ElasticBeanstalk et comment il se remplit. Mon pool mince de dockers se remplit d'une manière ou d'une autre et provoque le blocage de mes applications lorsqu'elles essaient d'écrire sur le disque.
C'est de l'intérieur du conteneur:
>df -h
> /dev/xvda1 25G 1.4G 24G 6%
L'EBS dispose en fait d'un disque de 25 Go qui lui est alloué; 1,6 Go est ce qui du -sh /
revient.
Dehors en EC2, ça commence assez innocemment ... (via lvs
)
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
docker-pool docker twi-aot--- 11.86g 37.50 14.65
Cependant, le système de fichiers sera bientôt remonté en lecture seule. via dmesg:
[2077620.433382] Buffer I/O error on device dm-4, logical block 2501385
[2077620.437372] EXT4-fs warning (device dm-4): ext4_end_bio:329: I/O error -28 writing to inode 4988708 (offset 0 size 8388608 starting block 2501632)
[2077620.444394] EXT4-fs warning (device dm-4): ext4_end_bio:329: I/O error [2077620.473581] EXT4-fs warning (device dm-4): ext4_end_bio:329: I/O error -28 writing to inode 4988708 (offset 8388608 size 5840896 starting block 2502912)
[2077623.814437] Aborting journal on device dm-4-8.
[2077649.052965] EXT4-fs error (device dm-4): ext4_journal_check_start:56: Detected aborted journal
[2077649.058116] EXT4-fs (dm-4): Remounting filesystem read-only
De retour dans l'instance EC2, Docker rapporte ceci: (à partir de docker info
)
Pool Name: docker-docker--pool
Pool Blocksize: 524.3 kB
Base Device Size: 107.4 GB
Backing Filesystem: ext4
Data file:
Metadata file:
Data Space Used: 12.73 GB
Data Space Total: 12.73 GB
Data Space Available: 0 B
Metadata Space Used: 3.015 MB
Metadata Space Total: 16.78 MB
Metadata Space Available: 13.76 MB
Thin Pool Minimum Free Space: 1.273 GB
LVS vide ces informations:
--- Logical volume ---
LV Name docker-pool
VG Name docker
LV UUID xxxxxxxxxxxxxxxxxxxxxxxxxxxx
LV Write Access read/write
LV Creation host, time ip-10-0-0-65, 2017-03-25 22:37:38 +0000
LV Pool metadata docker-pool_tmeta
LV Pool data docker-pool_tdata
LV Status available
# open 2
LV Size 11.86 GiB
Allocated pool data 100.00%
Allocated metadata 17.77%
Current LE 3036
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2
Qu'est-ce que ce bassin mince, pourquoi se remplit-il et comment puis-je l'empêcher de le faire? De plus, si j'ai plus de 20 Go d'espace libre à l'intérieur du conteneur sur mon / volume, pourquoi arrête-t-il les nouvelles écritures? Autant que je sache, il n'est pas connecté aux fichiers sur lesquels mes programmes écrivent.
Je vous remercie!
la source
J'ai suivi les suggestions fournies sur la documentation AWS et tout fonctionne maintenant.
Mais j'ai dû combiner deux solutions: augmenter l'espace et ajouter cronjob pour supprimer les anciens fichiers.
Voici ce que j'ai fait.
Tout d'abord, j'ai changé le volume
xvdcz
pour utiliser 50 Go au lieu de 12 Go. C'est le stockage sur lequel nous pouvons voirdocker system info
. Dans mon cas, il était toujours plein car je télécharge beaucoup de fichiers chaque jour..ebextensions / blockdevice-xvdcz.config
Après avoir ajouté un cronjob pour nettoyer mes fichiers supprimés qui n'étaient plus utilisés. Cela était nécessaire car Docker les conservait encore pour une raison quelconque. Dans mon cas, une fois par jour, c'est assez. Si vous avez plus de téléchargements que moi, vous pouvez configurer le cronjob pour exécuter le nombre de fois dont vous avez besoin.
.ebextensions / cronjob.config
Source: https://docs.aws.amazon.com/pt_br/elasticbeanstalk/latest/dg/create_deploy_docker.container.console.html#docker-volumes
la source
La section de configuration de l'environnement AWS élastiquebeanstalk docker explique comment cela fonctionne:
la source
J'ai battu ma tête contre ce problème pendant plus d'une journée et j'ai finalement compris.
AWS utilise le
devicemapper
backend et crée un volume SSD de 12 Go qu'il monte et utilise pour les images docker. Vous devez remplacer le volume qu'il monterait via le concept d'extensions élastiquebeanstalk et déployer via la CLI (il n'y a aucun moyen de le faire via leur interface graphique, malheureusement).Dans le répertoire où vous avez votre
Dockerrun.aws.json
fichier, créez un répertoire appelé.ebextensions
, puis créez un fichier qui se termine à l'.config
intérieur de celui-ci. J'ai appelé le mien01.correctebsvolume.config
. Mettez ensuite le contenu suivant dedans:option_settings: - namespace: aws:autoscaling:launchconfiguration option_name: BlockDeviceMappings value: /dev/xvdcz=snap-066cZZZZZZZZ:40:true:gp2
Je me faufilai directement dans l'un de mes coffres défectueux et trouvai qu'il montait
/dev/xvdcz
. Cela peut être différent pour vous. Lesnap-066cZZZZZZZZ
doit être un ID d'instantané valide. J'ai créé une image AMI de l'instance défaillante et utilisé l'instantané qu'il a créé dans le processus. Le40
nombre de Go sera le volume, alors remplacez-le par ce dont vous avez besoin. Je ne sais pas ce que letrue
ougp2
faire, mais ils sont venus à partir des données de périphérique bloc d'image AMI, donc je les ai gardés.La magie
namespace
etoption_name
venir d' ici dans la documentation.la source
L'augmentation de la taille du disque ne résoudra pas le problème, il se produira une erreur plus tard. AWS recommande de mapper un nouveau disque sur votre conteneur afin que tout fichier de création / suppression n'affecte pas la couche d'interrogation Docker.
Je le recherche actuellement, je n'ai pas encore testé mais la solution que je rencontre est d'avoir ceci sur mon blockdevice.config
Appréciez tous les commentaires.
la source