そんな今日この頃の技術ネタ

本家側に書くほどでもない小ネタ用

Kubernetes関連の便利ツール: stern

 Docker for MacにKubernetesが載ったということで、今回は複数のPodのログをまとめて参照できるsternを紹介。(前々から書こうとは思ってたんだけど、機会を逸していたんだよね)

github.com


導入

 MacならHomebrewからインストールできる。

$ brew install stern


サンプルの用意

 実際の使い方の前に以下のようなサンプルを用意してみる。KuberneteへのPodの展開は現在ではDeploymentを用いることが推奨されているので、ひたすらログ出力する2つのコンテナによって構成されたPodを3つデプロイしてみる。

# deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: sample
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: sample
    spec:
      containers:
        - name: sample-a
          image: busybox
          command:
            - sh
            - -c
            - while true; do echo $(hostname):a; sleep 10; done
        - name: sample-b
          image: busybox
          command:
            - sh
            - -c
            - while true; do echo $(hostname):b; sleep 10; done
$ kubectl create -f deployment.yml
deployment "sample" created
$ kubectl get all
NAME            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/sample   3         3         3            0           7s

NAME                   DESIRED   CURRENT   READY     AGE
rs/sample-7546bcdb67   3         3         0         7s

NAME            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/sample   3         3         3            0           7s

NAME                   DESIRED   CURRENT   READY     AGE
rs/sample-7546bcdb67   3         3         0         7s

NAME                         READY     STATUS              RESTARTS   AGE
po/sample-7546bcdb67-ndvln   0/2       ContainerCreating   0          7s
po/sample-7546bcdb67-vj5fh   0/2       ContainerCreating   0          7s
po/sample-7546bcdb67-zzv4f   0/2       ContainerCreating   0          7s

NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
svc/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7d


コンテナのログを確認するには?

 さて、ここからデプロイされたコンテナのログを見ようとした場合、 特定のPOD内のコンテナであればkubectl logs -f [POD] -c [CONTAINER]によってさながらtail -fのようにログ監視をすることができる。

$ kubectl logs -f po/sample-7546bcdb67-ndvln -c sample-a
sample-7546bcdb67-ndvln:a
sample-7546bcdb67-ndvln:a
sample-7546bcdb67-ndvln:a

 この方法の場合はdeploymentによって作られたPODの名前は変わってしまうので毎度確認しないといけないのがちょい面倒。


 また、kubectl logs -l[METADATA] -c [CONTAINER]によって特定のメタデータを持ったPODの特定のコンテナについて横断的にログを参照することができる。

$ kubectl logs -lapp=sample -c sample-a
sample-7546bcdb67-ndvln:a
sample-7546bcdb67-vj5fh:a
sample-7546bcdb67-zzv4f:a

 ただし、これは上から順に参照したログを繋げただけのものなので時系列が整わないのに注意。


 kubectl logsコマンドではdocker-compose logsのようなノリで複数のコンテナを同時に参照することはできないし、-lオプションと-fオプションを併用することもできないのが開発時に不便だったりする。


sternの使い方

 そんなわけで本題。こんな複数のPOD/コンテナで構成されたシステムのログを横断的に監視したい場合に便利なのが今回のstern。

 一番シンプルな使い方として、今回デプロイした全てのPODのログであればstarn [POD_QUERY]の形で参照できる。

$ stern sam
sample-7546bcdb67-vj5fh sample-a sample-7546bcdb67-vj5fh:a
sample-7546bcdb67-vj5fh sample-a sample-7546bcdb67-vj5fh:a
sample-7546bcdb67-zzv4f sample-b sample-7546bcdb67-zzv4f:b
sample-7546bcdb67-zzv4f sample-a sample-7546bcdb67-zzv4f:a

 ちなみにこの時の指定はPOD名は全文である必要は無くてPOD名の一部で良い。つまりもっと複雑なPODによって構成されたシステムなんかで横断的に参照する際にも使える。


 また、-lオプションによるメタデータや、-cオプションによりコンテナを限定することもできる。

$ stern -lapp=sample -c .*b
sample-7546bcdb67-ndvln sample-b sample-7546bcdb67-ndvln:b
sample-7546bcdb67-ndvln sample-b sample-7546bcdb67-ndvln:b
sample-7546bcdb67-zzv4f sample-b sample-7546bcdb67-zzv4f:b
sample-7546bcdb67-zzv4f sample-b sample-7546bcdb67-zzv4f:b

 他にも-tによるタイムスタンプ付加などできる。



 こんな感じで、sternを活用することによってDocker Composeのような軽やかさでKubernetes環境での開発を行うことができる。

WEB+DB PRESS Vol.99

WEB+DB PRESS Vol.99

  • 作者: ?橋健一,谷口禎英,井本大登,山崎勝平,大和田純,内村元樹,坂東昌哉,平田敏之,牧大輔,板敷康洋,大?浩崇,穴井宏幸,原口宗悟,久田真寛,ふしはらかん,のざきひろふみ,うらがみ,ひげぽん,池田拓司,はまちや2,竹原,片田雄樹,渋江一晃,WEB+DB PRESS編集部編
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/06/24
  • メディア: 大型本
  • この商品を含むブログを見る