とことんDevOps | 日本仮想化技術が提供するDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けするとことんDevOpsでは、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果など、DevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、アジャイル開発、コンテナ開発など

開催予定の勉強会

各種SNSのフォローもよろしくお願いいたします。

sternの導入と使い方

Kubernetesを運用していると、Podのログが見たくなることはよくあると思います。
kubectl get podsでPod名を調べ、kubectl logs -fして、kubectl applyでPodが入れ替わるとまた1から・・・これだけでも面倒ですね。

sternというツールは、正規表現でPodを指定でき、Podの生まれ変わりも自動で検知し、新しいPodからログ読み込んでくれます。ログを見る作業がぐっと楽になりますので、早速導入していきましょう。

github.com

検証環境

  • macOS 12.1
  • stern 1.21.0

次のアプリをデプロイし、動作確認をしています。
GitHub - vtj-ttanaka/hello-minikube

NAME                             READY   STATUS    RESTARTS   AGE
pod/hello-web-56b584bd88-2j92b   1/1     Running   0          41m
pod/hello-web-56b584bd88-4twkc   1/1     Running   0          41m
pod/hello-web-56b584bd88-dcnxs   1/1     Running   0          41m

NAME                TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/hello-svc   LoadBalancer   10.104.236.65   <pending>     8080:31203/TCP   41m

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-web   3/3     3            3           41m

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-web-56b584bd88   3         3         3       41m

インストール

macOSをお使いの場合は、Homebrewを使ってインストールすると簡単です。

brew install stern

Homebrewが使えない環境では、GitHubのReleasesから自分の環境に合ったバイナリをダウンロードし、パスの通ったディレクトリに設置してください。

次のコマンドを実行し、エラーがでなければ完了です。

stern --version

実際に使ってみる

sternコマンドの使い方は次の通りです。

stern pod-query [flags]

pod-queryにはPodを検索するための正規表現を記述します。 sternのソースコードを見てみると、標準のregexpパッケージを使っているようなので、正規表現はRE2で記述できそうです。
flagsはコマンドラインオプションです。全てのオプションは-h--helpで確認できます。
pod-queryflagsの記述が逆になっていても動くようです。
ログの自動読み込みはオプション等ありません。自動で動作しますので、sternでログを見ながらkubectl applyなどを試してみてください。

それではまず全てのログを出力してみます。

stern . -A

pod-queryの指定では.を指定していますので、全ての条件にマッチします。
-A--all-namespacesのショートオプションで、全てのNamespaceを対象とします。
Pod名は見やすいように色分けされて出力されていますが、もし見づらい場合は--color neverで色付けを止めることも可能です。
また、出力のフォーマットも指定でき--output [default|raw|json]で変更できます。

Pod名の一部を指定して出力してみます。

stern hello -A

hello-webのログが出力されたと思います。正確なPod名を指定する必要はありません。 -e-E--exclude-podで不要なログやコンテナ、PodをExcludeすることもできます。

少し変わった機能として、インタラクティブにラベルを選択し、ログを表示します。 しかし、この機能は全てのラベルが対象ではなく、app.kubernetes.io/instanceラベルのみが対象のようです。

stern -p

No matching labelsと出た場合は、defaultのNamespaceにapp.kubernetes.io/instanceラベルを持ったリソースが存在しないのかもしれません。 -Aで全てNamespaceを対象とするか、-nで対象のNamespaceを絞り込むといいでしょう。

まとめ

簡単ではありますが、よく使いそうな機能をまとめてみました。
ログの自動読み込みがあるだけでも、アップデート作業が随分と楽になるのではないでしょうか。
GitHubリポジトリの方には、今回紹介した機能の他に様々な使用例が紹介されていますので、ぜひ確認してみてください。