🚢

Kubernetes 上の Mastodon のイメージを差し替えるシェルスクリプトを書いた

2022/12/10に公開

前提

  • Kubernetes 上に Mastodon を置いている。
  • うちの場合は Sidekiq を StatefulSet かつ InitContainer で db:migrate 処理をさせている。→ そのため、Sidekiq を Rollout すれば、DBスキーマを最初に更新できる。
  • うちの中に Harbor でプライベートなコンテナリポジトリーを持っていて、そこから Tag 名をベースに最新のものを適用する。

作ったもの

イメージの更新スクリプト

update.sh
#!/bin/bash
IMAGE_TAG=$(curl -s https://registry.home.wirednet.jp/api/v2.0/projects/mastodon/repositories/mastodon/artifacts | jq -r '.[0].tags | sort_by(.id) | .[-1].name')
NAMESPACE=mstdnblue

echo Updating...
echo IMAGE_TAG=${IMAGE_TAG}

kubectl -n ${NAMESPACE} get pod

kubectl -n ${NAMESPACE} set image sts/sidekiq *=registry.home.wirednet.jp/mastodon/mastodon:${IMAGE_TAG}
kubectl -n ${NAMESPACE} rollout status sts/sidekiq --watch --timeout 300s
kubectl -n ${NAMESPACE} get pod

kubectl -n ${NAMESPACE} set image deploy/streaming *=registry.home.wirednet.jp/mastodon/mastodon:${IMAGE_TAG}
kubectl -n ${NAMESPACE} rollout status deploy/streaming --watch --timeout 300s
kubectl -n ${NAMESPACE} get pod

kubectl -n ${NAMESPACE} set image deploy/web *=registry.home.wirednet.jp/mastodon/mastodon:${IMAGE_TAG}
kubectl -n ${NAMESPACE} rollout status deploy/web --watch --timeout 300s
kubectl -n ${NAMESPACE} get pod

sleep 5
kubectl -n ${NAMESPACE} get pod

echo Updated.

気を付けたポイント

Harbor から最新のイメージタグを拾ってくる

curl -s https://registry.home.wirednet.jp/api/v2.0/projects/mastodon/repositories/mastodon/artifacts | jq -r '.[0].tags | sort_by(.id) | .[-1].name'

curl を使って Harbor の REST API を呼びだして、コンテナイメージ(アーティファクト)の情報を拾ってくる。
その後、jq でイメージに付いているタグの一覧だけ取り出してきてソートして、最新のタグを特定する。

StatefulSet / Deployment の Pod 更新が終わるまで待機する

kubectl -n ${NAMESPACE} rollout status deploy/web --watch --timeout 300s

kubectl rollout statusコマンドで StatefulSet や Deployment の実行ログを見られるが、--watchオプションを付けると、一通りの処理が終わるまでログを流し続けて、一通り処理が終わったらプロンプトに戻す動きに出来る。
StatefulSet だと、kubectl wait --for condition=readyが使えない代わりになる。

更新中の様子

waiting for...で表示されているところが、kubectl rollout statusコマンドの出力結果になっている。

Discussion