Container/Kubernetes

[Kubernetes] 쿠버네티스 데몬셋(Daemonset) 개념 (생성, 확인, 실행중인 파드의 노드 확인, 업데이트)

Nirsa 2020. 2. 18. 16:09
반응형

 

  • 데몬셋(Daemonset) 이란?

데몬셋은 디플로이먼트와 유사하게 파드를 생성하고 관리 합니다. 디플로이먼트는 롤링 업데이트나 배포 일시 중지, 재개 등 배포 작업을 좀 더 세분화하여 조작하였다면, 데몬셋은 특정 노드 또는 모든 노드에 항상 실행되어야 할 특정 파드를 관리 합니다.

하나의 예를 들자면 모니터링 시스템 구축을 위해 모든 노드에 특정 파드(로그 수집용)를 관리해야 할 때 사용할 수 있습니다. 모니터링 시스템을 원활히 사용하기 위해선 모든 노드에 항상 로그 수집할 무언가가 필요하기 때문 입니다. 특정 노드를 지정하여 사용할수도 있습니다.

 

  • 데몬셋 생성 및 확인

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: test-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: test-logging
spec:
  selector:
    matchLabels:
      name: test-elasticsearch
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        name: test-elasticsearch
    spec:
      containers:
      - name: container-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
      terminationGracePeriodSeconds: 30
  • apiVersion apps/v1 → 쿠버네티스의 apps/v1 API를 사용 합니다.
  • kind: DaemonSet → DaemonSet의 작업으로 명시 합니다.
  • metadata.name → DaemonSet의 이름을 설정 합니다.
  • metadata.namespace → 네임스페이스를 지정 합니다. kube-system은 쿠버네티스 시스템에서 직접 관리하며 보통 설정 또는 관리용 파드를 설정합니다.
  • metadata.labels → DaemonSet를 식별할 수 있는 레이블을 지정 합니다.
  • spec.selector.matchLabels → 어떤 레이블의 파드를 선택하여 관리할 지 설정 합니다.
  • spec.updateStrategy.type → 업데이트 방식을 설정 합니다. 이 코드에서는 롤링 업데이트로 설정 돼었으며 OnDelete 등의 방식으로 변경이 가능 합니다. 롤링 업데이트는 설정 변경하면 이전 파드를 삭제하고 새로운 파드를 생성 합니다.
  • spec.template.metadata.labels.name → 생성할 파드의 레이블을 파드명: "" 으로 지정 합니다.
  • spec.template.spec.containers → 하위 옵션들은 컨테이너의 이름, 이미지, 메모리와 CPU의 자원 할당을 합니다.
  • terminationGracePeriodSeconds 30  → 기본적으로 kubelet에서 파드에 SIGTERM을 보낸 후 일정 시간동안 graceful shutdown이 되지 않는다면 SIGKILL을 보내서 파드를 강제 종료 하게 됩니다. 이 옵션은 그레이스풀 셧다운 대기 시간을 30초로 지정하여 30초 동안 정상적으로 종료되지 않을 경우 SIGKILL을 보내서 강제 종료 시킵니다.

 

네임스페이스를 따로 지정 했으므로 kubectl get daemonset,pods -n kube-system 으로 조회할 수 있습니다. n 옵션은 네임스페이스를 따로 지정 합니다.

위와같이 실제로 kube-system이란 네임스페이스에 데몬셋이 실행 되었으며 test-elasticsearch라는 파드가 2개 생성된것을 확인 했습니다. (현재 저의 테스트환경이 마스터 3대, 노드 2대이므로 노드 개수에 맞춰 파드가 생성 됩니다.)

위에서는 모든 노드에 하도록 했지만 .spec.template.spec.nodeSelector 또는 .spec.template.spec.affinity 를 명시하여 특정 노드를 정해줄 수 있습니다. 두 옵션의 차이는 노드 셀렉터 / 노트 어피니티의 차이이며 자세한 내용은 쿠버네티스의 docs 문서를 참고 해주세요.

노드 셀렉터(.spec.template.spec.nodeSelector) : https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector

노드 어피니티(.spec.template.spec.affinity) : https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity

 

  • 파드가 어떤 노드에서 사용중인지 확인

우선 생성한 마스터 서버에서 kubectl get pods -n kube-system 으로 어떤 노드에서 동작중인지 확인하고 싶은 파드의 이름을 확인 후 kubectl edit pods [파드 이름] -n kube-system 을 입력해서 vi 편집기로 진입 합니다.

아래에 표시한것처럼 현재 동작중인 노드의 이름(호스트명)을 확인할 수 있습니다.

 

  • 데몬셋 업데이트

데몬셋의 내용을 변경하고 싶다면 kubectl get daemonset -n kube-system 을 입력하여 데몬셋 이름을 확인하고 kubectl edit daemonset [데몬셋 이름] -n kube-system 입력 후 vi 편집기로 진입 합니다.

이후 spec.template.spec.container.env에 아래와 같이 환경 변수의 이름과 값을 작성해 주세요.

 

현재 롤링 업데이트 방식이므로 바로 적용이 되며 기존 파드를 삭제하고 새로운 파드를 생성해냅니다. kubectl  kubectl describe daemonset [데몬셋 이름] -n kube-system 을 입력하여 보면 환경 변수의 값에 입력했던 환경변수 키 - 값이 재대로 적용 되었고, kubectl get daemonset,pods -n kube-system 으로 새로운 파드가 생성중임을 알 수 있습니다.

 

반응형