LoginSignup
4

More than 1 year has passed since last update.

posted at

updated at

Organization

Kubernetes: oc observe でオブジェクトの変更差分を確認する

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 でオブジェクトの差分を監視するスクリプトの例です。

obj-diff
#!/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 実装にも使えるので、ぜひご活用ください。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4