TL;DR
- こちらのDockerfileを見納めください
- kindとアプリケーションのコンテナを分けても良かったのですが,kubeconfigの受け渡しが面倒だったので妥協しました
- https://github.com/tozastation/kw/blob/master/Dockerfile.test
事の経緯
- Kubernetesを制御するツールを書きたい.
- テストのために,KubernetesクラスタをホストPCに建てるの面倒だし,環境を汚したくない...
- kind (kubernetes in docker) なるものを発見
- しかし,アプリの開発をDocker内で行っていると,
kindとアプリのコンテナは同一ネットワークに参加していないため,ネットワーク的に参照できないという問題が
そこで,DinD (Docker in Docker)
クラスタの作成をホスト側でなく,コンテナ内のDockerで行うことによってネットワーク的に参照可能にする.
kind in DinD
-
docker:dind
というベースイメージがAlpineなので追加パッケージがある場合は,apk
を使います. - 使い方はこちらの記事が参考になります
FROM docker:dind
RUN apk --no-cache add curl
RUN curl -Lo /usr/local/bin/kind https://github.com/kubernetes-sigs/kind/releases/download/v0.6.1/kind-$(uname)-amd64 && chmod +x /usr/local/bin/kind
kindでクラスタ作成 (Docker Deamonの起動を待つ必要あり)
以下をコンテナ内で実行すれば環境構築完了です!
# クラスタの作成
kind create cluster
# KUBECONFIGに,作成したクラスタのkubeconfigパスを登録
export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
dindコンテナを立ち上げるときに詰まった点
- 問題
- docker run 時に,コマンドを渡すとdocker deamonが起動しなく,kindを実行できなかった
- 解決策
- docker run 実行後,execでコマンドを渡すようにする
まとめ
- kubernetesの環境構築は,minikubeなりkindが,Dockerで構築するオプションを提供してくれていて非常に便利だなと思いました.お試しで気軽に建てるときには自分も重宝しようと思います.
- DinDは初めて使いましたが,プロジェクトごとにDockerが作れるためホストから見たときのコンテナが散らからなくて管理しやすそうという印象です.
- Kubernetesアプリとかプロバイダー作っている世の方々はテスト用のクラスタ構築とかどうされているのかなと気になりました.