keda는 결국 hpa를 핸들링하는 00이기 때문에 실제 스케일링 동작은 hpa가 관장하고 있어 scale down을 막아버리면 트리거를 통한 scale down 또한 동작하지 않는 것이다.
scale down 정책, stabilizationWindowSeconds 등 hpa 조정 값을 주어 어떻게든 우회하려고 해봤으나(외부 컨트롤러 OKG까지 붙여보려고 했음)
결국 현재 운영 환경에는 적용하기 어려운 부분이 많아 이에 대한 대안으로 크론잡으로 직접 scale command를 주기로 했다.
크론잡 설정은 간단히 이렇게 작성.
apiVersion: v1
kind: ServiceAccount
metadata:
name: gameserver-restart
namespace: dev
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: role-gameserver-restart
namespace: dev
rules:
- apiGroups: ["apps"]
resources: ["statefulsets", "statefulsets/scale"]
resourceNames: ["sts-dev-gameserver"]
verbs: ["get", "list", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: rolebinding-webgameserver-quiz-restart
namespace: stage
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: role-webgameserver-quiz-restart
subjects:
- kind: ServiceAccount
name: gameserver-restart
namespace: stage
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: "{{ .Values.env }}-{{ .Chart.Name }}-scale-in"
namespace: {{ .Values.env }}
spec:
timeZone: 'Asia/Seoul'
schedule: "00 00 * * *"
jobTemplate:
spec:
template:
spec:
serviceAccountName: gameserver-restart
containers:
- image: bitnami/kubectl:latest
name: gameserver-restart
command:
- /bin/sh
- -c
- "kubectl scale statefulset sts-{{ .Values.env }}-{{ .Chart.Name }} --replicas={{ .Values.statefulset.minReplicas }} -n stage"
securityContext:
runAsUser: 0
restartPolicy: Never