3.4. JobSink
이벤트 처리는 일반적으로 몇 분과 같은 짧은 기간 내에 완료됩니다. 이렇게 하면 HTTP 연결이 열려 있고 서비스가 조기에 축소되지 않습니다.
장기 실행 연결을 유지 관리하면 오류가 발생할 위험이 발생하여 다시 시작되고 반복적인 요청 재시도가 발생할 수 있습니다.
JobSink를 사용하여 전체 Kubernetes 배치/v1 작업 리소스 및 기능 및 Kubernetes 작업 큐레이션 시스템을 사용하여 장기 실행 비동기 작업 및 작업을 지원할 수 있습니다.
3.4.1. JobSink 사용 링크 복사링크가 클립보드에 복사되었습니다!
이벤트가 로 전송되면 Eventing에서 작업을 생성하고 수신된 이벤트를 Job Sink/etc/jobsink-event/event 에서 JSON 파일로 마운트합니다.
프로세스
JobSink오브젝트 정의를 YAML 파일로 생성합니다.JobSink YAML
apiVersion: sinks.knative.dev/v1alpha1 kind: JobSink metadata: name: job-sink-logger spec: job: spec: completions: 1 parallelism: 1 template: spec: restartPolicy: Never containers: - name: main image: docker.io/library/bash:5 command: [ "cat" ] args: - "/etc/jobsink-event/event"JobSinkYAML 파일을 적용합니다.$ oc apply -f <job-sink-file.yaml>JobSink가 준비되었는지 확인합니다.$ oc get jobsinks.sinks.knative.dev출력 예:
NAME URL AGE READY REASON job-sink-logger http://job-sink.knative-eventing.svc.cluster.local/default/job-sink-logger 5s TrueJobSink를 트리거합니다.JobSink는 이벤트 소스 또는 트리거에 의해 트리거될 수 있습니다.$ oc run curl --image=curlimages/curl --rm=true --restart=Never -ti -- -X POST -v \ -H "content-type: application/json" \ -H "ce-specversion: 1.0" \ -H "ce-source: my/curl/command" \ -H "ce-type: my.demo.event" \ -H "ce-id: 123" \ -d '{"details":"JobSinkDemo"}' \ http://job-sink.knative-eventing.svc.cluster.local/default/job-sink-logger작업이생성되었는지 확인합니다.$ oc logs job-sink-loggerszoi6-dqbtq출력 예:
{"specversion":"1.0","id":"123","source":"my/curl/command","type":"my.demo.event","datacontenttype":"application/json","data":{"details":"JobSinkDemo"}}
JobSink는 수신하는 각 고유 이벤트에 대한 작업을 생성합니다.
이벤트는 소스 및 ID 특성의 조합으로 고유하게 식별됩니다.
해당 이벤트의 작업이 이미 존재하는 동안 동일한 속성이 있는 이벤트가 수신되면 다른 작업이 생성되지 않습니다.
3.4.2. 작업 이벤트 파일 읽기 링크 복사링크가 클립보드에 복사되었습니다!
프로세스
이벤트파일을 읽고 CloudEvents JSON deserializer를 사용하여 역직렬화합니다. 다음 예제에서는 CloudEvents Go SDK를 사용하여 이벤트를 읽고 처리하는 방법을 보여줍니다.package mytask import ( "encoding/json" "fmt" "os" cloudevents "github.com/cloudevents/sdk-go/v2" ) func handleEvent() error { eventBytes, err := os.ReadFile("/etc/jobsink-event/event") if err != nil { return err } event := &cloudevents.Event{} if err := json.Unmarshal(eventBytes, event); err != nil { return err } fmt.Println(event) return nil }
3.4.3. 사용자 정의 이벤트 파일 마운트 경로 설정 링크 복사링크가 클립보드에 복사되었습니다!
JobSink 정의에 사용자 정의 이벤트 파일 마운트 경로를 설정할 수 있습니다.
프로세스
컨테이너 정의 내부에
volumeMounts구성을 포함하고 필요에 따라 설정합니다.apiVersion: sinks.knative.dev/v1alpha1 kind: JobSink metadata: name: job-sink-custom-mount-path spec: job: spec: completions: 1 parallelism: 1 template: spec: restartPolicy: Never containers: - name: main image: docker.io/library/bash:5 command: [ "bash" ] args: - -c - echo "Hello world!" && sleep 5 # The event will be available in a file at `/etc/custom-path/event` volumeMounts: - name: "jobsink-event" mountPath: "/etc/custom-path" readOnly: true
3.4.4. 완료된 작업 정리 링크 복사링크가 클립보드에 복사되었습니다!
JobSink 정의에 ttlSecondsAfterFinished 값을 설정하여 완료된 작업을 정리할 수 있습니다. 예를 들어 값을 600 으로 설정하면 완료된 작업 600초(10분)가 완료된 후 제거됩니다.
프로세스
정의에서
ttlSecondsAfterFinished값을 필요한 양으로 설정합니다.ttlSecondsAfterFinished의 예: 600으로 설정
apiVersion: sinks.knative.dev/v1alpha1 kind: JobSink metadata: name: job-sink-example spec: job: spec: ttlSecondsAfterFinished: 600
3.4.5. FailJob 작업 시뮬레이션 링크 복사링크가 클립보드에 복사되었습니다!
프로세스
JobSink 정의에 버그 시뮬레이션 명령을 포함하여
FailJob작업을 트리거합니다.JobSink 실패 예
apiVersion: sinks.knative.dev/v1alpha1 kind: JobSink metadata: name: job-sink-failure spec: job: metadata: labels: my-label: my-value spec: completions: 12 parallelism: 3 template: spec: restartPolicy: Never containers: - name: main image: docker.io/library/bash:5 command: [ "bash" ] # example command simulating a bug which triggers the FailJob action args: - -c - echo "Hello world!" && sleep 5 && exit 42 backoffLimit: 6 podFailurePolicy: rules: - action: FailJob onExitCodes: containerName: main # optional operator: In # one of: In, NotIn values: [ 42 ] - action: Ignore # one of: Ignore, FailJob, Count onPodConditions: - type: DisruptionTarget # indicates Pod disruption