Wave Sizing CRDs
이 종류는 CRD Mode에서 Smart Sizing을 설정합니다. 컨테이너별 범위와 버퍼의 의미는 Container Settings를, auto-apply 모드와 사전 요구사항은 Realtime Resizing을 참고하세요.
WaveSmartSizingPolicy
WaveSmartSizingPolicy는 워크로드 하나에 대한 Smart Sizing 범위와 auto-apply 동작을 선언합니다: 컨테이너별 CPU/메모리 하한, 상한, 안전 버퍼, 그리고 Wave가 추천 값을 자동으로 적용할지, 어떤 apply mode로 적용할지를 정합니다.
범위: namespace 단위이며, 대상 워크로드와 같은 namespace에 생성해야 합니다.
apiVersion: wavek8s.com/v1alpha1
kind: WaveSmartSizingPolicy
metadata:
name: checkout-api-sizing
namespace: payment
spec:
targetRef:
kind: Deployment
name: checkout-api
# off = recommendations are computed but never auto-applied (default when omitted)
# in_place = apply via the Kubernetes /resize subresource (no pod restart)
# manifest = patch the workload spec (rollout-managed)
applyMode: in_place
# aggressive = use the last 1 hour of data instead of the 7+ day histogram
aggressive: false
containers:
app:
enabled: true
applyAuto: true # opt this container into automatic apply
applyLimitCpu: false # keep the CPU limit where you set it (default)
applyLimitMemory: false # keep the memory limit where you set it (default)
cpuEnabled: true
cpuMin: 0.1 # floor in CPU cores
cpuMax: 2.0 # ceiling in CPU cores
cpuBufferPercentage: 15.0 # safety margin (%) added on top of observed usage
memoryEnabled: true
memoryMin: 256.0 # floor in MiB
memoryMax: 4096.0 # ceiling in MiB
memoryBufferPercentage: 20.0
sidecar:
enabled: true
applyAuto: false # observe only for this container
cpuEnabled: true
cpuMin: 0.1
cpuMax: 0.5
cpuBufferPercentage: 10.0
memoryEnabled: true
memoryMin: 64.0
memoryMax: 512.0
memoryBufferPercentage: 10.0Spec 필드
| 필드 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
targetRef | object | Yes | n/a | 관리 대상 워크로드입니다. |
targetRef.kind | string | Yes | n/a | Deployment, Rollout (Argo Rollouts), DeploymentConfig (OpenShift), DaemonSet, StatefulSet 중 하나입니다. |
targetRef.name | string | Yes | n/a | CR과 같은 namespace에 있는 워크로드의 이름입니다. |
applyMode | string (enum) | No | off | off / in_place / manifest. "off"로 설정할 때는 반드시 따옴표로 감싸야 합니다 (따옴표 없는 off는 YAML 1.1에서 boolean으로 해석됩니다). Notes를 참고하세요. |
aggressive | boolean | No | false | 7일 이상의 히스토그램 대신 최근 1시간의 사용량 데이터를 사용합니다. 추천 값의 안정성을 최신성과 맞바꿉니다. Aggressive Recommendations 참고. |
containers | map | No | {} | 컨테이너 이름을 키로 하는 컨테이너별 사이징 설정입니다. 아래 컨테이너 필드를 참고하세요. 생략하면 빈 map (컨테이너별 설정 없음)이 됩니다. |
containers.<name>.enabled | boolean | Yes | n/a | 이 컨테이너에 Smart Sizing이 활성화되어 있는지 여부입니다. |
containers.<name>.applyAuto | boolean | Yes | n/a | 이 컨테이너를 automatic apply에 opt-in합니다. false이면 추천 값은 생성되지만 절대 적용되지 않습니다. 무언가가 자동으로 적용되려면 applyAuto가 true이고 워크로드 단위의 applyMode가 off가 아니어야 합니다. |
containers.<name>.applyLimitCpu | boolean | No | false | auto-apply 시 CPU limit도 함께 적용합니다. auto-apply가 켜져 있으면 request는 항상 적용되며, limit은 명시적으로 활성화한 경우에만 적용됩니다. |
containers.<name>.applyLimitMemory | boolean | No | false | auto-apply 시 메모리 limit도 함께 적용합니다. auto-apply가 켜져 있으면 request는 항상 적용되며, limit은 명시적으로 활성화한 경우에만 적용됩니다. manifest 모드에서만 적용됩니다. in-place resize 경로는 메모리 limit을 바꾸지 않으므로, in_place에서는 이 플래그가 아무 효과가 없습니다. |
containers.<name>.cpuEnabled | boolean | No | false | 이 컨테이너의 CPU 추천을 활성화합니다. 생략하면 이 컨테이너의 CPU 사이징이 비활성화됩니다. |
containers.<name>.cpuMin | number | No | n/a | CPU request 하한(core 단위)입니다. 추천 값은 이 값 아래로 내려가지 않습니다. |
containers.<name>.cpuMax | number | No | n/a | CPU request 상한(core 단위)입니다. 추천 값은 이 값을 넘지 않습니다. |
containers.<name>.cpuBufferPercentage | number | No | 10 | min/max로 clamp되기 전에 관측된 CPU 사용량 위에 더해지는 안전 마진(%)입니다. 생략하면 10%가 됩니다. |
containers.<name>.memoryEnabled | boolean | No | false | 이 컨테이너의 메모리 추천을 활성화합니다. 생략하면 이 컨테이너의 메모리 사이징이 비활성화됩니다. |
containers.<name>.memoryMin | number | No | n/a | 메모리 request 하한(MiB 단위, 콘솔에는 MB로 표시되지만 값은 동일한 수치)입니다. |
containers.<name>.memoryMax | number | No | n/a | 메모리 request 상한(MiB 단위, 콘솔에는 MB로 표시되지만 값은 동일한 수치)입니다. |
containers.<name>.memoryBufferPercentage | number | No | 10 | min/max로 clamp되기 전에 관측된 메모리 사용량 위에 더해지는 안전 마진(%)입니다. 생략하면 10%가 됩니다. |
⚠️
containers map은 병합이 아니라 전체 교체입니다. apply할 때마다 저장된 컨테이너별 설정은 CR이 선언한 내용으로 정확히 교체됩니다. map에서 빠진 컨테이너는 커스텀 설정을 잃습니다. 설정하려는 모든 컨테이너를 포함하세요.
Notes
- namespace 단위: 대상 워크로드의 namespace에 CR을 생성하세요.
targetRef.kind는Deployment,Rollout(Argo Rollouts),DeploymentConfig(OpenShift),DaemonSet,StatefulSet중 하나여야 합니다. applyMode값은 snake_case입니다:in_place/manifest/off. 필드를 생략하면off와 동일하게 동작합니다. 추천 값은 계산되지만 명시적으로 opt-in하지 않으면 아무것도 자동으로 적용되지 않습니다. 이는 Realtime Resizing에서 설명하는 세 가지 모드에 대응합니다. YAML에서"off"를 쓸 때는 반드시 따옴표로 감싸세요. 따옴표 없는off는 (kubectl을 포함한) YAML 1.1 파서에서 booleanfalse로 해석되어 문자열 enum 검증에 실패합니다.- auto-apply가 동작하려면 두 스위치가 모두 켜져 있어야 합니다. 워크로드 단위의
applyMode와 컨테이너 단위의applyAuto가 모두 활성화되어야 합니다.applyMode가off이면,applyAuto값과 상관없이 어떤 컨테이너도 자동으로 적용되지 않습니다. - 버퍼 기본값은 10%입니다.
cpuBufferPercentage나memoryBufferPercentage를 생략하면 해당 리소스는 Wave가 10%를 기본값으로 사용합니다. 이는 Container Settings의 기본값과 동일합니다. applyLimitCpu와applyLimitMemory는 기본적으로 off입니다.applyAuto가true이면 request는 항상 적용됩니다. limit은 이 플래그를 명시적으로 활성화한 경우에만 적용됩니다. 메모리 limit을 자동으로 낮추는 것은 사이징에서 가장 위험한 동작이므로 (예상치 못한 스파이크 → OOMKill), Wave는 명시적인 opt-in을 요구합니다. 메모리 limit은manifest모드에서만 적용됩니다. in-place resize 경로는 메모리 limit을 바꾸지 않으므로in_place에서는applyLimitMemory가 아무 효과가 없습니다.- 시스템 안전장치가 사용자 범위보다 우선합니다.
cpuMin/memoryMin과 무관하게, 추천 값은 0.1 CPU core (aggressive: true일 때는 0.01 core) 또는 12 MiB 컨테이너 런타임 메모리 최소값 아래로 내려가지 않으며,limit ≥ request가 항상 강제됩니다. 안전장치를 참고하세요. TargetNotFound는 자체적으로 해소됩니다. 대상 워크로드가 아직 존재하지 않는 CR도kubectl apply시점에는 성공합니다. Wave는.status.conditions에TargetNotFound를 보고하고, 워크로드가 나타나면 자동으로 재조정합니다. apply 순서는 상관없습니다.