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