kubectl リソース表示のリグレッション修正(100行以上のデータ)

概要

kubectl get コマンドで100行以上のリソースを表示した際に列の位置がずれるリグレッションが修正されました。

背景

kubectl get podskubectl get nodes のような出力は、表形式で見やすく整形されます。Kubernetesはこの整形に tabwriter というライブラリを使用しており、列の幅を自動的に揃えます。

詳細

PR #138023 で導入された定期的なtabwriterのフラッシュ機能が、大きなデータセットでの列アライメントを壊していました。

問題のメカニズム: tabwriterは列幅を記憶して出力を揃えますが、定期フラッシュが導入されたことで、最初の100行でフラッシュが行われた後に、より幅の広いセルが出現すると、すでに出力済みの行と新しい行で列幅が異なってしまいました。

修正方法: 全行を事前スキャンして列ごとの最大幅を計算し、最初のフラッシュの前にヘッダーのセル幅をその最大値にパディングするようにしました。メモリ使用量やCPU使用率への影響は最小限(約3-7%の増加)に抑えられています。

使用例

修正前は以下のような崩れた出力が起きることがありました:

NAME                    STATUS   AGE
short-name              Running  1d
a-very-long-pod-name-here   Running  2d  # 列がずれる

修正後はすべての行で列が正しく揃います。

参考リンク