Nhật ký quản trị viên [#1]: yum update; docker purging

20200707T10:00

Hôm nay tôi bắt đầu trách nhiệm quản trị server production của hệ thống số CodeGym.

Rất điềm tĩnh, việc đầu tiên tôi làm là docker ps, xem xét thư mục artifacts các kiểu, sau đó cài đặt công cụ quản trị quen thuộc của mình:

sudo yum update
sudo yum install -y htop zsh

Và thế là tất cả các hệ thống số chết. Tất cả.

Quá ngọt ngào cho phiên quản trị đầu tiên.

yum update; yum upgrade

Vấn đề đầu tiên đến từ sai lầm của tôi trong cách hiểu về yum update. Bước sang từ các bản phân phối Debian based, đối với tôi update đơn giản chỉ là thao tác cập nhật danh sách package thôi. Ai ngờ với RHEL based thì update thật sự là upgrade.

Trong danh sách các package được upgrade thì có cả nhân Linux, và Docker. Chỉ riêng hai thứ này thôi cũng đủ risky để server down đến 8000 lần rồi.

May mắn, không hề có vấn đề không tương thích. Tuy nhiên, sau khi cài đặt xong bản nâng cấp Docker, yum thực hiện thao tác xóa các gói rác và sau đó khởi động lại docker service. Chính tiến trình khởi động lại docker service đã bị stuck.

 \_ apt install docker-ce
     \_ /usr/bin/dpkg --status-fd 64 --configure --pending
         \_ /bin/sh /var/lib/dpkg/info/docker-ce.postinst configure
             \_ /bin/sh /usr/sbin/invoke-rc.d docker start
                 \_ systemctl start docker.service
                     \_ /bin/systemd-tty-ask-password-agent --watch

Khởi động lại docker service

Trong lúc tiến trình update vẫn đang stuck, mở một session khác. Làm gì thì làm, kiểm tra xem có dockerd nào đang chạy không:

sudo systemctl list-jobs

Sau đó kill

sudo systemctl kill docker.service

Kiểm tra xem có instance docker nào đang chạy không:

ps aux | grep "[d]ockerd"

Sau đó kill:

sudo kill -9 $(ps aux | grep "[d]ockerd" | head -n 1 | awk '{print $2}')

Hủy tiến trình khởi động docker service:

sudo kill -9 $(ps aux | grep "systemctl start docker.service" | head -n 1 | awk '{print $2}')

Tới đây thì tiến trình update đã được tiếp tục, ít nhất tôi không phải lo ngại việc cập nhật kernel và các phụ thuộc của nó bị hủy giữa chừng gây lỗi chúa mới cứu được.

Trước khi khởi động lại docker, tôi cho khởi động lại máy chủ để đảm bảo các tầng sâu của hệ điều hành đã sẵn sàng sau ca update quá sức lựu đạn trên kia. Hệ điều hành đóng tất cả các tiến trình lớp vỏ nhưng không tắt kernel và khởi động lại máy chủ làm tôi suýt tưởng toang. Giải quyết thì bằng cách tắt nóng từ xa thông qua cloud console.

Reset Docker instance

Máy chủ và docker service khởi động lên thành công. Nhưng các container cũ của tôi dùng driver file system overlay của phiên bản cũ – thứ không tồn tại ở phiên bản mới và không thể sử dụng được.

Giải pháp là factory reset lại data pool của docker service:

screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
umount /var/lib/docker/overlay2
rm -rf /var/lib/docker

Tới đây thì các vấn đề đã miễn cưỡng được giải quyết. Bước tiếp theo là backup, build và khởi động lại các dịch vụ.


Các nguồn tham khảo quan trọng:

https://askubuntu.com/questions/979293/docker-ce-post-installation-subprocess-never-finishes

https://github.com/docker/for-mac/issues/1396

https://github.com/moby/moby/issues/22074

_

Leave a Comment

Your email address will not be published. Required fields are marked *