korean-docs
Wave Flow
CRDs

Wave Flow CRD

이 종류들은 CRD Mode에서 Wave Flow를 설정합니다. 우선순위 기반 트래픽 보호에는 WaveFlowPolicy를, NetFunnel 연동에는 WaveNetfunnelMappingWaveNetfunnelConnection을 사용합니다.

WaveFlowPolicy

WaveFlowPolicy는 들어오는 트래픽의 우선순위 클래스와 클래스별 트래픽 보호 동작을 정의합니다. namespace와 name으로 하나 이상의 워크로드를 대상으로 지정하며, 부하가 발생하면 Wave가 클래스별로 설정된 차단 전략을 적용합니다.

범위: 클러스터 범위(cluster-scoped)이며 metadata.namespace가 필요하지 않습니다.

apiVersion: wavek8s.com/v1alpha1
kind: WaveFlowPolicy
metadata:
  name: checkout-priority-policy
spec:
  description: Priority policy for the checkout service.
  enabled: true
  priorityClasses:
    - name: CRITICAL
      shed: disabled  # never shed — revenue-critical traffic must always pass
      concurrencyLimit: 200
      matchRules:
        - headers:
            - name: x-tier
              value: premium
          paths:
            - prefix: /api/v1/checkout
          methods:
            - POST
            - PUT
    - name: IMPORTANT
      shed: auto
      matchRules:
        - headers:
            - name: x-tier
              value: standard
    - name: MODERATE
      shed: auto
    - name: BULK
      shed: force  # force = always reject — emergency block
  targets:
    - namespace: payment
      name: checkout-api

Spec 필드

필드타입필수 여부기본값설명
descriptionstring아니오-이 정책에 대한 설명 (선택 사항).
enabledboolean아니오true정책의 활성화 여부. false로 설정하면 CR을 삭제하지 않고도 적용을 중지할 수 있습니다.
priorityClassesarray아니오[]우선순위 클래스 설정 목록. 순서대로 평가됩니다.
priorityClasses[].namestring예 (항목별)-우선순위 클래스 이름. 권장 값: CRITICAL, IMPORTANT, MODERATE, BULK.
priorityClasses[].shedstring (enum)아니오disabled차단 전략입니다. disabled는 이 클래스를 절대 차단하지 않고, auto는 Wave가 부하에 따라 판단하며, force는 부하와 무관하게 이 클래스의 요청 100%를 항상 거부합니다 (긴급 차단).
priorityClasses[].shedBoolboolean아니오-차단 여부를 boolean으로 재정의하는 선택 필드. 설정된 경우 우선 적용됩니다.
priorityClasses[].concurrencyLimitinteger아니오-이 클래스에 허용되는 최대 동시 요청 수.
priorityClasses[].matchRulesarray아니오-요청을 이 클래스와 매치하는 규칙. 규칙은 OR 로직으로 평가되며, 하나라도 매치하면 해당 요청이 매치된 것으로 처리됩니다.
priorityClasses[].matchRules[].headersarray아니오[]매치할 HTTP 헤더 목록. 배열 내 모든 항목이 매치해야 합니다 (AND 로직).
priorityClasses[].matchRules[].headers[].namestring예 (항목별)-HTTP 헤더 이름.
priorityClasses[].matchRules[].headers[].valuestring예 (항목별)-매치 대상 값.
priorityClasses[].matchRules[].pathsarray아니오[]매치할 HTTP 경로 prefix 목록. 모든 항목이 매치해야 합니다 (AND 로직).
priorityClasses[].matchRules[].paths[].prefixstring예 (항목별)-매치할 경로 prefix (예: /api/v1/).
priorityClasses[].matchRules[].methodsarray아니오[]매치할 HTTP 메서드 목록 (예: GET, POST). 요청의 메서드가 목록 중 하나와 일치하면 매치됩니다 (OR 로직).
targetsarray아니오[]이 정책이 적용되는 워크로드 목록. 각 항목은 namespace + name으로 식별됩니다.
targets[].namespacestring예 (항목별)-대상 워크로드의 namespace.
targets[].namestring예 (항목별)-대상 워크로드의 이름.

