はじめに
Kubernetes上でデプロイするコンテナイメージの開発にTiltが便利と聞き、とりあえずサンプルを動かしてみました。その記録です。
公式サイトからの言葉を借りると、「Tiltは、コード変更から新しいプロセスへの全てのステップ(ファイルの監視、コンテナイメージの構築、環境の最新化)を自動化する」ツールです。
事前準備
Installを参考にして記載します。macOS, Linux, Windowsで動作可能のようですが、筆者はmacOS, Linuxでセットアップできることを確認しました。
必要なツール
- Docker
- Linuxの場合はroot以外のユーザでセットアップが必要
- kubectl
- kubectlのインストールおよびセットアップ等を参考にインストール
- ctlptl
- Kind、k3d、Minikube等の「ローカルKubernetesクラスター」を作ってくれるツール
- Tiltで使うコンテナレジストリを作ってくれる機能もあり
- おそらくはLinuxを使う場合に必須で、macOSやWindowsでは必須ではない
- tilt
- コンテナイメージのビルド、プッシュ、K8sリソースのデプロイを全てやってくれるツール
ctlptlのインストール
macOS, Windowsの場合はこの手順は(おそらく)不要です。
ctlptl Installation Appendixを参考にインストールします。
いくつかのインストールのバリエーションが書かれていますが、おそらくはCommand-lineに記載のcurl
コマンドでインストールする方法が一番楽です。
※ 筆者はgo install
コマンドでGoのパッケージとしてインストールしてしまいました。この場合、環境によってはGoのセットアップが必要となり手数が増えます。
Tiltで使うコンテナレジストリの作成
macOS, Windowsの場合はこの手順は(おそらく)不要です。
ケース1 : ローカルで使えるKubernetesクラスターがない場合
次のコマンドでローカルマシン内にKubernetesクラスターを作成しつつ、Tilt用のコンテナレジストリを作成します。
ctlptl create cluster kind --registry=ctlptl-registry
上記はkind
でローカルクラスターを作る例ですが、k3d
やminikube
も指定可能です。
ケース2 : 既にローカルKubernetesクラスターがある場合
ローカルKubernetesクラスターがあってそれをそのまま使いたい場合は、以下のコマンドでTilt用のコンテナレジストリのみを作成します。
ctlptl create registry ctlptl-registry
ケース1またはケース2のコマンドが成功すれば、Tilt用のコンテナレジストリが以下のように作成されます。
$ docker ps -f name=ctlptl-registry
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f80cd832b671 registry:2 "/entrypoint.sh /etc…" 4 days ago Up 4 days 127.0.0.1:45841->5000/tcp ctlptl-registry
Tiltのインストール
InstallにしたがってTiltをインストールします。
curl -fsSL https://raw.githubusercontent.com/tilt-dev/tilt/master/scripts/install.sh | bash
ちなみにmacOSの場合はbrew
でもインストールできました。
brew install tilt
サンプルを動作させる
tilt-example-goのデプロイ
GitHubにあるGoのサンプルを動かしてみます。
$ git clone https://github.com/tilt-dev/tilt-example-go.git
$ cd tilt-example-go/0-base
ディレクトリの中身を見てみましょう。
$ tree .
.
├── Tiltfile
├── build.bat
├── deployments
│ ├── Dockerfile
│ └── kubernetes.yaml
├── go.mod
├── go.sum
├── main.go
└── web
├── index.html
└── pets.png
Webアプリケーション、コンテナ、K8sリソースを作成するためのソースがall-in-oneで入っているのが何となくわかります。
これらのソースを使ってどのようにK8s上にリソースをデプロイするかは、Tiltfile
に以下のように書かれています。
# -*- mode: Python -*-
docker_build('example-go-image', '.', dockerfile='deployments/Dockerfile')
k8s_yaml('deployments/kubernetes.yaml')
k8s_resource('example-go', port_forwards=8000)
諸々確認できたので、tilt up
コマンドを実行してみましょう。
$ tilt up
Tilt started on http://localhost:10350/
v0.33.11, built 2024-02-15
(space) to open the browser
(s) to stream logs (--stream=true)
(t) to open legacy terminal mode (--legacy=true)
(ctrl-c) to exit
コマンドを実行後、Webブラウザ上で http://localhost:10350/ にアクセスすると、以下のようにTiltのWebUIを見ることができます。
上のリストで1行目の(Tiltfile)
や2行目のexample-go
等をクリックすると実行ログが出てきて、Tiltfileの内容をもとに以下を一気通貫で実行していることがわかります。
- Goアプリケーションのコンテナイメージをビルド
- ビルドしたイメージをコンテナレジストリにプッシュ(※1)
- K8sのマニフェストにしたがって、ローカルK8sにリソースがデプロイされる(※2)
※1 Linuxの場合、事前に作成したctlptl-registryのコンテナレジストリにpushされます。macOSのDocker Desktop for Macだと、既にイメージをbuildした時点でローカルK8s環境からコンテナイメージをpullできる状態になっているようです。
※2 以下のように、ローカルK8s環境にGoアプリケーションのリソースが出来ているのを確認できます。
$ kubectl get deploy -n default
NAME READY UP-TO-DATE AVAILABLE AGE
example-go 1/1 1 1 11m
$ kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
example-go-649479f666-7kwr8 1/1 Running 0 11m
example-goのWebアプリケーションには http://localhost:8000/ でアクセスでき、以下のような画像と文字が表示されます。

ソースを編集してみる
ここで、web/index.html
に記載されたHello cats!
というテキストを、Hello CATs!
に変更してみましょう。
Tiltが変更を検知し、変更を反映するために必要な作業(コンテナビルド、プッシュ、K8sへのデプロイ)を自動で実行してくれます。TiltのWebUIで見ると、下のようにexample-goのリソースがUpdatingの状態になることを確認できます。
Update完了後に再び http://localhost:8000/ にアクセスすると、確かに文字列の変更が反映されています。素晴らしい!

この辺の動きは、以下の動画の2:50~3:40あたりを見ていただくとより理解できると思います。
おわりに
これまではアプリの変更内容をコンテナやK8sで確認するのに、手動でコンテナのビルドやプッシュ等の作業を行う必要がありましたが、それを自動化してくれるのがTiltであることを理解できたかと思います。
筆者はまだサンプルでしか試せていないので、これから自分で作っているコンテナやK8s環境にも適用していこうと思います。