kubectl scale statefulset my-sts --replicas=3
kubectl rollout status statefulset my-sts
기본 동작은 순차적이다. my-sts-0 이 Ready 가 된 뒤에 my-sts-1 이 만들어진다. 축소는 역순으로 높은 번호부터 지운다. 파드가 Ready 로 넘어가지 못하면 그 자리에서 멈추므로, 스케일이 진행되지 않을 때는 마지막 파드를 본다.
kubectl describe pod my-sts-2
volumeClaimTemplates 로 만들어진 PVC 는 축소해도 삭제되지 않는다. 다시 늘리면 같은 이름의 PVC 를 그대로 다시 쓴다. 데이터를 지키는 동작이지만, 쓰지 않는 PVC 가 쌓여 스토리지를 차지하기도 한다. 자동 정리가 필요하면 StatefulSet 의 persistentVolumeClaimRetentionPolicy 로 축소·삭제 시 동작을 정한다.
순차 기동이 필요 없는 워크로드는 병렬로 띄울 수 있다.
spec:
podManagementPolicy: Parallel
정족수를 다루는 제품(ZooKeeper · etcd · Kafka)에는 권하지 않는다. 구성원이 동시에 뜨면서 클러스터 구성이 꼬일 수 있다.
| 조건 | 설명 |
|---|---|
| metrics-server | 설치돼 있어야 한다. kubectl top pod 로 값이 나오는지 확인한다 |
resources.requests |
사용률 기준은 requests 대비로 계산한다. requests 가 없으면 그 메트릭은 평가되지 않는다 |
scale 서브리소스 |
Deployment · StatefulSet · ReplicaSet 은 있고 DaemonSet 에는 없다 |
kubectl top pod -n <네임스페이스>
kubectl get hpa
kubectl describe hpa my-hpa
describe 의 조건 항목에 왜 스케일이 일어나지 않는지가 적힌다.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: StatefulSet
name: app
minReplicas: 1
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleDown:
stabilizationWindowSeconds: 600
메트릭이 여러 개면 OR 로 동작한다. 각 메트릭마다 필요한 레플리카 수를 계산하고 그중 가장 큰 값을 택한다. "CPU 와 메모리가 모두 80% 를 넘을 때만" 같은 AND 조건은 표현할 수 없다.
평균값 기준이다. 파드 하나만 메모리를 많이 쓰는 상황은 평균을 크게 올리지 못해 스케일이 걸리지 않는다. Ready 가 아닌 파드는 계산에서 빠진다.
메모리 기준 축소는 거의 일어나지 않는다. JVM 이나 캐시를 쓰는 프로세스는 한 번 늘어난 메모리를 OS 에 잘 돌려주지 않아 사용률이 내려가지 않는다. 메모리로 스케일을 건다면 축소는 기대하지 않는 편이 낫고, 축소 안정화 창을 길게 잡아 요동을 막는다.
StatefulSet 에 HPA 를 거는 것 자체가 적절한지 본다. 정족수를 유지해야 하는 제품은 레플리카 수가 임의로 바뀌면 안 된다. Kafka 는 파티션 재배치가 필요하고, ZooKeeper 는 홀수 구성을 지켜야 한다. 이런 제품은 전용 오퍼레이터를 쓰거나 수동으로 늘린다.
API 서버가 그 종류를 모른다는 뜻이다. 대부분 apiVersion 오타다 — app/v1 이 아니라 apps/v1 이다.
kubectl api-resources | grep -i statefulset
kubectl config current-context
정상이면 statefulsets sts apps/v1 true StatefulSet 이 나온다. 아무것도 나오지 않으면 다른 클러스터를 보고 있거나 API 서버가 비정상인 경우다. StatefulSet 은 CRD 가 아니므로 따로 설치할 것이 없다.
volumeClaimTemplates 로 만들어지는 PVC.