$ kubectl apply -f https://github.com/kedacore/keda/releases/download/v2.0.0/keda-2.0.0.yaml
namespace/keda created
customresourcedefinition.apiextensions.k8s.io/scaledjobs.keda.sh created
customresourcedefinition.apiextensions.k8s.io/scaledobjects.keda.sh created
customresourcedefinition.apiextensions.k8s.io/triggerauthentications.keda.sh created
serviceaccount/keda-operator created
clusterrole.rbac.authorization.k8s.io/keda-external-metrics-reader created
clusterrole.rbac.authorization.k8s.io/keda-operator created
rolebinding.rbac.authorization.k8s.io/keda-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/keda-hpa-controller-external-metrics created
clusterrolebinding.rbac.authorization.k8s.io/keda-operator created
clusterrolebinding.rbac.authorization.k8s.io/keda:system:auth-delegator created
service/keda-metrics-apiserver created
deployment.apps/keda-metrics-apiserver created
deployment.apps/keda-operator created
apiservice.apiregistration.k8s.io/v1beta1.external.metrics.k8s.io created
Namespace や Deployment など KEDA のリソースが作成されている.
$ kubectl get all -n keda
NAME READY STATUS RESTARTS AGE
pod/keda-metrics-apiserver-5bffbfbd68-ftg6q 1/1 Running 0 3m12s
pod/keda-operator-7b98595dc7-b4rnb 1/1 Running 0 3m12s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/keda-metrics-apiserver ClusterIP 10.97.130.94<none>443/TCP,80/TCP 3m12s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/keda-metrics-apiserver 1/111 3m12s
deployment.apps/keda-operator 1/111 3m12s
NAME DESIRED CURRENT READY AGE
replicaset.apps/keda-metrics-apiserver-5bffbfbd68 111 3m12s
replicaset.apps/keda-operator-7b98595dc7 111 3m12s
イベント駆動スケールを試す
せっかくなので KEDA v2から追加された Metrics API を試してみる
今回は自分で定義したAPIから Metrics を取得する.
$ make deploy-app
or
$ kubectl apply -f ./deploy/demo/app/
namespace/demo created
service/components-mock created
deployment.apps/components-mock created
deployment.apps/nginx created
$ kubectl get all -n demo
NAME READY STATUS RESTARTS AGE
pod/components-mock-6b58c499dd-x6bf7 1/1 Running 0 95s
pod/nginx-6799fc88d8-p9jp5 1/1 Running 0 95s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/components-mock ClusterIP 10.99.64.141<none>3003/TCP 95s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/components-mock 1/111 95s
deployment.apps/nginx 1/111 95s
NAME DESIRED CURRENT READY AGE
replicaset.apps/components-mock-6b58c499dd 111 95s
replicaset.apps/nginx-6799fc88d8 111 95s
$ kubectl get po -n demo -w
NAME READY STATUS RESTARTS AGE
components-mock-6d66575d55-r8vxh 1/1 Running 0 2m17s
nginx-6799fc88d8-22q9l 1/1 Running 0 4m11s
nginx-6799fc88d8-95r6v 1/1 Running 0 2m4s
nginx-6799fc88d8-jkdqw 1/1 Running 0 2m4s
nginx-6799fc88d8-wkmq4 1/1 Running 0 2m4s
nginx-6799fc88d8-xvctr 1/1 Running 0 109s
まとめ
KEDA v2を触ってみたが, v1との使い勝手に大きな差はなかった.
しかし, 今回のバージョンアップで CPU と メモリ が追加により, Kubernetes Horizontal Pod Autoscaler と共存する形でなく, 自動スケーリング のリソースは全て KEDA に統一することで シンプル性を担保できる.
また, Metrics API を利用すれば, APIが提供されているサービスをトリガーにすることが容易であったり, SQLクエリに基づいてワークフローを自動スケーリングも可能になるので拡張性の高い環境構築に活かせると感じた.
$docker run --name remote-sample -d-p 8080:80 nginx
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c164ead158ca nginx "/docker-entrypoint.…"15 seconds ago Up 13 seconds 0.0.0.0:8080->80/tcp remote-sample
$ export GITHUB_TOKEN=<your-token>
$ export GITHUB_USER=<your-username>
$ export GITHUB_REPO=<repository-name>
$ flux bootstrap github \--owner=${GITHUB_USER}\--repository=${GITHUB_REPO}\--branch=main\--personal\--path=clusters/staging
► connecting to github.com
✔ repository cloned
✚ generating manifests
✔ components are up to date
► installing components in flux-system namespace
namespace/flux-system created
networkpolicy.networking.k8s.io/allow-scraping created
networkpolicy.networking.k8s.io/allow-webhooks created
networkpolicy.networking.k8s.io/deny-ingress created
role.rbac.authorization.k8s.io/crd-controller-flux-system created
rolebinding.rbac.authorization.k8s.io/crd-controller-flux-system created
clusterrolebinding.rbac.authorization.k8s.io/cluster-reconciler-flux-system created
customresourcedefinition.apiextensions.k8s.io/buckets.source.toolkit.fluxcd.io created
customresourcedefinition.apiextensions.k8s.io/gitrepositories.source.toolkit.fluxcd.io created
customresourcedefinition.apiextensions.k8s.io/helmcharts.source.toolkit.fluxcd.io created
customresourcedefinition.apiextensions.k8s.io/helmrepositories.source.toolkit.fluxcd.io created
service/source-controller created
deployment.apps/source-controller created
customresourcedefinition.apiextensions.k8s.io/kustomizations.kustomize.toolkit.fluxcd.io created
deployment.apps/kustomize-controller created
customresourcedefinition.apiextensions.k8s.io/helmreleases.helm.toolkit.fluxcd.io created
deployment.apps/helm-controller created
customresourcedefinition.apiextensions.k8s.io/alerts.notification.toolkit.fluxcd.io created
customresourcedefinition.apiextensions.k8s.io/providers.notification.toolkit.fluxcd.io created
customresourcedefinition.apiextensions.k8s.io/receivers.notification.toolkit.fluxcd.io created
service/notification-controller created
service/webhook-receiver created
deployment.apps/notification-controller created
Waiting for deployment "source-controller" rollout to finish: 0 of 1 updated replicas are available...
deployment "source-controller" successfully rolled out
Waiting for deployment "kustomize-controller" rollout to finish: 0 of 1 updated replicas are available...
deployment "kustomize-controller" successfully rolled out
deployment "helm-controller" successfully rolled out
Waiting for deployment "notification-controller" rollout to finish: 0 of 1 updated replicas are available...
deployment "notification-controller" successfully rolled out
✔ install completed
► configuring deploy key
✔ deploy key configured
► generating sync manifests
✔ sync manifests pushed
► applying sync manifests
◎ waiting for cluster sync
✔ bootstrap finished
$ kubectl get all -n flux-system
NAME READY STATUS RESTARTS AGE
pod/helm-controller-7fc55767cc-bfzck 1/1 Running 0 4m51s
pod/kustomize-controller-6b85bf79f9-t6qs4 1/1 Running 0 4m51s
pod/notification-controller-7bb8667967-6xqdb 1/1 Running 0 4m48s
pod/source-controller-6cdb6c8889-hpsxx 1/1 Running 0 4m53s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/notification-controller ClusterIP 10.108.140.72<none>80/TCP 4m50s
service/source-controller ClusterIP 10.104.224.8<none>80/TCP 4m53s
service/webhook-receiver ClusterIP 10.103.160.216<none>80/TCP 4m48s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/helm-controller 1/111 4m51s
deployment.apps/kustomize-controller 1/111 4m53s
deployment.apps/notification-controller 1/111 4m48s
deployment.apps/source-controller 1/111 4m53s
NAME DESIRED CURRENT READY AGE
replicaset.apps/helm-controller-7fc55767cc 111 4m51s
replicaset.apps/kustomize-controller-6b85bf79f9 111 4m52s
replicaset.apps/notification-controller-7bb8667967 111 4m48s
replicaset.apps/source-controller-6cdb6c8889 111 4m53s
社内で新しいチームにをサポートしていくことになりました。
チームリーダーの方やマネージャーと「1 on 1」を実施して、抱えている問題や
自分が協力できそうなことを話し合い、7月から本格的にサポートしていくことになりましたが、自戒の念を込めてサポート時に心掛けようとすることをいくつかまとめておこうと思います。