先日knativeを使って、ゼロスケールするAPIを作ったので備忘録です。
前提条件
- kubernetesのクラスターは構築済み
- istioはインストール済
- knativeのversionはv0.17を使用しています
手順
- knativeのインストール
- アプリケーションコードの実装
- Dockerfileの実装
- manifestの実装
- 動作確認
knativeのインストール
以下のURLの参照をお願いします(ここはそれぞれの環境による部分もあると思うので省略します)
https://knative.dev/v0.16-docs/install/any-kubernetes-cluster/
アプリケーションコードの実装
# main.goとしてディレクトリ内に保存する
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.POST("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"code": http.StatusOK,
"body": "OK",
})
})
r.Run()
}
Dockerfileの実装
FROM golang:1.13-alpine as builder
WORKDIR /opt/application
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -o app ./main.go
FROM alpine
COPY --from=builder /opt/application/app /usr/local/bin/app
EXPOSE 8080
Dockerfileをbuildして、repositoryにpushをする
manifestの実装
# knativeのservice
# service.yamlとして保存
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
name: application
namespace: anynamespace
spec:
template:
metadata:
annotations:
# see https://knative.dev/v0.15-docs/serving/configuring-autoscaling/
autoscaling.knative.dev/class: kpa.autoscaling.knative.dev
autoscaling.knative.dev/metric: concurrency
autoscaling.knative.dev/target: "1"
autoscaling.knative.dev/minScale: "0" # レプリカの最小値
autoscaling.knative.dev/maxScale: "1" # レプリカの最大値
autoscaling.knative.dev/window: "60s" # この期間にトラフィックがない場合スケールアウトする
spec:
containers:
- name: application
image: app # docker imageを保存したrepositoryのパスに変更
imagePullPolicy: Always
command:
- "/usr/local/bin/app"
# 作ったmanifestのapply
$ kubectl apply -f service.yaml
動作確認
# serviceがあることを確認
$ kubectl get ksvc
NAME URL LATESTCREATED LATESTREADY READY REASON
application http://application.xxxxxx application-pzxhm application-pzxhm True
$ CLUSTER_HOST=<CLUSTER_HOST>
curl $CLUSTER_HOST -H "Host: http://application.xxxxxx"
OK
このように表示されたら成功です