본문 바로가기
WIKI 기술 지식 베이스

CronOperation

원문 보기 위키 갱신

CronOperation (예약된 Operations)

이 기능은 v2에서 도입되었습니다. 자세한 내용은 Crossplane 기능 생명주기 문서를 참고하세요.

출처: 문서

본문

CronOperation은 Kubernetes CronJobs처럼 일정에 따라 Operations를 생성합니다. 데이터베이스 백업, 인증서 교체, 주기적 유지보수 같은 반복 운영 작업에 CronOperations를 사용하세요.

CronOperations는 어떻게 동작하나요? (How CronOperations work)

CronOperations는 Operation용 템플릿을 담고 있으며, cron 일정에 따라 새 Operations를 생성합니다. 예약된 실행마다 새 Operation이 생성되어 한 번 완료까지 실행됩니다.

apiVersion: ops.crossplane.io/v1alpha1
kind: CronOperation
metadata:
  name: daily-backup
spec:
  schedule: "0 2 * * *"  # Daily at 2 AM
  concurrencyPolicy: Forbid
  successfulHistoryLimit: 5
  failedHistoryLimit: 3
  operationTemplate:
    spec:
      mode: Pipeline
      pipeline:
      - step: backup
        functionRef:
          name: function-database-backup
        input:
          apiVersion: fn.crossplane.io/v1beta1
          kind: DatabaseBackupInput
          retentionDays: 7

⚠️ 중요: CronOperations는 alpha 기능입니다. Crossplane 인자에 --enable-operations를 추가해서 Operations를 반드시 활성화해야 해요.

주요 특징 (Key features)

  • 표준 cron 일정 문법 - Kubernetes CronJobs와 동일한 형식 사용
  • 구성 가능한 동시성 정책 (Allow, Forbid, Replace)
  • 오래된 Operations 자동 정리 - 히스토리 한계 유지
  • 실행 히스토리와 실행 중인 operations 추적 - 예약 실행에 대한 가시성 제공

스케줄링 (Scheduling)

CronOperations는 표준 cron 문법을 사용합니다.

┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday)
│ │ │ │ │
│ │ │ │ │
* * * * *

일반적인 일정 예시:

  • "0 2 * * *" - 매일 오전 2:00
  • "0 0 * * 0" - 매주 일요일 자정
  • "0 0 1 * *" - 매달 1일 자정
  • "*/15 * * * *" - 15분마다

동시성 정책 (Concurrency policies)

CronOperations는 세 가지 동시성 정책을 지원합니다.

  • Allow (기본값): 여러 Operations가 동시에 실행될 수 있음. 서로 간섭하지 않는 작업에 사용하세요.
  • Forbid: 이전 작업이 아직 실행 중이면 새 Operations가 시작되지 않음. 동시에 실행할 수 없는 작업에 사용하세요.
  • Replace: 새 Operations가 시작하기 전에 실행 중인 작업을 중지함. 항상 최신 작업을 실행하려 할 때 사용하세요.

히스토리 관리 (History management)

유지할 완료된 Operations 수를 제어하세요.

spec:
  successfulHistoryLimit: 5  # Keep 5 successful operations
  failedHistoryLimit: 3      # Keep 3 failed operations for debugging

이 설정은 디버깅 능력과 리소스 사용량의 균형을 맞추는 데 도움이 됩니다.

일반적인 사용 사례 (Common use cases)

📝 참고: 아래 예제는 설명을 위한 가상의 함수를 사용합니다. 출시 시점에는 function-python만 operations를 지원해요.

예약된 데이터베이스 백업 (Scheduled database backups)

apiVersion: ops.crossplane.io/v1alpha1
kind: CronOperation
metadata:
  name: postgres-backup
spec:
  schedule: "0 3 * * *"  # Daily at 3 AM
  concurrencyPolicy: Forbid  # Don't allow overlapping backups
  operationTemplate:
    spec:
      mode: Pipeline
      pipeline:
      - step: backup
        functionRef:
          name: function-postgres-backup
        input:
          apiVersion: fn.crossplane.io/v1beta1
          kind: PostgresBackupInput
          instance: production-db
          s3Bucket: db-backups

예약된 유지보수 (Scheduled maintenance)

apiVersion: ops.crossplane.io/v1alpha1
kind: CronOperation
metadata:
  name: weekly-maintenance
spec:
  schedule: "0 3 * * 0"  # Weekly on Sunday at 3 AM
  operationTemplate:
    spec:
      mode: Pipeline
      pipeline:
      - step: cleanup-logs
        functionRef:
          name: function-log-cleanup
        input:
          apiVersion: fn.crossplane.io/v1beta1
          kind: LogCleanupInput
          retentionDays: 30
      - step: update-certificates
        functionRef:
          name: function-cert-renewal

주기적 상태 확인 (Periodic health checks)

apiVersion: ops.crossplane.io/v1alpha1
kind: CronOperation
metadata:
  name: health-check
spec:
  schedule: "*/30 * * * *"  # Every 30 minutes
  operationTemplate:
    spec:
      mode: Pipeline
      pipeline:
      - step: check-cluster-health
        functionRef:
          name: function-health-check
        input:
          apiVersion: fn.crossplane.io/v1beta1
          kind: HealthCheckInput
          alertThreshold: 80

고급 구성 (Advanced configuration)

복잡한 스케줄링 패턴 (Complex scheduling patterns)

특정 사용 사례를 위한 고급 cron 일정 예시입니다.

# Weekdays only at 9 AM (Monday-Friday)
schedule: "0 9 * * 1-5"

# Every 4 hours during business days
schedule: "0 8,12,16 * * 1-5"

