Skaffoldとは
SkaffoldはKubernetesに乗せるアプリケーション開発作業を省力化してくれるコマンドラインツールで、Googleエンジニアの方々が中心となって開発されているOSS。
■Github
https://github.com/GoogleContainerTools/skaffold
Kubernetesに乗せるアプリケーションの開発では、下記1〜4を繰り返す事になり動作確認するのにも手間がかかる。
1.アプリケーションのコード編集
↓
2.コンテナイメージBuild
↓
3.コンテナレジストリへPush
↓
4.kubernetesへDeploy
SkaffoldのPiplineでは2〜4の作業を順次実行してくれる為、開発に集中することができそうです(※3は省略可)
Skaffoldインストール
$ brew install skaffold
$ skaffold version
v0.26.0
Skaffoldを利用するための事前準備
準備する必要があるのは下記。
- アプリケーションのソースコード (今回はmain.goのみ)
- Dockerfile
- Kubernetesマニフェスト
- Skaffold設定ファイル (skaffold.yaml)
最終的な構成
└── skaffold
├── Dockerfile
├── main.go
├── k8s-deployment.yaml
└── k8s-service.yaml
└── skaffold.yaml
1. アプリケーションソースコードの準備
Hello Skaffold!
を返すだけのコードを使用
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Skaffold!")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
2. Dockerfileの準備
マルチステージビルドを用いて、1段目でGolangアプリケーションをコンパイルして、2段目で軽量なイメージを用いてビルドを行い、コンパイルされたバイナリをコピーしています。
FROM golang:1.12-alpine3.9 as builder
COPY main.go .
RUN go build -o /go-app main.go
FROM alpine:3.9
EXPOSE 8080
COPY --from=builder /go-app .
ENTRYPOINT ["./go-app"]
3. Kubernetesマニフェストの準備
DeploymentとServiceを用意
apiVersion: apps/v1
kind: Deployment
metadata:
name: skaffold-deployment
spec:
selector:
matchLabels:
app: skaffold-sample
template:
metadata:
labels:
app: skaffold-sample
spec:
containers:
- name: skaffold-container
image: {DOCKERHUB-USERNAME}/skaffold-sample
ports:
- containerPort: 8080
あとでアクセスして確かめたいのでLoadBalancerで公開しておく。
apiVersion: v1
kind: Service
metadata:
name: skaffold-service
spec:
type: LoadBalancer
selector:
app: skaffold-sample
ports:
- port: 80
targetPort: 8080
4. skaffold設定ファイル作成
apiVersion: skaffold/v1beta7
kind: Config
build:
artifacts:
- image: {DOCKERHUB-USERNAME}/skaffold-sample
context: .
local:
push: false
deploy:
kubectl:
manifests:
- k8s-*
pushなしでkubernetesにデプロイできる為、ローカル開発でとても便利!
Dockerイメージホスティング
今回はDockerHubにホスティングしました(GCPでもどこでも構いません)
{DOCKERHUB-USERNAME}/skaffold-sample
というリポジトリを作成しておきましょう(docker loginを忘れずに)
実行
$ skaffold dev
ログを見るとイメージがビルドされ、リポジトリにPushされているのが分かります。
Watching for changes every 1s...
監視してくれている模様👀
curlでアクセスしてみると
Hello, Skaffold!
ソースコードを変更してみる
main.goを変更してみる
fmt.Fprintf(w, "Hello, kubernetes!")
開発モードでは、ソースコード変更を検知すると自動的にDockerイメージのビルドから処理が再実行されます(変更後にterminal見ると動いているのがわかります)
動作確認してみるとkubernetesに乗っているアプリケーションが差し代わっているのが分かります。
Hello, kubernetes!
所感
- Kubernetesアプリケーションのローカル開発に非常に便利そう!
- Helmと組み合わせればとても良い感じに使えそう!
- Skaffoldに限った事ではないが、Kubernetes周辺のエコシステムはめちゃくちゃ活発でアップデートサイクルが早い(良い事ではある)ので、キャッチアップをしっかりせねばと感じた(ただ、これ系で躊躇してたら遅いと思われ)
- 英語力大事…