こんにちは開発研究チームのhoでございます。
最近Microservice研究を行っております。
本日はkind + Istio + Skaffold を用いてローカル開発を行う環境作りの例をご紹介させていただきたいと思います。
まず四つのツールが必要でございます。
kind
とkubectl
とistioctl
とskaffold
を各platformに合わせて以下のサイトを参考にご用意をお願いいたします。
- kind: https://kind.sigs.k8s.io/docs/user/quick-start/
- kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/
- istioctl: https://istio.io/docs/setup/getting-started/
- skaffold: https://skaffold.dev/docs/install/
MacOSの場合Docker for desktopの設定をメモリー8GB以上割り当てをお願いいたします。
今回使うsampleは以下のファイルで構成されます。
1 2 3 4 5 6 7 |
~/Work/sample$ tree . . ├── Dockerfile ├── README.md ├── k8s-pod.yaml ├── main.go └── skaffold.yaml |
main.goです。
1秒間隔で”Hello world!”を出力し続けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package main import ( "fmt" "time" ) func main() { for { fmt.Println("Hello world!") time.Sleep(time.Second * 1) } } |
Dockerfileです。buildしてimageを作ります。
1 2 3 4 5 6 7 |
FROM golang:1.12.9-alpine3.10 as builder COPY main.go . RUN go build -o /app main.go FROM alpine:3.10 CMD ["./app"] COPY --from=builder /app . |
Kubernetes podはk8s-pod.yamlで定義しています。
上記sample imageでpodを作ります。
1 2 3 4 5 6 7 8 |
apiVersion: v1 kind: Pod metadata: name: sample-pod spec: containers: - name: sample image: sample |
skaffoldのmanifestであるskaffold.yamlです。
上記のimageを自動的buildしてclusterにdeployします。
1 2 3 4 5 6 7 8 9 |
apiVersion: skaffold/v2beta4 kind: Config build: artifacts: - image: sample deploy: kubectl: manifests: - k8s-* |
これでソースコードの準備はできました。
以下の手順で試してみます。
clusterを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
~/Work/sample$ kind create cluster Creating cluster "kind" ... • Ensuring node image (kindest/node:v1.18.2) 🖼 ... ✓ Ensuring node image (kindest/node:v1.18.2) 🖼 • Preparing nodes 📦 ... ✓ Preparing nodes 📦 • Writing configuration 📜 ... ✓ Writing configuration 📜 • Starting control-plane 🕹️ ... ✓ Starting control-plane 🕹️ • Installing CNI 🔌 ... ✓ Installing CNI 🔌 • Installing StorageClass 💾 ... ✓ Installing StorageClass 💾 Set kubectl context to "kind-kind" You can now use your cluster with: kubectl cluster-info --context kind-kind Not sure what to do next? 😅 Check out https://kind.sigs.k8s.io/docs/user/quick-start/ |
istioをinstallします。
1 2 3 4 5 6 7 8 |
~/Work/sample$ ~/bin/istioctl manifest apply This will install the default Istio profile into the cluster. Proceed? (y/N) y Detected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details. ✔ Istio core installed ✔ Istiod installed ✔ Ingress gateways installed ✔ Addons installed ✔ Installation complete |
istioのenvoy sidecarの自動挿入をenableします。
1 2 |
~/Work/sample$ kubectl label namespace default istio-injection=enabled namespace/default labeled |
skaffold dev 実行してbuildとdeployします。deploymentが安定したらファイルのchangeを待っている状態になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
~/Work/sample$ skaffold dev Listing files to watch... - sample Generating tags... - sample -> sample:latest Some taggers failed. Rerun with -vdebug for errors. Checking cache... - sample: Found. Tagging Tags used in deployment: - sample -> sample:308c4d3328d3a659a5412e098497bd5a443a6c7101c4148f4da9a83fc1a97078 Loading images into kind cluster nodes... - sample:308c4d3328d3a659a5412e098497bd5a443a6c7101c4148f4da9a83fc1a97078 -> Loaded Images loaded in 1.020694s Starting deploy... - pod/sample-pod created Waiting for deployments to stabilize... Deployments stabilized in 9.5081ms Press Ctrl+C to exit Watching for changes... [sample-pod istio-init] Environment: [sample-pod istio-init] ------------ .... [sample-pod sample] Hello world! [sample-pod sample] Hello world! [sample-pod sample] Hello world! [sample-pod sample] Hello world! |
画面にhello worldが繰り返して表示されています。
main.goのhello worldをhello world2へ直して格納すると
以下のように検知され自動的に再buildして再deployされます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
Generating tags... - sample -> sample:latest Some taggers failed. Rerun with -vdebug for errors. Checking cache... - sample: Not found. Building Found [kind-kind] context, using local docker daemon. Building [sample]... Sending 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 . ---> 9f5546f19ff0 Step 3/6 : RUN go build -o /app main.go ---> Running in 399796198fba ---> 1e93bd642749 Step 4/6 : FROM alpine:3.10 ---> be4e4bea2c2e Step 5/6 : CMD ["./app"] ---> Using cache ---> f5c3113e61dc Step 6/6 : COPY --from=builder /app . ---> 53c742ebc82b Successfully built 53c742ebc82b Successfully tagged sample:latest Tags used in deployment: - sample -> sample:53c742ebc82bde0abb6dc483e254cfe542d7ddb00201e817add0d43b84b6eb6a Loading images into kind cluster nodes... - sample:53c742ebc82bde0abb6dc483e254cfe542d7ddb00201e817add0d43b84b6eb6a -> Loaded Images loaded in 859.3422ms Starting deploy... - pod/sample-pod configured Waiting for deployments to stabilize... Deployments stabilized in 3.4679ms Watching for changes... [sample-pod sample] Hello world2! [sample-pod sample] Hello world2! [sample-pod sample] Hello world2! [sample-pod sample] Hello world2! [sample-pod sample] Hello world2! |
ctrl + cで中止します。
1 2 |
C-c Cleaning up... - pod "sample-pod" deleted |
clusterを削除します。
1 2 |
~/Work/sample$ kind delete cluster Deleting cluster "kind" ... |
まとめ
- kindを用いて軽量のkubernetes clusterをローカルに作成することはできました。
- Istioをinstallしてservice meshを構築することができました。
- sampleコードをskaffoldを用いてdeployすることができました。
- ソースコードを修正すると自動deployできることを確認いたしました。
kindを使うことによりローカル開発構築がはるかに簡単になりました。まだ使ったことがないならぜひ一度試してみてはいかがでしょうか?