4장. 작업 및 DaemonSet 사용

4.1. 데몬 세트를 사용하여 노드에서 자동으로 백그라운드 작업 실행

관리자는 데몬 세트를 생성 및 사용하여 OpenShift Container Platform 클러스터의 특정 노드 또는 모든 노드에서 Pod 복제본을 실행할 수 있습니다.

데몬 세트를 사용하면 모든(또는 일부) 노드에서 하나의 Pod 복사본을 실행할 수 있습니다. 노드가 클러스터에 추가되면 Pod도 해당 클러스터에 추가됩니다. 노드가 클러스터에서 제거되면 해당 Pod도 가비지 컬렉션을 통해 제거됩니다. 데몬 세트를 삭제하면 데몬 세트에서 생성한 Pod가 정리됩니다.

데몬 세트를 사용하여 공유 스토리지를 생성하거나 클러스터의 모든 노드에서 로깅 Pod를 실행하거나 모든 노드에 모니터링 에이전트를 배포할 수 있습니다.

보안상의 이유로 클러스터 관리자만 데몬 세트를 생성할 수 있습니다.

데몬 세트에 대한 자세한 내용은 Kubernetes 설명서를 참조하십시오.

중요

데몬 세트 예약은 프로젝트의 기본 노드 선택기와 호환되지 않습니다. 비활성화하지 못하면 기본 노드 선택기와 병합되어 데몬 세트가 제한됩니다. 이로 인해 병합된 노드 선택기에서 선택하지 않은 노드에 Pod가 자주 다시 생성되고 이로 인해 클러스터에 불필요한 부하가 발생합니다.

4.1.1. 기본 스케줄러로 예약

데몬 세트를 사용하면 모든 적격 노드에서 하나의 Pod 복사본을 실행할 수 있습니다. 일반적으로 Pod가 실행되는 노드는 Kubernetes 스케줄러에서 선택합니다. 그러나 이전의 데몬 세트 Pod는 데몬 세트 컨트롤러에서 생성하고 예약했습니다. 이 경우 다음과 같은 문제가 발생할 수 있습니다.

  • 일관되지 않은 Pod 동작: 예약 대기 중인 일반 Pod가 생성되고 Pending 상태이지만 데몬 세트 Pod는 Pending 상태로 생성되지 않습니다. 이로 인해 사용자가 혼란스러울 수 있습니다.
  • Pod 선점을 기본 스케줄러에서 처리합니다. 선점 기능을 활성화하면 데몬 세트 컨트롤러에서 Pod 우선순위 및 선점을 고려하지 않고 예약을 결정합니다.

ScheduleDaemonSetPods 기능은 OpenShift Container Platform에서 기본적으로 활성화되어 있으며 이 기능을 통해 spec.nodeName 용어 대신 NodeAffinity 용어를 데몬 세트 Pod에 추가하여 데몬 세트 컨트롤러 대신 기본 스케줄러로 데몬 세트를 예약할 수 있습니다. 그런 다음 기본 스케줄러는 Pod를 대상 호스트에 바인딩하는 데 사용됩니다. 데몬 세트 Pod의 노드 유사성이 이미 존재하는 경우 교체됩니다. 데몬 세트 컨트롤러는 데몬 세트 Pod를 생성하거나 수정할 때만 이러한 작업을 수행하며 데몬 세트의 spec.template는 변경되지 않습니다.

nodeAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchFields:
      - key: metadata.name
        operator: In
        values:
        - target-host-name

또한 데몬 세트 Pod에 node.kubernetes.io/unschedulable:NoSchedule 허용 오차가 자동으로 추가됩니다. 기본 스케줄러는 데몬 세트 Pod를 예약할 때 예약할 수 없는 노드를 무시합니다.

4.1.2. 데몬 세트 생성

데몬 세트를 생성할 때 nodeSelector 필드는 데몬 세트에서 복제본을 배포해야 하는 노드를 나타내는 데 사용됩니다.

사전 요구 사항

  • 데몬 세트를 사용하기 전에 네임스페이스 주석 openshift.io/node-selector를 빈 문자열로 설정하여 네임스페이스에서 기본 프로젝트 수준 노드 선택기를 비활성화하십시오.

    $ oc patch namespace myproject -p \
        '{"metadata": {"annotations": {"openshift.io/node-selector": ""}}}'
  • 새 프로젝트를 생성하는 경우 기본 노드 선택기를 덮어씁니다.

    `oc adm new-project <name> --node-selector=""`.

프로세스

데몬 세트를 생성하려면 다음을 수행합니다.

  1. 데몬 세트 yaml 파일을 정의합니다.

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: hello-daemonset
    spec:
      selector:
          matchLabels:
            name: hello-daemonset 1
      template:
        metadata:
          labels:
            name: hello-daemonset 2
        spec:
          nodeSelector: 3
            role: worker
          containers:
          - image: openshift/hello-openshift
            imagePullPolicy: Always
            name: registry
            ports:
            - containerPort: 80
              protocol: TCP
            resources: {}
            terminationMessagePath: /dev/termination-log
          serviceAccount: default
          terminationGracePeriodSeconds: 10
    1
    데몬 세트에 속하는 Pod를 결정하는 라벨 선택기입니다.
    2
    Pod 템플릿의 라벨 선택기입니다. 위의 라벨 선택기와 일치해야 합니다.
    3
    배포해야 하는 노드 Pod 복제본을 결정하는 노드 선택기입니다. 노드에 일치하는 라벨이 있어야 합니다.
  2. 데몬 세트 오브젝트를 생성합니다.

    $ oc create -f daemonset.yaml
  3. Pod가 생성되었고 각 노드에 Pod 복제본이 있는지 확인하려면 다음을 수행합니다.

    1. daemonset Pod를 찾습니다.

      $ oc get pods

      출력 예

      hello-daemonset-cx6md   1/1       Running   0          2m
      hello-daemonset-e3md9   1/1       Running   0          2m

    2. Pod를 보고 Pod가 노드에 배치되었는지 확인합니다.

      $ oc describe pod/hello-daemonset-cx6md|grep Node

      출력 예

      Node:        openshift-node01.hostname.com/10.14.20.134

      $ oc describe pod/hello-daemonset-e3md9|grep Node

      출력 예

      Node:        openshift-node02.hostname.com/10.14.20.137

중요
  • 데몬 세트 Pod 템플릿을 업데이트해도 기존 Pod 복제본은 영향을 받지 않습니다.
  • 데몬 세트를 삭제한 다음 다른 템플릿과 동일한 라벨 선택기를 사용하여 새 데몬 세트를 생성하면 기존 Pod 복제본을 일치하는 라벨이 있는 복제본으로 인식하므로 Pod 템플릿에 일치하지 않는 항목이 있더라도 복제본을 업데이트하거나 새 복제본을 생성하지 않습니다.
  • 노드 라벨을 변경하면 데몬 세트에서 새 라벨과 일치하는 노드에 Pod를 추가하고 새 라벨과 일치하지 않는 노드에서 Pod를 삭제합니다.

데몬 세트를 업데이트하려면 이전 복제본 또는 노드를 삭제하여 새 Pod 복제본을 강제로 생성합니다.