-
데몬셋(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 으로 새로운 파드가 생성중임을 알 수 있습니다.
'Container > Kubernetes' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 크론잡(cronjob) 개념 (2) | 2020.02.21 |
---|---|
[Kubernetes] 쿠버네티스 잡(job) 개념 (0) | 2020.02.21 |
[Kubernetes] 쿠버네티스 디플로이먼트(Deployment) 개념 (생성, 확인, 업데이트, 롤백, 롤아웃 기록 조회, 일시 중지, 시작, 재시작) (1) | 2020.02.17 |
[Kubernetes] 쿠버네티스 레플리카셋(replicaset) 개념 (파드 개수 유지, 파드 독립, 레플리카셋만 삭제) (1) | 2020.02.17 |
[Kubernetes] 쿠버네티스 컴포넌트들의 역할 (0) | 2020.02.17 |