참고 사항

  • 클러스터 범위(cluster-scoped)입니다. WaveFlowPolicy 하나로 targets[].namespace를 통해 여러 namespace의 워크로드를 대상으로 지정할 수 있습니다.
  • priorityClasses의 기본값은 빈 목록입니다. 클래스가 없는 정책도 유효하지만 아무것도 적용하지 않습니다.
  • matchRule 내에서는 headerspaths 항목이 모두 매치해야 합니다 (AND 로직). methods는 나열된 값 중 하나라도 일치하면 매치됩니다 (OR 로직이며, 요청은 정확히 하나의 HTTP 메서드를 가집니다). 하나의 priorityClasses 항목 안에 여러 matchRules가 있으면 OR 로직으로 평가되어, 하나라도 완전히 매치하면 해당 클래스와 매치됩니다.
  • 아직 존재하지 않는 대상 워크로드를 지정해도 kubectl apply는 성공합니다. Wave는 .status.conditionsTargetNotFound를 보고하며, 워크로드가 나타나면 자동으로 reconcile합니다.
  • Pruning(CR에서 target이나 class를 제거하는 작업)은 하드 삭제입니다. 현재 CR에 없는 항목은 다음 reconcile 시 완전히 제거되며, 비활성화 처리되지 않습니다.

WaveNetfunnelMapping

WaveNetfunnelMapping은 워크로드를 NetFunnel 프로젝트/세그먼트 규칙에 바인딩합니다. 이를 통해 Wave는 지정한 워크로드에 대한 트래픽 제어 신호를 NetFunnel 서비스로 전달할 수 있으며, 워크로드를 하나 이상의 NetFunnel 프로젝트-세그먼트 쌍에 매핑할 수도 있습니다.

범위: namespace 범위(namespaced)이며, 대상 워크로드와 같은 namespace에 생성해야 합니다.

apiVersion: wavek8s.com/v1alpha1
kind: WaveNetfunnelMapping
metadata:
  name: checkout-nf-mapping
  namespace: payment
spec:
  targetRef:
    kind: Deployment
    name: checkout-api
  nfMapping:
    - nfProjectId: nf-project-001
      nfSegmentId: nf-segment-001
      isSection: true
    - nfProjectId: nf-project-001
      nfSegmentId: nf-segment-002
  rule:
    nfEnabled: true
    ruleCpu: 70.5
    ruleMemory: 80.0
    ruleMaxReplicas: true
    cooldownPeriodSecs: 120

Spec 필드

필드타입필수 여부기본값설명
targetRefobject-NetFunnel에 바인딩할 워크로드.
targetRef.kindstring-Deployment, Rollout (Argo Rollouts) 또는 DeploymentConfig (OpenShift) 중 하나.
targetRef.namestring-CR과 같은 namespace에 있는 워크로드 이름.
ruleobject-이 워크로드의 NetFunnel 규칙 설정.
rule.nfEnabledboolean-이 워크로드에 대한 NetFunnel 제어 활성화 여부. false로 설정하면 CR을 제거하지 않고도 적용을 비활성화할 수 있습니다.
rule.ruleCpunumber아니오-NetFunnel 신호를 트리거하는 CPU 사용률 임계값 (%).
rule.ruleMemorynumber아니오-NetFunnel 신호를 트리거하는 메모리 사용률 임계값 (%).
rule.ruleMaxReplicasboolean아니오-워크로드가 최대 레플리카 수에 도달했을 때 NetFunnel에 신호를 보낼지 여부.
rule.cooldownPeriodSecsinteger아니오-연속된 NetFunnel 신호 사이의 최소 대기 시간 (초).
nfMappingarray아니오[]이 워크로드가 매핑되는 NetFunnel 프로젝트-세그먼트 쌍 목록. 쌍마다 항목 하나이며, 여러 항목을 지정할 수 있습니다.
nfMapping[].nfProjectIdstring예 (항목별)-NetFunnel 프로젝트 식별자. NetFunnel 콘솔(project → segment)에서 복사합니다.
nfMapping[].nfSegmentIdstring예 (항목별)-NetFunnel 세그먼트 식별자. NetFunnel 콘솔(project → segment)에서 복사합니다.
nfMapping[].isSectionboolean아니오false이 매핑이 Basic Control (단순 on/off) 대신 Section Control (섹션 기반의 고급 세그먼트 관리)을 사용할지 여부.

