korean-docs
Wave Sizing
CRDs

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.0

Spec 필드

필드타입필수기본값설명
targetRefobjectYesn/a관리 대상 워크로드입니다.
targetRef.kindstringYesn/aDeployment, Rollout (Argo Rollouts), DeploymentConfig (OpenShift), DaemonSet, StatefulSet 중 하나입니다.
targetRef.namestringYesn/aCR과 같은 namespace에 있는 워크로드의 이름입니다.
applyModestring (enum)Nooffoff / in_place / manifest. "off"로 설정할 때는 반드시 따옴표로 감싸야 합니다 (따옴표 없는 off는 YAML 1.1에서 boolean으로 해석됩니다). Notes를 참고하세요.
aggressivebooleanNofalse7일 이상의 히스토그램 대신 최근 1시간의 사용량 데이터를 사용합니다. 추천 값의 안정성을 최신성과 맞바꿉니다. Aggressive Recommendations 참고.
containersmapNo{}컨테이너 이름을 키로 하는 컨테이너별 사이징 설정입니다. 아래 컨테이너 필드를 참고하세요. 생략하면 빈 map (컨테이너별 설정 없음)이 됩니다.
containers.<name>.enabledbooleanYesn/a이 컨테이너에 Smart Sizing이 활성화되어 있는지 여부입니다.
containers.<name>.applyAutobooleanYesn/a이 컨테이너를 automatic apply에 opt-in합니다. false이면 추천 값은 생성되지만 절대 적용되지 않습니다. 무언가가 자동으로 적용되려면 applyAutotrue이고 워크로드 단위의 applyModeoff가 아니어야 합니다.
containers.<name>.applyLimitCpubooleanNofalseauto-apply 시 CPU limit도 함께 적용합니다. auto-apply가 켜져 있으면 request는 항상 적용되며, limit은 명시적으로 활성화한 경우에만 적용됩니다.
containers.<name>.applyLimitMemorybooleanNofalseauto-apply 시 메모리 limit도 함께 적용합니다. auto-apply가 켜져 있으면 request는 항상 적용되며, limit은 명시적으로 활성화한 경우에만 적용됩니다. manifest 모드에서만 적용됩니다. in-place resize 경로는 메모리 limit을 바꾸지 않으므로, in_place에서는 이 플래그가 아무 효과가 없습니다.
containers.<name>.cpuEnabledbooleanNofalse이 컨테이너의 CPU 추천을 활성화합니다. 생략하면 이 컨테이너의 CPU 사이징이 비활성화됩니다.
containers.<name>.cpuMinnumberNon/aCPU request 하한(core 단위)입니다. 추천 값은 이 값 아래로 내려가지 않습니다.
containers.<name>.cpuMaxnumberNon/aCPU request 상한(core 단위)입니다. 추천 값은 이 값을 넘지 않습니다.
containers.<name>.cpuBufferPercentagenumberNo10min/max로 clamp되기 전에 관측된 CPU 사용량 위에 더해지는 안전 마진(%)입니다. 생략하면 10%가 됩니다.
containers.<name>.memoryEnabledbooleanNofalse이 컨테이너의 메모리 추천을 활성화합니다. 생략하면 이 컨테이너의 메모리 사이징이 비활성화됩니다.
containers.<name>.memoryMinnumberNon/a메모리 request 하한(MiB 단위, 콘솔에는 MB로 표시되지만 값은 동일한 수치)입니다.
containers.<name>.memoryMaxnumberNon/a메모리 request 상한(MiB 단위, 콘솔에는 MB로 표시되지만 값은 동일한 수치)입니다.
containers.<name>.memoryBufferPercentagenumberNo10min/max로 clamp되기 전에 관측된 메모리 사용량 위에 더해지는 안전 마진(%)입니다. 생략하면 10%가 됩니다.
⚠️

containers map은 병합이 아니라 전체 교체입니다. apply할 때마다 저장된 컨테이너별 설정은 CR이 선언한 내용으로 정확히 교체됩니다. map에서 빠진 컨테이너는 커스텀 설정을 잃습니다. 설정하려는 모든 컨테이너를 포함하세요.

Notes

  • namespace 단위: 대상 워크로드의 namespace에 CR을 생성하세요. targetRef.kindDeployment, 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 파서에서 boolean false로 해석되어 문자열 enum 검증에 실패합니다.
  • auto-apply가 동작하려면 두 스위치가 모두 켜져 있어야 합니다. 워크로드 단위의 applyMode와 컨테이너 단위의 applyAuto가 모두 활성화되어야 합니다. applyModeoff이면, applyAuto 값과 상관없이 어떤 컨테이너도 자동으로 적용되지 않습니다.
  • 버퍼 기본값은 10%입니다. cpuBufferPercentagememoryBufferPercentage를 생략하면 해당 리소스는 Wave가 10%를 기본값으로 사용합니다. 이는 Container Settings의 기본값과 동일합니다.
  • applyLimitCpuapplyLimitMemory는 기본적으로 off입니다. applyAutotrue이면 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.conditionsTargetNotFound를 보고하고, 워크로드가 나타나면 자동으로 재조정합니다. apply 순서는 상관없습니다.