skaffold を用いた Windows での Kubernetes 開発環境構築

# Skaffold とは
Google が開発した Kubernetes 向け開発支援ツールです。（[公式HP](https://skaffold.dev/)）
ソースコードの変更をトリガーにイメージのビルド及びプッシュ、デプロイを行うので、
開発環境にていちいちイメージのビルドやらデプロイやらを手動でやらなくて済みます。

更に開発言語が Go なので環境依存度が低く、Windows でも利用が可能です。

# 環境
* Windows 10 Pro
  - Docker for Windows を導入するためには Pro エディション以上が必要となります。

# 必須条件
下記のアプリケーションが必要となります。
導入方法は先人たちの知恵がたくさんありますのでここでは割愛します。

* Git
* Go
* Docker for Windows
  - Kubernetes を有効化する必要があります。
 
# Skaffold の導入
Skaffold は Go で書かれたプログラムなのでビルドしてPATHを通すだけです。簡単ですね。
以降のコマンドは powershell を「**管理者**」で起動させ発行してください。

```powershell
# 作業用ディレクトリの作成
mkdir C:\work

# Skaffold のビルド
cd C:\work
git clone https://github.com/GoogleCloudPlatform/skaffold
go build .\cmd\skaffold\skaffold.go
```
ビルドが終われば、カレントディレクトリに「skaffold.exe」が作成されます。
これにPATHを通します。

```powershell
# Skaffold コマンドを移動
mkdir C:\Skaffold
mv .\skaffold.exe C:\skaffold\

# 環境変数の設定
$SystemPath = [System.Environment]::GetEnvironmentVariable("Path", "Machine")
$SystemPath += ";C:\Skaffold"
[System.Environment]::SetEnvironmentVariable("Path", $SystemPath, "Machine")
```

以上でSkaffold の導入は完了です。

# Let's Try
導入したなら実際に触ってみましょう！
ありがたいことにサンプルが用意されているのでそれを利用します。
サンプルはさきほどクローンしたレポジトリの中にあります。

```powershell
cd C:\work\skaffold\examples\getting-started
```

## サンプルファイルの説明
* skaffold.yaml
  * Skaffold の設定ファイル  
    ここに記載された情報を基にビルド、プッシュ、デプロイを行います。

```skaffold.yaml
apiVersion: skaffold/v1
kind: Config
build:
  artifacts:
  - image: gcr.io/k8s-skaffold/skaffold-example
deploy:
  kubectl:
    manifests:
      - k8s-*
```
* apiVersion
    * おまじない（怒られそう
* kind
    * おまじない（怒られそう
* build - artifacts
    * プッシュする際のイメージ名称
* deploy - kubectl - manifests
    * デプロイする Kubernetes のマニフェスト  
      ビルド終了後、ここで指定したマニフェストが apply されます。  
      この例では「k8s-」で始まるマニフェストファイルが全て対象となります。

## 実際に動かしてみよう
実際にサンプルを利用して skaffold の動作を確認してみましょう。

```powershell
# サンプル用ディレクトリへ移動
cd C:\work\skaffold\examples\getting-started

# 開発モードで起動
skaffold.exe dev
```

開発モードで起動すると下記のような表示になり、podが起動し変更を待ち受けた状態になります。

```
 - pod/getting-started created
[33mWatching for changes...[0m
[91m[getting-started] [0mHello world!
```

この状態で main.go を書き換えてみましょう。
試しに「Hello world!」を「Hello Skaffold world!」に変更してみました！

```
[91m[getting-started] [0mHello world!
[91m[getting-started] [0mHello world!
[91m[getting-started] [0mHello world!
[34mGenerating tags...[0m
[34m - gcr.io/k8s-skaffold/skaffold-example -> [0mgcr.io/k8s-skaffold/skaffold-example:v1.0.0-143-g3f2a7ae2-dirty
[34mChecking cache...[0m
[34m - gcr.io/k8s-skaffold/skaffold-example: [0m[33mNot found. Building[0m
[34mFound [docker-desktop] context, using local docker daemon.
[0m[34mBuilding [gcr.io/k8s-skaffold/skaffold-example]...
[0mSending build context to Docker daemon  3.072kB
Step 1/6 : FROM golang:1.12.9-alpine3.10 as builder
 ---> e0d646523991
Step 2/6 : COPY main.go .
 ---> 8aaae19f0631
Step 3/6 : RUN go build -o /app main.go
 ---> Running in 021cefa024cb
 ---> 144dbc0b32f7
Step 4/6 : FROM alpine:3.10
 ---> 965ea09ff2eb
Step 5/6 : CMD ["./app"]
 ---> Using cache
 ---> d4a076e9ef1b
Step 6/6 : COPY --from=builder /app .
 ---> df3ff8885e21
Successfully built df3ff8885e21
Successfully tagged gcr.io/k8s-skaffold/skaffold-example:v1.0.0-143-g3f2a7ae2-dirty
[34mTags used in deployment:[0m
[34m - gcr.io/k8s-skaffold/skaffold-example -> [0mgcr.io/k8s-skaffold/skaffold-example:df3ff8885e21c3152744f85d88c1f19e1cc80746d552949c14afaada225e63e1
[32m   local images can't be referenced by digest. They are tagged and referenced by a unique ID instead[0m
[34mStarting deploy...[0m
 - pod/getting-started configured
[33mWatching for changes...[0m
[91m[getting-started] [0mHello Skaffold world!
[91m[getting-started] [0mHello Skaffold world!
[91m[getting-started] [0mHello Skaffold world!
```
おぉ、すげぇ。
変更をトリガーにビルド、プッシュ、デプロイが走り、
見事に出力内容が変更されました。
こんな感じでファイルを変更するだけで kubernetes の環境に反映されるので作業が非常に楽になりますね！

# お掃除
お掃除がさらに楽！
Ctrl + C を押す！それだけ！！

```
[34mCleaning up...[0m
 - pod "getting-started" deleted
```
はい、Podが消えました！いやー、楽。とにかく楽。

# まとめ
Skaffold を使ってみよう的な記事はよくみましたが、Windowsで使ってみました、という
記事がなかったのでまとめてみました。
他のOSでもやることは落としたビルドしてパス通してどーーん！です。

skaffold.yaml の設定もあくまでサンプル利用なので非常に簡単ですが、
当然もっと設定項目はありますので実際に使ってみてどんどん調整して、
最高な開発環境を準備しちゃいましょう！

それではみなさまも素敵な Kubernetes Life を！！