WinMergeのフィルタ機能でk8sリソースの更新前後比較を効率化してみた
はじめに
こんにちは、SHIFTでインフラコンサルタントをしている大竹です。
昔アプリケーション開発に携わっていた頃、ソースコード管理リポジトリへのコミット前の差分確認等のために、WinMergeという比較ツールをよく使っていました。開発畑を離れてからはほとんど使うことがありませんでしたが、Kubernetesを運用する中で、当時は使わなかった機能を使うことになったので、その紹介と有用だった設定を少し紹介したいと思います。
今回の用途
Kubernetesのクラスターを運用していて、バージョンアップの作業前と後でリソースの情報に差異がどうなっているか、意図していない変更部分がないかを確認する必要がありました。
差異を確認するために、まず新旧のクラスターでリソース情報をkubectl getしてテキストに出力し、その後で出力したテキストを比較します。
ところが出力したリソース情報には、更新日付のタイムスタンプが入っていたりリビジョン番号がインクリメントされたりしています。
必ず差分が出てしまうので、結局ほとんどすべての出力テキストを開いて、どこが気にするべき差分なのかを判断する必要がありました。
上の画像は、nginxイメージを使うDeploymentを、nginxのバージョンだけ変更してapplyした前後のリソース情報の比較(yaml形式)です。
意図的に変更した部分はimageの部分のみなのですが、7行も差異として判定されてしまっています。実際は一行だけ確認したいのに、7倍の確認をしなければなりません。
運用されているKubernetesクラスターであれば、出力テキストの数は100個以上にはなるので、全てこのような比較をするとなると大変です。
どうにかこういった差分を無視できないかと調べていたところ、よく使っていたWinMergeにまさにその機能があることに気づきました。
フィルターの設定方法
では早速、設定の方法を紹介していきます。WinMergeのメニューから、フィルターの設定を開きます。
では早速、設定の方法を紹介していきます。WinMergeのメニューから、フィルターの設定を開きます。
「行フィルターを有効にする」にチェックし、新規ボタンをクリックして
フィルターにかけたい正規表現を入力し、先頭のボックスにチェックを入れます。手始めに generation と resourceVersion の差異を無視してみましょう。
{2,}generation:
{2,}resourceVersion:
文字列の先頭に半角スペースがあることに注意してください。
例えばひとつめの正規表現は、「2文字以上の半角スペースから始まり、generation:の文字列が続く行」という意味になります。
この2点を適用すると、比較の結果はこのように変わります。
一部の行が薄くなったのがわかると思います。これがフィルターによって差異が無視された行です。
この調子でガシガシフィルターしていきましょう。
差分がnginxのバージョンだけになりました!
この方法を使えば、必ず発生するような差異は無視することができ、本当に確認したい差異だけに注力することができます。
フォルダ比較の結果
そしてこれが真価を発揮するのが、フォルダ比較を行ったときです。試しに更新の前と後でフォルダを分け、同条件で出力したリソース情報をoutput1~4.yamlの4つのファイルに用意し、そのうちoutput1~3.yamlはnginxのバージョンを戻します。つまりoutput4.yamlだけがバージョン差異のある状態です。
フォルダを比較すると、output4.yamlだけ差異があると判定され、output1~3.yamlは差異が無視されて差異なしと判定されています。
実際にoutput1~3.yamlを開いてみると、差異はあるもののすべて無視され、「同一です。」のメッセージが表示されます。
クラスタのすべてのリソースを比較するとなると、その比較対象も膨大なものになり、意味のない差異ばかり確認することになってやってられませんが、この手法を用いることでかなりの効率化になります。
参考
最後に、今回設定したフィルタの一覧を紹介します。すべて先頭に半角スペースが入ります。自己責任において参考にしてください。
{2,}generation:
{2,}resourceVersion:
{2,}deployment.kubernetes.io/revision:
{2,}\{"apiVersion":"apps/v1","kind":"Deployment","metadata":
{2,}lastUpdateTime:
{2,}message:
{2,}observedGeneration:
{2,}creationTimestamp:
{2,}uid:
正規表現を駆使すれば、もっとリッチなフィルターをかけることもできます。もちろん、むやみにフィルターを追加すると、比較するべき差異も無視されてしまうこともあるので、検証や確認は入念に行いましょう。
ぜひ試してみてください!
【このSHIFT公式ブロガーの他の記事】
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/