Skaffoldでminikubeのローカル環境開発
概要
TLSでの通信も行うことができたのでローカルで開発していきたいが
docker-composeのvolumesみたいにMacとコンテナをマウントさせるすべがなさそう。
ざっと調べるとSkaffoldなるものが良さそうなのでそれを使って開発してみる
また、以下記事にて構築した環境をベースに検証しているのでご承知おき
- kubernetesでローカル環境にNGINX, golang, MySQL環境作ってみる
- minikubeでTLS通信して裏側のNginxでHTTP/2.0を受ける
- KubernetesでGolangのPodにHttp/2を通信
Skaffold導入
設定ファイルを記載してSkaffold実行するとマニュフェストや、Dockerfile、Dockerfile内でcopyされてるバイナリファイルやソースファイルなどの変更を感知してデプロイしてくれる。
Skaffoldのインストール
$ brew install skaffold $ skaffold version v0.26.0
Skaffoldの設定
色々設定できるみたいだが、Dockerfileの場所と、対象のManifestを指定するだけにしておく
apiVersion: skaffold/v1beta7 kind: Config build: artifacts: - image: shintaro0123/nginx context: ./docker/nginx/ - image: shintaro0123/golang context: ./docker/go/ deploy: kubectl: manifests: - nginx-deployment.yaml - go-deployment.yaml
ちなみに、Deploymentにはこんな感じでtag:latestを指定しておく。
Skaffoldが再ビルドするとタグが付いてくるのでlatestにしときゃとりあえず見てくれる
spec: containers: - image: shintaro0123/golang:latest
コマンド実行
$ # このコマンドでwatchしてくれる
$ skaffold dev
開発、デプロイの流れを確認
Nginxの場合
アクセスしてみる
$ curl --resolve nginx.ucwork.local:443:`minikube ip` -k https://nginx.ucwork.local <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>sample page</title> </head> <body> <p>sample page1</p> </body> </html>%
DockerでADDされてるindex.htmlを修正
$ git diff diff --git a/docker/nginx/index.html b/docker/nginx/index.html index 5dc8292..afa1aa0 100644 --- a/docker/nginx/index.html +++ b/docker/nginx/index.html @@ -7,7 +7,7 @@ </head> <body> - <p>sample page1</p> + <p>sample page2</p> </body> </html> \ No newline at end of file $ $ skaffold dev # watchしてた奴が反応始めた!! Generating tags... - shintaro0123/nginx -> shintaro0123/nginx:n-1.0.5-5-g37e6f39-dirty Tags generated in 68.854557ms Starting build... Found [minikube] context, using local docker daemon. Building [shintaro0123/nginx]... Sending build context to Docker daemon 3.072kB Step 1/6 : FROM nginx:1.15.8
もう一回アクセス
sample page2になってる!!!数秒もかからんレベル
$ curl --resolve nginx.ucwork.local:443:`minikube ip` -k https://nginx.ucwork.local <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>sample page</title> </head> <body> <p>sample page2</p> </body> </html>%
Golangの場合
アクセスしてみる
$ curl --resolve go.ucwork.local:443:`minikube ip` -k https://go.ucwork.local url path is id: 1 name: taro id: 2 name: jiro id: 3 name: hanako
DockerでCOPYされてるmainを修正
$ git diff docker/go/main.go diff --git a/docker/go/main.go b/docker/go/main.go index 7aafdd1..2e16314 100644 --- a/docker/go/main.go +++ b/docker/go/main.go @@ -27,7 +27,7 @@ func main() { func handler(w http.ResponseWriter, r *http.Request) { /** URLパス表示 */ - w.Write([]byte("url path is " + r.URL.Path[1:] + "\n")) + w.Write([]byte("access url path is " + r.URL.Path[1:] + "\n")) /** DB接続 */ var dbConnectQuery string $ $ env GOOS=linux GOARCH=amd64 go build main.go $ $ skaffold dev # watchしてた奴が反応始めた!! Generating tags... - shintaro0123/golang -> shintaro0123/golang:n-1.0.5-5-g37e6f39-dirty Tags generated in 51.69ms Starting build... Found [minikube] context, using local docker daemon. Building [shintaro0123/golang]... Sending build context to Docker daemon 7.639MB Step 1/6 : FROM golang:1.11.5 ---> 1454e2b3d01f
もう一回アクセス
access urlになってる!!!
$ curl --resolve go.ucwork.local:443:`minikube ip` -k https://go.ucwork.local access url path is id: 1 name: taro id: 2 name: jiro id: 3 name: hanako
まとめ
docker-composeでホストとコンテナマウントできるんだからk8sもなんか手はあるでしょ。
&コンテナのビルドデプロイを自動化って時間かかっちゃうよなぁって疑心暗鬼だったけど、さすがgoogle先生全然爆速。
詳細までは理解できてないけどとりあえず編集とともにデプロイ自動化されたのでこれでいこう