티스토리 뷰

728x90
반응형

포드를 사용하는 상위 오브젝트에는 디플로이먼트 외에도 몇 가지가 더 있는데 상황에 따라서 필요할 수 있는 몇 가지 상위 오브젝트를 공부해봅시다.

잡(Job)

잡은 특정 동작을 수행하고 종료해야 하는 작업을 위한 오브젝트입니다. 포드를 생성해 원하는 동작을 수행한다는 점에서는 디플로이먼트와 같지만, 잡에서 원하는 최종 상태는 '특정 개수의 포드가 실행 중인 것'이 아닌 '포드가 실행되어 정상적으로 종료되는 것'이라는 점에서 차이가 있습니다. 따라서 잡에서는 포드의 컨테이너가 종료 코드로서 0을 반환해 Completed 상태가 되는 것을 목표로 합니다.

apiVersion: batch/v1
kind: Job
metadata: 
  name: job-hello-world
spec: 
  template: 
    spec: 
      restartPolicy: Never
      containers: 
      - image: busybox
        args: ["sh", "-c", "echo Hello. World && exit 0"]
        name: job-hello-world

잡의 포드가 최종적으로 도달해야 하는 상태는 Running이 아니라 Completed이기 때문에 포드의 restartPolicy를 명시적으로 Never 또는 OnFailure로 지정해 주어야 합니다.

$ kubectl apply -f xxx.yaml
$ kubectl get po,job

잡은 사용자의 요청을 처리하는 서버와 같은 애플리케이션의 관점이 아닌 한 번 수행하고 종료되는 배치 작업을 위한 관점에서 쓰입니다.

단, 잡은 동시성을 엄격하게 보장해야 하는 병령 처리를 위해 사용하는 것이 아니라는 점을 알아둬야 합니다. 또한 잡의 포드가 실패하면 포드가 restartPolicy에 따라 재시작될 수도 있어서 잡이 처리하는 작업은 멱등성을 가지는 것이 좋습니다.

잡의 세부 옵션

실제로 배치 워크로드에서 잡을 사용하려면 다양한 옵션을 함께 사용해야만 효율적으로 작업을 끝마칠 수 있습니다. 잡에서 자주 사용되는 세부 옵션입니다.

  • spec.completions : 잡이 성공했다고 여겨지려면 몇 개의 포드가 성공해야 하는지(정상적으로 종료돼야 하는지) 설정합니다. 기본값은 1입니다.
  • spec.parallelism : 동시에 생성될 포드의 개수를 설정합니다. 기본값은 1입니다.
apiVersion: batch/v1
kind: Job
metadata: 
  name: job-hello-world
spec: 
  completions: 3
  template: 
    spec: 
      restartPolicy: Never
      containers: 
      - image: busybox
        args: ["sh", "-c", "echo Hello. World && exit 0"]
        name: job-hello-world

만약 잡의 포드가 실패한다면 restartPolicy에 따라 포드가 다시 재시작되거나, 새로운 포드를 다시 생성해 똑같은 작업을 다시 시도합니다. 포드가 실패하면 기본적으로는 최대 6번을 다시 시도하지만, 최대 재시도 횟수는 spec.backoffLimit 값에 별도로 설정할 수 있습니다.

spec.parallelism의 값이 기본적으로 1로 설정돼 있기 때문에 포드를 하나씩 순차적으로 생성하게 됩니다. 잡에서 한 번에 포드를 여러 개 생성해 실행하고 싶다면 이 값을 높여 설정하면 됩니다.

잡의 특정 포드에서 작업이 진행되지 않고 막혀 있는 경우, 잡은 성공이나 실패도 아닌 상태로 오랜 시간동안 머물러 있을 것입니다. 이러한 상황을 방지하기 위해 포드가 실행될 수 있는 최대 시간을 spec.activeDeadlineSeconds 옵션으로 제한할 수 있습니다. 포드가 이 옵션에 설정된 값보다 더 오래 실행될 경우 포드는 강제로 종료되며, 잡은 실패한 상태로 여겨집니다.

크론잡(CronJobs)로 잡을 주기적으로 실행하기

크론잡은 잡을 주기적으로 실행하는 쿠버네티스 오브젝트입니다. 크론 잡은 리눅스에서 흔히 쓰이는 크론(Cron)의 스케줄 방법을 그대로 사용합니다.

apiVersion: batch/v1
kind: CronJob
metadata: 
  name: cronjob-example
spec: 
  schedule: "*/1 * * * *"
  jobTemplate: 
    spec: 
      template: 
        spec: 
          restartPolicy: Never
          containers: 
          - name: cronjob-example
            image: busybox
            args: ["sh", "-c", "date"]

schedule에 설정된 주기마다 jobTemplate의 설정 값을 갖는 잡을 실행합니다.

