Ich kann nicht herausfinden, wie AWS seinen Docker-Thin-Pool auf ElasticBeanstalk einrichtet und wie er gefüllt wird. Mein Docker Thin Pool füllt sich irgendwie und führt zum Absturz meiner Apps, wenn sie versuchen, auf die Festplatte zu schreiben.
Dies ist aus dem Inneren des Containers:
>df -h
> /dev/xvda1 25G 1.4G 24G 6%
Dem EBS ist tatsächlich eine 25-GB-Festplatte zugeordnet. 1,6 GB sind das, was du -sh /
zurückkehrt.
Draußen in EC2 beginnt es harmlos genug ... (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
Das Dateisystem wird jedoch bald wieder schreibgeschützt bereitgestellt. 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
Zurück im EC2-Instanzland meldet Docker Folgendes: (von 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 gibt diese Informationen aus:
--- 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
Was ist dieser dünne Pool, warum füllt er sich und wie kann ich ihn davon abhalten? Wenn ich mehr als 20 GB aus dem Container auf meinem / Volume frei habe, warum werden dann neue Schreibvorgänge gestoppt? Soweit ich das beurteilen kann, ist es nicht mit Dateien verbunden, in die meine Programme schreiben.
Vielen Dank!
quelle
Ich habe die Vorschläge in der AWS-Dokumentation befolgt und jetzt funktioniert alles.
Aber ich musste zwei Lösungen kombinieren: Speicherplatz erhöhen und Cronjob hinzufügen, um alte Dateien zu entfernen.
Folgendes habe ich getan.
Zuerst habe ich die Lautstärke so geändert
xvdcz
, dass 50 GB anstelle von 12 GB verwendet werden. Das ist der Speicher, auf dem wir sehen könnendocker system info
. In meinem Fall war es immer voll, weil ich jeden Tag viele Dateien hochlade..ebextensions / blockdevice-xvdcz.config
Nachdem ich einen Cronjob hinzugefügt habe, um meine gelöschten Dateien zu bereinigen, die nicht mehr verwendet wurden. Es war erforderlich, weil Docker sie aus irgendeinem Grund immer noch behielt. In meinem Fall ist es einmal am Tag genug. Wenn Sie mehr Uploads als ich haben, können Sie den Cronjob so konfigurieren, dass er so oft ausgeführt wird, wie Sie benötigen.
.ebextensions / cronjob.config
Quelle: https://docs.aws.amazon.com/pt_br/elasticbeanstalk/latest/dg/create_deploy_docker.container.console.html#docker-volumes
quelle
AWS ElasticBeanstalk Docker-Abschnitt Umgebungskonfiguration dokumentiert, wie es funktioniert:
quelle
Ich habe über einen Tag lang meinen Kopf gegen dieses Problem geschlagen und es schließlich herausgefunden.
AWS verwendet das
devicemapper
Backend und erstellt ein 12-GB-SSD-Volume, das für die Docker-Images bereitgestellt und verwendet wird. Sie müssen das Volume überschreiben, das über das ElasticBeanstalk-Erweiterungskonzept bereitgestellt und über die CLI bereitgestellt werden soll (dies ist leider nicht über die GUI möglich).Dockerrun.aws.json
Erstellen Sie in dem Verzeichnis, in dem Sie Ihre Datei haben, ein Verzeichnis mit dem Namen.ebextensions
und erstellen Sie dann eine Datei, die darin endet.config
. Ich habe meine angerufen01.correctebsvolume.config
. Fügen Sie dann den folgenden Inhalt ein:option_settings: - namespace: aws:autoscaling:launchconfiguration option_name: BlockDeviceMappings value: /dev/xvdcz=snap-066cZZZZZZZZ:40:true:gp2
Ich ssh'ed in eine meiner fehlerhaften Boxen direkt und stellte fest, dass es montiert wurde
/dev/xvdcz
. Es kann für Sie anders sein. Dassnap-066cZZZZZZZZ
muss eine gültige Snapshot-ID sein. Ich habe ein AMI-Image der fehlerhaften Instanz erstellt und den dabei erstellten Snapshot verwendet. Das40
ist, wie viele GB das Volumen sein wird, also ersetzen Sie, was Sie brauchen. Ich weiß nicht, was dietrue
odergp2
tun, aber sie stammen aus den AMI-Image-Block-Gerätedaten, also habe ich sie behalten.Die Magie
namespace
undoption_name
kommen von hier in die Dokumentation.quelle
Nur eine Vergrößerung der Festplatte löst das Problem nicht, es tritt nur später ein Fehler auf. AWS empfiehlt, Ihrem Container eine neue Festplatte zuzuordnen, damit das Erstellen / Löschen von Dateien keine Auswirkungen auf den Docker Poll Layer hat.
Ich schaue es gerade an, ich habe es noch nicht getestet, aber die Lösung, auf die ich stoße, ist dies auf meiner blockdevice.config
Schätzen Sie alle Kommentare.
quelle