# First and last day of each month
schedule: "0 2 1,L * *"

# Every quarter (1st of Jan, Apr, Jul, Oct)
schedule: "0 2 1 1,4,7,10 *"

# Business hours only, every 2 hours
schedule: "0 9-17/2 * * 1-5"

시작 데드라인 (Starting deadline)

CronOperations는 startingDeadlineSeconds 필드를 지원합니다. 예약 시간 이후 Operation 생성이 너무 늦다고 판단하기 전까지 기다릴 시간을 제어합니다.

apiVersion: ops.crossplane.io/v1alpha1
kind: CronOperation
metadata:
  name: deadline-example
spec:
  schedule: "0 9 * * 1-5"  # Weekdays at 9 AM
  startingDeadlineSeconds: 900  # 15 minutes
  operationTemplate:
    spec:
      mode: Pipeline
      pipeline:
      - step: morning-tasks
        functionRef:
          name: function-morning-tasks

오전 9시에서 15분 안에 Operation을 시작할 수 없으면 (컨트롤러 다운타임, 리소스 제약 등으로) 예약 실행은 건너뜁니다.

건너뛰는 것이 좋은 작업:

  • 시간에 민감한 작업: 지연되면 의미가 없어지는 작업
  • 리소스 보호: 장애 중에 백업 Operations가 쌓이는 것을 방지
  • SLA 준수: 허용 가능한 시간 창 안에서 작업이 실행되도록 보장

시간대 고려 사항 (Time zone considerations)

⚠️ 중요: CronOperations는 Kubernetes CronJobs와 마찬가지로 클러스터의 로컬 시간대를 사용해요.

서로 다른 환경에서 일관된 스케줄링을 보장하려면 다음을 고려하세요.

  • 클러스터 시간대 표준화: 프로덕션 클러스터에서는 UTC를 사용
  • 시간대 가정 문서화: 주석에 예상 시간대를 명시
  • DST 변경 고려: 일부 일정은 전환 기간에 건너뛰거나 반복될 수 있음

상태와 모니터링 (Status and monitoring)

CronOperations는 스케줄링에 대한 상태 정보를 제공합니다.

status:
  conditions:
  - type: Synced
    status: "True"
    reason: ReconcileSuccess
  - type: Scheduling
    status: "True"
    reason: ScheduleActive
  lastScheduleTime: "2024-01-15T10:00:00Z"
  lastSuccessfulTime: "2024-01-15T10:02:30Z"
  runningOperationRefs:
  - name: daily-backup-1705305600

주요 상태 필드:

  • Conditions: 표준 Crossplane 조건(Synced)과 CronOperation 고유 조건. Scheduling: CronOperation이 작업을 적극적으로 스케줄링하면 True, 일시 중지되거나 잘못된 일정 문법이면 False.
  • lastScheduleTime: CronOperation이 마지막으로 Operation을 생성한 시점.
  • lastSuccessfulTime: Operation이 마지막으로 성공적으로 완료된 시점.
  • runningOperationRefs: 실행 중인 Operations.

이벤트 (Events)

CronOperations는 중요한 활동에 대해 이벤트를 발생시킵니다.

  • CreateOperation (Warning) - 예약된 Operation 생성 실패
  • GarbageCollectOperations (Warning) - 가비지 컬렉션 실패
  • ReplaceRunningOperation (Warning) - 실행 중인 Operation 삭제 실패
  • InvalidSchedule (Warning) - cron 일정 파싱 오류

모니터링 (Monitoring)

다음을 사용해 CronOperations를 모니터링하세요.

# Check CronOperation status
$ kubectl get cronoperation my-cronop

# View recent Operations created by the CronOperation
$ kubectl get operations -l crossplane.io/cronoperation=my-cronop

# Check events
$ kubectl get events --field-selector involvedObject.name=my-cronop

베스트 프랙틱스 (Best practices)

스케줄링 고려 사항

  • 시간대 고려: CronOperations는 호스트의 로컬 시간을 사용합니다 (Kubernetes CronJobs와 동일).
  • 장기 실행 작업 계획: 다음 예약 실행 전에 작업이 완료되도록 하세요.
  • 합리적인 히스토리 한계 설정: 디버깅 요구와 클러스터 리소스 사용량 간 균형을 맞추세요.

동시성 정책

  • 적절한 동시성 정책 선택: 백업, 유지보수, 또는 반드시 단독으로 완료해야 하는 작업에는 Forbid를 사용.
  • 최신 데이터가 가장 중요한 상태 확인이나 모니터링에는 Replace를 사용.
  • 동시에 실행될 수 있는 독립 작업에는 Allow를 사용.

함수 개발과 운영 고려 사항을 포함한 일반적인 Operations 베스트 프랙틱스는 Operation 베스트 프랙틱스를 참고하세요.

트러블슈팅 (Troubleshooting)

CronOperation이 Operations를 생성하지 않음

  • cron 일정 문법을 확인하세요.
  • CronOperation이 Synced=True 조건을 갖는지 확인하세요.
  • 일정 파싱 오류를 나타내는 이벤트를 찾아보세요.

Operations가 자주 실패함

  • Operation 이벤트와 로그를 확인하세요.
  • 함수 능력에 operation이 포함되는지 확인하세요.
  • 재시도 한계를 검토하고 필요에 따라 조정하세요.

리소스 정리 문제

  • 히스토리 한계를 적절히 설정했는지 확인하세요.
  • 가비지 컬렉션 실패에 대한 이벤트를 확인하세요.

다음 단계 (Next steps)

더 알아보기 (Learn more)