メインコンテンツへスキップ

Open Source MANOが正常に起動しなくなった

あるシステムでOpen Source MANO(OSM)をインストールし使っていたのですが、しばらくの間停止状態だった後にシステムを起動させた時に、各ノードが正常に起動せず、OSMが使えない状態になりました。

多少強引ですが復旧させる方法が分かったので、残しておきます。

エラーの原因
#

使っているOSMのバージョンは少し古く、内部でDocker Swarmを使用して、OSMを構成する各ノードを起動していました。

エラーに関する情報を得るため、docker infoコマンドを実行したところ、以下のようなメッセージが出力されました。

$ docker info | sed -n '/Swarm:/,/^$/p'
 Swarm: error
WARNING: No swap limit support
  NodeID:
  Error: error while loading TLS certificate in /var/lib/docker/swarm/certificates/swarm-node.crt: certificate (1 - bzd4md0zzphu0scmdv4qse1kl) not valid after Sun, 21 Dec 2025 21:40:00 UTC, and it is currently Fri, 26 Dec 2025 01:17:30 UTC: x509: certificate has expired or is not yet valid:
  Is Manager: false
  Node Address: 192.168.1.xxx
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 3dce8eb055cbb6872793272b4f20ed16117344f8
 runc version: v1.1.7-0-g860f061
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: builtin
 Kernel Version: 4.15.0-213-generic
 Operating System: Ubuntu 18.04.6 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 15.66GiB
 Name: plainosm-tef
 ID: 80214696-f268-475f-bc53-4a2bca6078af
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

上記メッセージのうち、エラーの原因を示しているのは以下の部分です。

  Error: error while loading TLS certificate in /var/lib/docker/swarm/certificates/swarm-node.crt: certificate (1 - bzd4md0zzphu0scmdv4qse1kl) not valid after Sun, 21 Dec 2025 21:40:00 UTC, and it is currently Fri, 26 Dec 2025 01:17:30 UTC: x509: certificate has expired or is not yet valid:

エラーが発生した理由は、Docker Swarmのノード証明書(/var/lib/docker/swarm/certificates/swarm-node.crt)が期限切れになっており、正常に読み込めていないことが原因でした。

この状態を解消するには、システム時間を証明書が有効だった時刻に戻し、Swarmを起動、証明書を更新してからシステム時刻を同期させるという手順が必要です。 システム時刻に手を入れるという強引な手法であるため、自己責任で行ってください。

復旧手順
#

  1. 今の失効期限を確認

    先述したとおり、ログメッセージの「not valid after Sun, 21 Dec 2025 21:40:00 UTC」の部分です。 この時刻より前の時刻に変更します。

  2. システム時刻の変更

    NTPを一旦止めて、時刻を変更し、dockerサービスを再起動します。

    $ sudo timedatectl set-ntp false
    $ sudo date -s '2025-12-20 12:00:00'
    $ sudo systemctl restart docker
  3. Swarmが操作できるか確認

    $ docker info | sed -n '/Swarm:/,/^$/p'
     Swarm: active
      NodeID: jix3ff38iv6ultm3wcc2a1tjo
      Is Manager: true
      ClusterID: rmm5fpkxxtujxnhj0tagkr3yi
      Managers: 1
      Nodes: 1
    (省略)
    $ docker node ls
    ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
    jix3ff38iv6ultm3wcc2a1tjo *   foobar      Ready     Active         Leader           24.0.2
  4. 証明書を更新

    $ docker swarm ca --rotate
  5. システム時刻の同期

    システム時刻を同期させるためNTPを再開し、dockerサービスを再起動します。

    $ sudo timedatectl set-ntp true
    $ timedatectl
                          Local time: Thu 2026-01-23 06:11:28 UTC
                      Universal time: Thu 2026-01-23 06:11:28 UTC
                            RTC time: Thu 2026-01-23 06:11:29
                           Time zone: Etc/UTC (UTC, +0000)
           System clock synchronized: yes
    systemd-timesyncd.service active: yes
                     RTC in local TZ: no
    $ sudo systemctl restart docker

上記復旧手順を行うことで、起動に失敗していたOSMの各ノードが正常に起動するようになり、OSMが再度使えるようになりました。OSMだけでなく、Docker Swarmを採用しているシステムに共通して使用できる方法だと思うので、困っている方がいたら試してみてください。