웹사이트 검색

Kubernetes에서 Daemonset 만들기


이 페이지에서

  1. 전제 조건
  2. 무엇을 할 것인가?\n
  3. 데몬셋 만들기
  4. 결론

DaemonSet는 Kubernetes 클러스터의 모든 노드가 포드 사본을 실행하도록 합니다. 모든 노드에는 포드의 복사본이 있습니다. 노드가 클러스터에 추가되면 Pod가 추가되고 노드가 클러스터에서 제거되면 Pod가 삭제됩니다. DaemonSet를 삭제하면 생성된 Pod가 정리됩니다.

DaemonSet는 모든 노드가 Pod의 복사본을 실행하도록 합니다. 일반적으로 포드가 실행되는 노드는 스케줄러에 의해 선택되지만 DaemonSet 포드는 DaemonSet 컨트롤러에 의해 생성 및 예약됩니다.

Daemonset을 사용할 수 있습니다.

  1. glusterd, ceph와 같은 각 노드에서 클러스터 스토리지 실행\n
  2. fluentd, logstash와 같은 각 노드에서 로그 수집을 실행하려면\n
  3. Prometheus Node Exporter, collectd, Datadog 에이전트와 같은 모든 노트에서 노드 모니터링 실행\n

Daemonset에 대해 자세히 알아보려면 Kubernetes의 공식 문서인 kubernetes.io를 방문하세요.

이 기사에서는 "fluentd_elasticsearch"의 Daemonset을 생성합니다. 이렇게 하면 클러스터의 각 노드에 "fluentd_elasticsearch" 포드가 생성됩니다. Daemonset 정의 파일에는 Pod가 마스터 노드에서도 예약될 수 있도록 마스터 노드의 Taint에 대한 Toleration이 있습니다.

전제 조건

  1. 워커 노드가 1개 이상 있는 Kubernetes 클러스터.
    Kubernetes 클러스터를 만드는 방법을 알아보려면 여기를 클릭하세요. 이 안내서는 AWS Ubuntu EC2 인스턴스에서 1개의 마스터와 2개의 노드가 있는 Kubernetes 클러스터를 생성하는 데 도움이 됩니다.\n

어떻게 할까요?

  1. 데몬셋 만들기

데몬셋 만들기

기본 네임스페이스와 모든 네임스페이스에 daemonset이 있는지 확인하십시오.

kubectl get daemonsets #Get daemonsets from the default namespace
kubectl get daemonsets --all-namespaces #Get daemonsets from all namespace using --all-namespace option

위의 스크린샷에서 사용 가능한 Daemonset이 몇 개 있음을 알 수 있습니다. 이러한 Daemonset은 모두 클러스터 구성요소용입니다.

이제 "kube-system" 네임스페이스에 속하는 포드를 가져옵니다.

kubectl  get pods -n kube-system #Get pods from the "kube-system" namespace

위의 스크린샷에 표시된 모든 포드는 클러스터 구성 요소의 Daemonset에 속합니다.

프록시 포드 목록을 가져옵니다.

kubectl get pods -n kube-system | grep proxy #Get pods from the "kube-system" namespace and grep for proxy

무엇이 프록시 포드를 제어하는지 확인하세요.

kubectl describe pod kube-proxy-s5vzp -n kube-system #Describe the pod from the "kube-system" namespace

프록시 팟(Pod)을 제어하는 daemonset의 세부사항을 가져오십시오.

kubectl describe daemonset kube-proxy -n kube-system #Describe the daemonset from the "kube-system" namespace

다음 daemonset 정의가 포함된 파일을 만듭니다.

vim my-daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: my-fluentd-elasticsearch-daemonset
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

위의 정의에는 마스터 노드의 Taint에 대한 Toleration이 있습니다. 이렇게 하면 포드가 마스터 노드에도 배치될 수 있습니다.

위 단계에서 생성한 정의 파일을 사용하여 daemonset을 생성합니다.

kubectl create -f my-daemonset.yml #Create a daemonset 
kubectl get daemonset -n kube-system #Get daemonset from the "kube-system" namespace

이 deamont 세트는 \kube-system\ 네임스페이스에 생성되었습니다.

"kube-system" 네임스페이스에서 방금 생성한 데몬셋을 설명합니다.

kubectl  describe daemonset my-fluentd-elasticsearch-daemonset -n kube-system #Describe the daemonset from the "kube-system" namespace

위의 스크린샷에서 Pod가 2개의 노드에 배포된 것을 볼 수 있습니다.

이제 2개의 노드에 daemonset으로 배포된 포드의 세부 정보를 얻을 수 있습니다.

kubectl get pods -n kube-system | grep my-fluentd-elasticsearch-daemonset #Get pods from the "kube-system" namespace and grep 
kubectl describe pod my-fluentd-elasticsearch-daemonset-4t9vs -n kube-system | grep Node #Describe the pods from the "kube-system" namespace and grep
kubectl describe pod my-fluentd-elasticsearch-daemonset-kxfjj -n kube-system | grep Node #Describe the pod from the "kube-system" namespace and grep

위의 스크린샷에서 Pod가 작업자 노드 \node01\ 및 마스터 노드 \master\에 배포된 것을 볼 수 있습니다. 마스터 노드에서 Pod를 예약하는 이유는 마스터 노드의 Taint에 대한 Toleration입니다.

결론

이 문서에서는 daemonset를 만드는 단계와 daemonset의 pod가 Kubernetes 클러스터의 각 노드에 배포되는 방법을 살펴보았습니다.