サービスの再起動後に Replicated が消失した

現象

ケース 1

systemctl コマンドまたは service コマンドを使用、またはサービス マシンを再起動することで Replicated を再起動すると、Replicated コンテナが消失し、最終的に CircleCI Server がクラッシュしてしまった。

ケース 2

サービス マシンで apt または apt-get コマンドを使用して docker-ce を更新すると、Replicated コンテナが消失し、最終的に CircleCI Server がクラッシュしてしまった。

原因

ケース 1 の原因は、systemd に登録された Replicated サービス (replicated.servicereplicated-operator.servicereplicated-ui.service など) により、サービスの起動時に Docker コンテナが削除されたことです。ケース 2 の原因は、Replicated サービスで使用される Docker イメージ名を利用できないタイミングが生じたことが原因です。

systemctl または service コマンドで起動シーケンスを明示的に開始するか、システムの再起動または docker-ce の更新によりこのシーケンスが暗黙的に開始されると、その最中に Replicated サービスは以下のタスクを実行します。

  1. 既存の Replicated コンテナを削除する。
  2. :current とタグ付けされた対応する Docker イメージを使用して (quay.io/replicated/replicated:current など)、docker run コマンドで新しいコンテナを起動する。

しかし、:current イメージは、他の Docker イメージから派生してローカルでタグ付けされる Docker イメージであり、このタグはイメージのプルに使用することはできません。 そのため、何らかの原因で :current タグが解除された場合、Replicated サービスは使用する Docker イメージを見つけることができず、起動に失敗します。

: :current タグが解除される現象は、docker image prune -a コマンドなどを使用して Docker イメージ キャッシュをクリーンアップすることで容易に再現できます。 Replicated が実行中であるかどうかにかかわらず、docker image prune -a を実行すると Replicated の :current イメージ タグが解除されることが確認されています。 つまり、お使いのサービス マシンで docker image prune -a コマンドまたは同等のコマンドを今までに実行したことが 1 度でもあれば、同様の現象が発生する可能性があります。

解決策

この問題は、以下のスニペットを使用して Replicated を再インストールすることで解決できます。

export REPLICATED_VERSION="2.38.6"
export PRIVATE_IP="$(curl http://169.254.169.254/latest/meta-data/local-ipv4)"
sudo curl -sSk -o /tmp/get_replicated.sh "https://get.replicated.com/docker?replicated_tag=$REPLICATED_VERSION&replicated_ui_tag=$REPLICATED_VERSION&replicated_operator_tag=$REPLICATED_VERSION"
sudo bash /tmp/get_replicated.sh local-address="$PRIVATE_IP" no-proxy no-docker
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています