Skaffoldを試してみた話。

Skaffoldとは

Googleが開発している、Kubernetesアプリケーションを快適に開発するためのツール。 アプリケーションのソースを監視し、変更が入ると、自動的にコンテナイメージをビルドしてKubernetesクラスタにデプロイしてくれる。

2018/3/16に発表された新しいツールで、触った感じではまだこれからといった感じだった。

Goで書かれていて、Linux、OS X、Windows用のバイナリが提供されている。

似たツールにはMicrosoftのDraftがある。

また、Gitのコミットを自動デプロイしてくれるものに、GitkubeJenkins X (エックス)がある。

Windows版を試す

自PCがWindowsなのでWindows版を試す。 会社で使ってるのもWindowsだし。

Skaffoldを使うには、Skaffoldの実行バイナリ、Kubernetesクラスタ、そのクラスタをコンテクストに設定したkubectl、Dockerが必要。

まずWindows版Skaffoldをインストールする。 GitHubのリリースページからWindowsバイナリをダウンロードして、skaffold.exeにリネームしてPATHの通ったところに置くだけ。 Skaffoldのバージョンは0.3.0。


Kubernetesクラスタは、Windows 10 Home上にminikube 0.22.2で作ったKubernetes 1.7.0のクラスタ。 minikubeは以前インストールしたものを使う。

minikubeを起動。

> minikube start --kubernetes-version v1.7.0

kubectlもminikubeと一緒にインストール済み。


Dockerについては、デーモンはminikube上のを使えばいいとして、クライアント(Docker Client)はskaffoldコマンドから実行するのでWindows上にないとだめはなず。

WindowsでDockerと言えば今ならDocker for Windowsだけど、これはWindows 10 Proじゃないと使えなかったはずなので、Docker Toolboxでクライアントをいれた。

このクライアントはデフォルトではローカルのデーモンを見てるので、minikubeのデーモンを見させる。 そのための設定はminikubeのコマンドで分かるようになっている。

> minikube docker-env
SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.100:2376
SET DOCKER_CERT_PATH=C:\Users\kaitoy\.minikube\certs
SET DOCKER_API_VERSION=1.23
REM Run this command to configure your shell:
REM @FOR /f "tokens=*" %i IN ('minikube docker-env') DO @%i

これに従って以下のコマンドを実行するとクライアントの設定完了。

> @FOR /f "tokens=*" %i IN ('minikube docker-env') DO @%i


これで準備完了。

SkaffoldのGetting Startedをやってみる。

Skaffoldのリポジトリをcloneして、コマンドプロンプト開いて、examples/getting-startedにcdして、以下のコマンドを実行。

> skaffold dev

エラーで終わった。

[31mERRO[0047] run: running skaffold steps: starting watch on file C:\Users\kaitoy\Desktop\skaffold\examples\getting-started\Dockerfile: adding watch for C:\Users\kaitoy\Desktop\skaffold\examples\getting-started\Dockerfile: The parameter is incorrect.

MinGW(Git Bash)でやっても同じ結果。 Issuesに登録されているやつと同じ問題っぽい。

対応を待つしかない。

Linux版を試す

Linux版も試してみる。 minikubeのVMがLinux(Boot2Docker)なので、そこで動かす。 WSLは試さない。 会社のPCがWindows 7で使えないので。


SkaffoldのLinux版バイナリをダウンロードしてskaffoldにリネームして、minikubeのBoot2DockerにSSHでログインして、PATHの通ったところに置く。 因みにminikubeのBoot2Dockerは、ユーザdockerパスワードtcuserでログインできる。

kubectlのLinux版バイナリもダウンロードしてPATHに入れたら準備完了。


examples/getting-startedにcdしてskaffold devしたらエラー。

ERRO[0001] run: getting skaffold config: getting k8s client: Error creating kubeConfig: invalid configuration: no configuration has been provided

ちょっと調べたら、kubectlのコンテクストが設定されていないのがだめっぽい。

# kubectl config current-context
error: current-context is not set

Windows上のkubectlに設定されたコンテクストを参考に、以下の内容を~/.kube/configに。

apiVersion: v1
clusters:
- cluster:
    certificate-authority: /c/Users/kaitoy/.minikube/ca.crt
    server: https://localhost:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /c/Users/kaitoy/.minikube/client.crt
    client-key: /c/Users/kaitoy/.minikube/client.key


再度skaffold devしたら違うエラー。

WARN[0002] run: build: build step: running build: read auth configs: docker config: opening docker config: open /home/docker/.docker/config.json: no such file or directory

.docker/config.jsondocker loginすると生成されるものらしい。 SkaffoldのREADME.mdにはminikube使うならDocker image registry要らないって書いてあるんだけど…

色々あって、ファイルがあればいいだけっぽいので、以下で良し。

# echo {} > ~/.docker/config.json


再度skaffold devしたら動いた。 Dockerビルドが走り、minikubeにPodがデプロイされた。

Getting Startedのサンプルは、一秒ごとに「[getting-started] Hello world!」というメッセージをコンソールに表示する。

examples/getting-started/main.gofmt.Println("Hello world!")のとこをいじってメッセージを変えたら、自動で再Dockerビルドしてデプロイされて、新しいメッセージを表示し始めた。 便利。

examples/getting-started/skaffold.yamlがSkaffoldの設定ファイルで、ここに定義されたKubernetesマニフェストをデプロイしてくれるっぽい。 watchするファイルはどう決めているんだろうか。 Dockerfileとmain.goはwatchしてるけど、新しいファイルを作ってもDockerビルド走らなかった。


ひとつ問題は、Linuxファイルシステム上で編集しないと変更を検知してくれない。

minikubeのVMにはC:\Usersがマウントされてるので、最初はWindows上にcloneしたサンプルをSkaffoldで実行しつつ、Windows上でmain.goを編集してみたんだけど、それだとダメだった。

やはりWindows版Skaffoldの修正が待たれる。