元営業WEBエンジニアのアプリ開発日記

営業出身のWEB系エンジニアが気になったものから作ってはメモを残してくブログ

Skaffoldでminikubeのローカル環境開発

概要

TLSでの通信も行うことができたのでローカルで開発していきたいが
docker-composeのvolumesみたいにMacとコンテナをマウントさせるすべがなさそう。

ざっと調べるとSkaffoldなるものが良さそうなのでそれを使って開発してみる
また、以下記事にて構築した環境をベースに検証しているのでご承知おき

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先生全然爆速。
詳細までは理解できてないけどとりあえず編集とともにデプロイ自動化されたのでこれでいこう