기본적으로 성공한 잡의 기록은 최대 3개까지, 실패한 잡의 기록은 최대 1개까지만 기록하도록 설정돼 있습니다. 이 값은 YAML 파일에서 각각 spec.successfulJobHistoryLimit 및 spec.failedJobsHistoryLimit 값을 설정함으로써 변경할 수 있습니다.



데몬셋(DaemonSets)

데몬셋은 쿠버네티스의 모든 노드에 동일한 포드를 하나씩 생성하는 오브젝트입니다. 데못셋은 로깅, 모니터링, 네트워킹 등을 위한 에이전트를 각 노드에 생성해야 할 때 유용하게 사용할 수 있습니다.

apiVersion: apps/v1
kind: DaemonSet
metadata: 
  name: daemonset-example
spec: 
  selector: 
    matchLabels: 
      name: my-daemonset-example
  template: 
    metadata: 
      labels: 
        name: my-daemonset-example
    spec: 
      tolerations: 
      - key: node-role.kubernetes.io/master
        effect: Noschedule
      containers: 
      - name: daemonset-example
        image: busybox
        args: ["tail", "-f", "/dev/null"]
        resources: 
          limits: 
            cpu: 100m
            memory: 200Mi
$ kubectl apply -f xxx.yaml
$ kubectl get po
$ kubectl get ds

만약 특정 노드에만 데몬셋의 포드를 생성하고 싶다면 노드 셀렉터나 Node Affinity를 포드에 적용할수도 있습니다.

데몬셋의 목적은 노드마다 포드를 하나씩 생성하는 것이기 때문에 노드에 장애가 발생했을 때에도 포드가 다른 노드로 퇴거되지 않아야 합니다. 이를 위해 데몬셋의 포드에는 다양한 Toleration이 기본적으로 설정돼 있습니다.



스테이트풀셋(StatefulSets)

스테이트풀셋은 상태를 갖는 포드를 관리하기 위한 오브젝트입니다.

apiVersion: apps/v1
kind: StatefulSet
metadata: 
  name: statefulset-example
spec: 
  serviceName: statefulset-service
  selector: 
    matchLabels: 
      name: statefulset-example
  replicas: 3
  template: 
    metadata: 
      labels: 
        name: statefulset-example
    spec: 
      containers: 
      - name: statefulset-example
        image: alicek106/rr-test:echo-hostname
        ports: 
        - containerPort: 80
          name: web
---
apiVersion: v1
kind: Service
metadata: 
  name: statefulset-service
spec: 
  ports: 
    - port: 80
      name: web
  clusterIP: None
  selector: 
    name: statefulset-example

디플로이먼트에서 생성된 포드는 랜덤한 이름이 붙여지지만, 스테이트풀셋으로부터 생성된 포드들의 이름에는 0, 1, 2와 같은 숫자가 붙고, 이 숫자를 통해서 각 포드를 고유하게 식별합니다.

스테이트풀셋에서 replicas의 값을 여러 개로 설정해 생성할 경우 기본적으로는 0번 포드부터 차례대로 생성되며, 이전 번호의 포드가 완전히 준비돼야만 다음 번호의 포드가 생성됩니다. 이런 설정은 spec.podManagementPolicy 항목에서 변경해서 사용할 수 있습니다.

스테이트풀셋에서는 디플로이먼트와 다르게 spec.serviceName 이라는 항목을 정의하고 있으며, 이 항목에는 스테이트풀셋의 포드에 접근할 수 있는 서비스 이름을 입력해야 합니다.

스테이트풀셋의 각 포드는 고유하게 식별돼야 하며, 포드에 접근할 때에도 랜덤한 포드가 아닌, 개별 포드에 접근해야 합니다.

이러한 경우에는 일반적인 서비스가 아닌 헤드리스 서비스(Headless Service)를 사용할 수 있스빈다. 헤드리스 서비스는 서비스의 이름으로 포드의 접근 위치를 알아내기 위해서 사용되며, 서비스의 이름과 포드의 이름을 통해서 포드에 직접 접근할 수 있습니다. clusterIP 항목의 값이 None으로 돼 있는데, 이것이 헤드리스 서비스라는 것을 의미합니다.

clusterIP가 None이기 때문에 서비스의 목록에서도 ClusterIP는 출력되지 않습니다.

헤드리스 서비스의 이름은 SRV 레코드로 쓰이기 때문에 헤드리스 서비스의 이름을 통해 포드에 접근할 수 있는 IP를 반환할 수 있습니다. 예를 들어, 다름과 같이 nslookup 명령어에 헤드리스 서비스의 이름을 입력하면 접근 가능한 포드의 IP가 출력됩니다.





출처
시작하세요! 도커/쿠버네티스(용찬호 저, 위키북스)
example

728x90
반응형
댓글
반응형
250x250
글 보관함
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total
Today
Yesterday
링크