참고 사항

  • namespace 범위입니다. 대상 워크로드와 같은 namespace에 CR을 생성합니다. targetRef.kindDeployment, Rollout (Argo Rollouts), DeploymentConfig (OpenShift) 중 하나여야 합니다.
  • 아직 존재하지 않는 워크로드를 지정해도 kubectl apply는 성공합니다. Wave는 .status.conditionsTargetNotFound를 보고하며, 워크로드가 나타나면 자동으로 reconcile합니다.
  • nfMapping은 reconcile할 때마다 전체가 교체됩니다. 현재 CR에 없는 항목은 소프트 삭제됩니다. 활성 상태를 유지하려는 프로젝트-세그먼트 쌍은 모두 포함해야 합니다.
  • WaveNetfunnelConnection이 없어도 매핑 자체의 reconcile은 차단되지 않습니다. 다만 NetFunnel 적용이 실제로 동작하려면 정상적인 connection이 필요합니다.
  • CR을 삭제하면 nfEnabled: false로 설정되고 워크로드의 매핑 항목이 제거됩니다. 규칙은 삭제되는 것이 아니라 비활성화됩니다.

WaveNetfunnelConnection

WaveNetfunnelConnection은 Wave를 NetFunnel 서비스와 연결합니다. API 엔드포인트, tenant/organization 식별자, 자격 증명용 Secret 참조를 제공합니다. 클러스터의 모든 WaveNetfunnelMapping CR은 이 connection 하나를 공유합니다.

범위: 클러스터 범위(cluster-scoped)이며 metadata.namespace가 필요하지 않습니다.

먼저 wave-autoscale namespace에 자격 증명용 Secret을 생성합니다.

apiVersion: v1
kind: Secret
metadata:
  name: nf-credentials
  namespace: wave-autoscale
type: Opaque
stringData:
  clientId: <your-netfunnel-client-id>
  secretKey: <your-netfunnel-secret-key>

그다음 connection CR을 생성합니다.

apiVersion: wavek8s.com/v1alpha1
kind: WaveNetfunnelConnection
metadata:
  name: nf-connection
spec:
  host: https://nf.example.com
  tenantId: my-tenant-id
  organizationId: my-org-id
  nfApiType: saas
  clientIdSecretRef:
    name: nf-credentials
    key: clientId
  secretKeySecretRef:
    name: nf-credentials
    key: secretKey
  enabled: true

Spec 필드

필드타입필수 여부기본값설명
hoststring-NetFunnel API 엔드포인트 URL (예: https://nf.example.com).
tenantIdstring-NetFunnel tenant 식별자.
organizationIdstring-NetFunnel organization 식별자.
nfApiTypestring-NetFunnel 배포 유형. 현재는 saas만 지원됩니다.
clientIdSecretRefobject-NetFunnel client ID가 담긴 Secret 키에 대한 참조. wave-autoscale namespace에서 조회됩니다.
clientIdSecretRef.namestring-Secret 이름.
clientIdSecretRef.keystring-client ID 값을 담고 있는 Secret 내 키.
secretKeySecretRefobject-NetFunnel secret key가 담긴 Secret 키에 대한 참조. wave-autoscale namespace에서 조회됩니다.
secretKeySecretRef.namestring-Secret 이름.
secretKeySecretRef.keystring-secret key 값을 담고 있는 Secret 내 키.
enabledboolean아니오trueconnection 활성화 여부. false로 설정하면 CR을 삭제하지 않고도 비활성화할 수 있습니다.
⚠️

이 CR을 삭제하면 connection이 삭제되는 것이 아니라 비활성화됩니다. Wave에는 NetFunnel connection을 위한 삭제 설정 동작이 없습니다. CR이 제거되면 Wave는 내부 상태에서 connection을 삭제하는 대신 enabled: false로 전환합니다. connection을 다시 활성화하려면 CR을 재적용하면 됩니다. 이는 CRD Mode에서 설명하는 표준 prune-to-default 동작의 문서화된 예외입니다.

참고 사항

  • 클러스터 범위입니다. CR 하나가 클러스터 내 모든 WaveNetfunnelMapping CR에 사용됩니다.
  • 자격 증명은 CR에 저장되지 않습니다. Wave는 reconcile 시점에 wave-autoscale namespace에서 Secret 값을 읽습니다. Secret이 없거나 접근할 수 없으면 .status.conditionsSecretNotFound가 보고됩니다.
  • 싱글톤: 클러스터당 활성화된 WaveNetfunnelConnection은 하나만 존재할 수 있습니다. 두 번째 CR을 적용하면 .status.conditionsConflicted가 보고되고 해당 CR은 건너뜁니다. 먼저 reconcile된 CR이 활성 connection을 유지합니다.