Docker 被重啟故障
阿新 • • 發佈:2019-01-28
在生產環境中,docker和flannel都是通過systemd管理的,發生了一個奇怪的事情,當重啟網路外掛flannel的時候,docker daemon也發生了重啟,這個很奇怪,按道理是各自獨立執行的。細查日誌,當重啟flannel時候systemd也把docker重啟了。
# systemctl list-dependencies docker.service
docker.service
● ├─docker-cleanup.timer
● ├─docker-storage-setup.service
● ├─flanneld.service
● ├─system.slice
● └─basic.target
● ├─microcode.service
● ├─rhel-autorelabel-mark.service
● ├─rhel-autorelabel.service
● ├─rhel-configure.service
● ├─rhel-dmesg.service
● ├─rhel-loadmodules.service
● ├─selinux-policy-migrat
奇怪的發現了docker依賴的竟然有flanneld
再看看docker的systemd配置
# ll /etc/systemd/system/docker.service.requires/
lrwxrwxrwx 1 root root 40 8月 23 08:00 flanneld.service -> /usr/lib/systemd/system/flanneld.service
確實是依賴了flannel,那這個軟鏈是怎麼生成的呢?答案是開啟自啟動system enable搗的鬼,
當設定了flannel的開機自啟動後會生成下面兩條記錄
# systemctl enable flanneld
Created symlink from /etc/systemd/system/multi-user.target.wants/flanneld.service to /usr/lib/systemd/system /flanneld.service.
Created symlink from /etc/systemd/system/docker.service.requires/flanneld.service to /usr/lib/systemd/system/flanneld.service.
那麼為什麼會生成呢?深入瞭解systemd的管理
# cat /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/flanneld
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=/usr/bin/flanneld-start $FLANNEL_OPTIONS
ExecStartPost=/opt/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
在install模組裡面,有個RequiredBy,他是指定依賴這個程式的所有unit的列表。當enable的時候會生成requires目錄。
終於找到原因了,解決的辦法無非是註釋這行,或者開機自啟動放到rc目錄下面,而不通過enable的方式。