Kubernetes でコントローラの動きを確認したいときなど、オブジェクトのどの部分が変更されたかを知りたい場面があります。kubectl get
の -w -o yaml
で変更を watch することはできますが、複数 YAML がそのまま表示されるのであまり見やすくありません。
この記事では、Openshift の CLI oc
コマンドの observe
機能を使って、オブジェクトの変更差分を少し確認しやすくする方法を紹介します。
実行イメージ
obj-diff
は後述のスクリプトになります。kubectl rollout restart
で Deployment にどのような差分が生まれるかを oc observe
で見ている例です。
oc observe とは
oc
は Openshift の CLI ツールです。Mac の場合は Homebrew の openshift-cli
で簡単にインストールすることができます。そのサブコマンド observe
ではオブジェクトの更新ごとに、簡単に指定のスクリプトを実行することができます。例えば以下では、カレントのネームスペースの Deployment
が変更されるたびに ./obj-diff
というスクリプトが実行されます。
oc observe deploy --object-env-var OBJ --type-env-var EV -- ./obj-diff
上記例の引数は以下の意味になります。
-
--object-env-var
: 指定した環境変数に JSON シリアライズされたオブジェクトが設定される -
--type-env-var
: 指定した環境変数に更新種別 (Sync
,Updated
,Deleted
,Added
) が渡されます。
Custom Resource に関しては、2020/11/27 時点では未マージですが observe: support CRDs #650 で対応されています。この PR でビルドし、Custom Resource が見れることを確認しています。
スクリプト
以下は oc observe
でオブジェクトの差分を監視するスクリプトの例です。
# !/bin/bash
DIR=${DIR:-/tmp/}
VER=$(echo -E $OBJ | jq -r .metadata.resourceVersion)
CURR="$DIR/${1}-${2}.${VER}.yaml"
PREV="$DIR/${1}-${2}.prev.yaml"
LOG="$DIR/${1}-${2}.log"
echo "$(date +%H:%M:%S) $EV: $1/$2" | tee -a $LOG
echo $OBJ | ruby -rjson -r yaml -e "print JSON.parse(STDIN.read).to_yaml" > "${CURR}"
if [ -f "${PREV}" ]; then
git diff --color "${PREV}" "${CURR}" | tee -a $LOG
fi
cp "${CURR}" "${PREV}"
echo "-----------------------------------------------"
oc observe
を使って上のスクリプト obj-diff
を以下のようなイメージで実行します。
# YAML 保存用のディレクトリを作成しておく
export DIR=$(mktemp -d)
echo $DIR
# deploy を監視
oc observe deploy --object-env-var OBJ --type-env-var EV -- ./obj-diff
# longhorn-system ネームスペースにある Custom Resource (volumes.longhorn.io) を監視
oc observe volumes.longhorn.io -n longhorn-system --object-env-var OBJ --type-env-var EV -- ./obj-diff
DIR
環境変数で指定したディレクトリに毎変更ごとの YAML が保存されます。また。.log
には差分を記録したログが記録されます。
$ ls -l
total 80
-rw-r--r-- 1 tkusumi staff 3914 11 27 17:08 default-mypod.11080014.yaml
-rw-r--r-- 1 tkusumi staff 3991 11 27 17:08 default-mypod.11081441.yaml
-rw-r--r-- 1 tkusumi staff 4334 11 27 17:08 default-mypod.11081448.yaml
-rw-r--r-- 1 tkusumi staff 4333 11 27 17:08 default-mypod.11081492.yaml
-rw-r--r-- 1 tkusumi staff 5743 11 27 17:08 default-mypod.log
-rw-r--r-- 1 tkusumi staff 4333 11 27 17:08 default-mypod.prev.yaml
おわりに
oc observe
は Kubernetes のオブジェクトの変更を検知して、シェルスクリプトでちょっとした処理を行いたいときに非常に便利です。@superbrothers さんの oc observe コマンドで始める Kubernetes コントローラ開発 のようにコントローラの PoC 実装にも使えるので、ぜひご活用ください。