LoginSignup
7
3

More than 5 years have passed since last update.

【Skaffold】Kubernetesネイティブなローカル開発環境を試す

Last updated at Posted at 2019-04-07

image.png

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は省略可)
image.png

Skaffoldインストール

$ brew install skaffold
$ skaffold version
v0.26.0

Skaffoldを利用するための事前準備

準備する必要があるのは下記。

  1. アプリケーションのソースコード (今回はmain.goのみ)
  2. Dockerfile
  3. Kubernetesマニフェスト
  4. Skaffold設定ファイル (skaffold.yaml)

最終的な構成

└── skaffold
    ├── Dockerfile
    ├── main.go
    ├── k8s-deployment.yaml
    └── k8s-service.yaml
    └── skaffold.yaml

1. アプリケーションソースコードの準備

Hello Skaffold!を返すだけのコードを使用

main.go
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を用意

k8s-deployment.yaml
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で公開しておく。

k8s-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: skaffold-service
spec:
  type: LoadBalancer
  selector:
    app: skaffold-sample
  ports:
  - port: 80
    targetPort: 8080

4. skaffold設定ファイル作成

skaffold.yaml
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を変更してみる

main.go
fmt.Fprintf(w, "Hello, kubernetes!")

開発モードでは、ソースコード変更を検知すると自動的にDockerイメージのビルドから処理が再実行されます(変更後にterminal見ると動いているのがわかります)

動作確認してみるとkubernetesに乗っているアプリケーションが差し代わっているのが分かります。

Hello, kubernetes!

所感

  • Kubernetesアプリケーションのローカル開発に非常に便利そう!
  • Helmと組み合わせればとても良い感じに使えそう!
  • Skaffoldに限った事ではないが、Kubernetes周辺のエコシステムはめちゃくちゃ活発でアップデートサイクルが早い(良い事ではある)ので、キャッチアップをしっかりせねばと感じた(ただ、これ系で躊躇してたら遅いと思われ)
  • 英語力大事…
7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3