목차
- 데몬셋이란?
- 특정 노드에서만 파드를 실행하기
- 데몬셋 YAML 파일 작성하기
데몬셋이란?
레플리케이션 컨트롤러와 레플리카셋은 쿠버네티스 클러스 내 어딘가에 지정된 수만큼의 파드를 실행하는 데 사용됩니다. 그러나 클러스터의 모든 노드에, 노드당 하나의 파드만 실행되길 원하는 경우가 있을 수 있습니다.
시스템 수준의 작업을 수행하는 인프라 관련 파드가 이런 경우인데, 예를 들면 모든 노드에서 로그 수집기와 리소스 모니터를 실행하려는 경우가 좋은 예입니다. 또 다른 좋은 예는 쿠버네티스의 kube-proxy 프로세스이며, 서비스를 작동시키기 위해 모든 노드에서 실행돼야 합니다.
쿠버네티스를 사용하지 않는 환경에서는 일반적으로 노드가 부팅되는 동안에 시스템 초기화 스크립트(init script)나 systemd 데몬을 통해 시작됩니다. 쿠버네티스 노드에서도 여전히 systemd를 사용해 시스템 프로세스를 실행할 수도 있지만, 그렇게 하면 쿠버네티스가 제공하는 모든 기능을 최대한 활용할 수가 없습니다.
모든 클러스터 노드마다 파드를 하나만 실행하려면 데몬셋 오브젝트를 생성해야 합니다. 데몬셋에 의해 생성되는 파드는 타깃 노드가 이미 지정돼 있고 쿠버네티스 스케줄러를 건너뛰는 것을 제외하면 이 오브젝트는 레플리케이션 컨트롤러 또는 레플리카셋과 매우 유사합니다. 파드가 클러스터 내에 무작위로 흩어져 배포되지는 않습니다.
데몬셋은 위 그림과 같이 노드 수만큼 파드를 만들고 각 노드에 배포됩니다. 레플리카셋이 클러스터에 원하는 수의 파드 복제본이 존재하는지 확인하는 반면, 데몬셋에는 원하는 복제본 수라는 개념이 없습니다. 파드 셀렉터와 일치하는 파드 하나가 각 노드에서 실행 중인지 확인하는 것이 데몬셋이 수행해야 하는 역할이기 때문에 복제본 개념이 필요하지 않습니다.
노드가 다운되면 데몬셋은 다른 곳에서 파드를 생성하지 않습니다. 그러나 새 노드가 클러스터에 추가되면 데몬셋은 즉시 새 파드 인스턴스를 새 노드에 배포합니다. 또한 누군가 실수로 파드 중 하나를 삭제해 노드에 데몬셋의 파드가 없는 경우에도 마찬가지입니다. 레플리카셋과 마찬가지로 데몬셋은 그 안에 구성된 파드 템플릿으로 파드를 생성합니다.
특정 노드에서만 파드를 실행하기
파드가 노드의 일부에서만 실행되도록 지정하지 않으면 데몬셋은 클러스터의 모든 노드에 파드를 배포합니다. 데몬셋 정의의 일부인 파드 템플릿에서 nnode-Selector 속성을 지정하면 됩니다. 이는 이전에 다루었던 레플리카셋이나 레플리케이션 컨트롤러의 파드 템플릿과 유사합니다. 또한 데몬셋의 노드 셀렉터도 유사하며 데몬셋이 파드를 배포해야 하는 노드를 정의합니다.
SSD를 갖는 모든 노드에서 실행되야 하는 ssd-moniter라는 데몬이 있다고 가정해봅시다. SSD를 갖고 있다고 표시된 모든 노드에서 이 데몬을 실행하는 데몬셋을 만듭니다. 클러스터 관리자가 이런 모든 노드에 disk=ssd 레이블을 추가했으므로 다음 그림과 같이 해당 레이블이 있는 노드만 선택하는 노드 셀렉터를 사용해 데몬셋을 작성합니다.
데몬셋 YAML 파일 작성하기
5초마다 표준 출력으로 "SSD OK"를 출력하는 모의 ssd-monitor 프로세스를 싱행하는 데몬셋을 생성합니다. 이미 모의 컨테이너 이미지를 준비해서 도커 허브로 푸시했기 때문에 직접 빌드하는 대신 이 이미지를 사용할 수 있습니다. 다음 예제와 같이 데몬셋에 대한 YAML을 작성합니다.
apiVersion: apps/v1beta2 > 데몬셋의 API 그룹은 apps의 v1beta2 입니다.
kind: DeamonSet
metadata:
name: ssd-monitor
spec:
selector:
matchLabels:
app: ssd-monitor
template:
metadata:
labels:
app: ssd-monitor
spec:
nodeSelector: > 파드 템플릿은 disk=ssd 레이블이 있는 노드를 선택하는 노드 셀렉터를 갖습니다.
disk: ssd
containers:
- name: main
image: luksa/ssd-monitor
이 파드의 인스턴스는 disk=ssd 레이블이 있는 각 노드에 생성될 것입니다.
이전 포스팅에서도 여러번 설명한 바 있지만, YAML 파일을 작성할 때에는 항상 대소문자, 들여쓰기를 철저히 해주어야합니다. 종종 대소문자 하나 잘못써서 작동이 안되는 경우가 있다고 합니다. 그래서 현직에 있을 때도 "복사, 붙여넣기"를 자주 활용한다고 합니다. 복사, 붙여넣기하는게 농땡이가 아니라는 뜻이죠.
실제로 실습을 해보면 복사 붙여넣기를 잘 활용하면, 오히려 휴먼 리스크도 감소하고, 속도와 정확성도 증가해서 허탈했었던 적이 있습니다. 혹은 쿠버네티스 명령어들을 yaml 파일로 만드는 < ~~~ -o yaml > XXX.yaml> 을 활용해 명령어를 YAML파일로 만들어 활용하는 것도 많은 도움이 됩니다.
'Container > Kubernetes' 카테고리의 다른 글
[Kubernetes] 일회성 작업 효율적으로 관리하기 (2) CronJob (0) | 2023.04.09 |
---|---|
[Kubernetes] 일회성 작업 효율적으로 관리하기 (1) Job 리소스 (0) | 2023.04.09 |
[Kubernetes] 파드 효율적으로 관리하기 (2) 레플리카셋이란? (0) | 2023.04.08 |
[Kubernetes] 파드 효율적으로 관리하기 (1) 레플리케이션 컨트롤러란? (0) | 2023.04.08 |
[Kubernetes] 파드를 안정적으로 유지하기 (0) | 2023.04.07 |