My External Storage

Sep 28, 2019 - 4 minute read - Comments - docker kubernetes go

[dkl] 実行中のDocker ContainerやKubernetes Podを一覧して選択、アタッチするツールを作った

同僚がPythonで作ったOSSをGoに移植してみた。

$ dkl -h
Usage of dkl:
  -d -docker
        list docker containers and exec selected container.
  -k -kubernetes
        list pods and exec selected pod.
  -v  -version
        print version information and quit.

TL;DR

  • Docker ContainerやKubenetes Podにログインするには、一度起動中のContainer(Pod)を一覧する必要がある
    • さらに名前をコピーしてdocker(kubectl) execコマンドを実行する必要がある
  • dttコマンドは1回のコマンドで一覧を表示、execコマンドで選択したContainer(Pod)にアタッチする。
    • Pythonで作られている。
  • Goで書き直したのがdklコマンド
  • promptuiを使ったので一覧からの選択部分はリッチ

demo

dklの概要

Dockerコンテナにログインしたいとき、大抵はdocker psコマンドを実行し、コンテナの名前を確認し、docker execコマンドを実行することになる。 これは、Kubernetes上のPodにアタッチするときもほぼ同様の操作になる。

dklコマンドは上記をラクするために同僚がPythonで作っていたツールをGoで書き直したものだ。

https://github.com/ymizushi/dtt

https://github.com/budougumi0617/dkl

dklコマンドを使うと、Dockerコンテナ(あるいはKubernetes Pod)一覧を表示し、選択したコンテナにアタッチすることができる。

インストールにはBrewを利用できる。

$ brew install budougum0617/tap/dkl

2019/09/28時点の使い方は次の通り。

$ dkl -h
Usage of dkl:
  -d    list docker containers and exec selected container.
  -docker
        list docker containers and exec selected container.
  -k    list pods and exec selected pod.
  -kubernetes
        list pods and exec selected pod.
  -v    print version information and quit.
  -version
        print version information and quit.

作り込んていないので、一覧できる情報は少ないが、dklコマンドを引数なしで動かすと、実行中のコンテナ一覧を表示する。 ひとまず名前とImage情報を表示している。

$ dkl
Use the arrow keys to navigate: ↓ ↑ → ←  and / toggles search
Docker running...?
  🐋 /mysql (mysql:5.7, sha256:98455b9624a96e32b353297bb312913b6bbd62ac195cea2c7dd477209ba572d6)
     /mysql8 (mysql:8.0, sha256:91dadee7afeebe274c51104d572ab6a2dc0ae97473f71afc57fbfd48c0ceb8aa)

--------- Image ----------
Name:           ["/mysql"]
Image:          mysql:5.7
ImageID:        sha256:98455b9624a96e32b353297bb312913b6bbd62ac195cea2c7dd477209ba572d6

この中から選択したコンテナにdocker execコマンドを実行してコンテナへアタッチ、インタラクティブシェルを開始する。

KubernetesのPodの場合は以下のような情報を表示する。

dkl -k
Use the arrow keys to navigate: ↓ ↑ → ←  and / toggles search
Kubernetes pod running...?
  ⎈ nginx (default Running)
    coredns-5c98db65d4-fxttt (kube-system Running)
    coredns-5c98db65d4-lv9gh (kube-system Running)
    etcd-minikube (kube-system Running)
    kube-addon-manager-minikube (kube-system Running)
    kube-apiserver-minikube (kube-system Running)
    kube-controller-manager-minikube (kube-system Running)
    kube-proxy-kchl6 (kube-system Running)
    kube-scheduler-minikube (kube-system Running)
    storage-provisioner (kube-system Running)

--------- Pod ----------
Name:               "nginx"
Namespacege:        default
Status:             Running
Age:                114h51m50.205832s

こちらも同様に選択したPodにkubectl execコマンドを実行してアタッチする。

対象を選択する部分はmanifoldco/promptuiパッケージをそのまま利用しているので、絞り込み検索もできる。

技術書典の準備の隙間でやっていたので、雑なところもあるが、ひとまずちゃんと動くものができてよかった。

特徴

機能的には前述の機能しかない。Goで実装してよかった特徴としては以下があげられる。

  • シングルバイナリ・マルチプラットフォーム提供が簡単
  • Go Releaserを使ったので、デプロイが簡単
  • manifoldco/promptuiを使ったのでインタラクティブな絞り込みが簡単にできた
  • DockerもKubernetesもGo SDKが公開されているので、APIの呼び出しが簡単

不出来な点としては、実装を省略するため、ログインはdockerkubectl)コマンドを外部プロセスとして実行している。 本当はSDKのexec用のAPIを利用したかったが、時間がたりなかった。

終わりに

ひととりカタチにはなったのだが、あまり作り込めていない。 具体的には、思いつくところだけで以下のような改善点がある。

  • 構造化が雑
  • testableではない
  • PodAgeで表示している時間が分かりにくい(標準パッケージだとtime.Durationをいい感じに表示できない)
  • 実行時にアタッチして呼び出す実行コマンドの指定にls -laなどが指定できない
  • ログインでは外部コマンドを実行しているので、dockerkubectlコマンドに依存している

他にも作りたいOSSがあったり、来月はHacktoberfestもあるのですぐにはできないが、引き続きカイゼンしていきたい。

参考

関連記事