🚢
Kubernetes 上の Mastodon のイメージを差し替えるシェルスクリプトを書いた
前提
- 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