[Kubernetes] GKE DaemonSet과 StatefulSet 사용하기

Hailey·2020년 10월 7일
1

Kubernetes

목록 보기
1/6
post-thumbnail

DaemonSet 이란?

DaemonSet의 모든(또는 일부)노드는 Pod의 사본을 실행하는 것을 보장한다. 노드가 클러스터에 추가되면 Pod가 추가된다. 클러스터에서 노드가 제거되면 해당 Pod가 가비지 수집된다. DaemonSet을 삭제하면 생성된 Pod가 정리된다.

다른 워크로드 객체와 마찬가지로 DaemonSet은 복제된 Pod 그룹을 관리한다. 하지만 DaemonSet은 전체 클러스터 또는 노드 하위 집합에서 노드당 Pod 하나라는 모델 원칙을 따르려고 시도한다. 노드 풀에 노드를 추가할 때 DaemonSet은 새 노드에 Pod를 필요에 따라 자동으로 추가한다. DaemonSet은 Pod 사양이 포함된 Pod 템플릿을 사용한다. Pod 사양은 각 Pod의 모양을 결정한다. 즉, 컨테이너 내에서 실행할 애플리케이션, 마운트할 볼륨, 라벨 및 선택기 등을 결정한다.

DaemonSet Pod에는 다른 Pod와 동일한 우선순위 규칙이 적용된다. DaemonSet Pod는 taint 및 내결함성을 사용하지만 DaemonSet Pod에는 몇 가지 암시적 내결함성이 있다.


사용 패턴
DaemonSet은 모든 또는 특정 노드에서 실행해야 하고 사용자 개입이 필요하지 않은 진행 중인 백그라운드 태스크를 배포하는 데 유용하다. 이러한 태스크의 예시로는 ceph와 같은 스토리지 데몬, fluentd와 같은 로그 수집 데몬, collectd와 같은 노드 모니터링 데몬이 있다. 예를 들어 각 유형의 데몬에 대한 DaemonSet이 모든 노드에서 실행되도록 할 수 있다. 또는 단일 유형의 데몬에 대해 여러 DaemonSets를 실행할 수 있지만, 여러 하드웨어 유형 및 리소스 요구에 따라 다른 구성을 사용하도록 할 수 있다.

DaemonSet 만들기

kubectl apply 또는 kubectl create를 사용하여 DaemonSet을 만들 수 있다.
다음은 DaemonSet 매니페스트 파일의 예시이다.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
spec:
  selector:
      matchLabels:
        name: fluentd # Label selector that determines which Pods belong to the DaemonSet
  template:
    metadata:
      labels:
        name: fluentd # Pod template's label selector
    spec:
      nodeSelector:
        type: prod # Node label selector that determines on which nodes Pod should be scheduled
                   # In this case, Pods are only scheduled to nodes bearing the label "type: prod"
      containers:
      - name: fluentd
        image: gcr.io/google-containers/fluentd-elasticsearch:1.20
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi

예를 들면 다음과 같습니다.

  • fluentd라는 DaemonSet이 생성되고 metadata: name 필드로 표시된다.
  • DaemonSet의 Pod가 fluentd 라벨로 지정된다.
  • 노드 라벨 선택기(type: prod)가 DaemonSet에서 Pod를 예약하는 라벨이 지정된 노드를 선언한다.
  • Pod의 컨테이너가 1.20 버전에서 fluentd-elasticsearch 이미지를 가져온다. 컨테이너 이미지는 Container Registry에서 호스팅된다.
  • 컨테이너가 CPU 100m, 메모리 200Mi를 요청하고, 총 메모리 사용량 200Mi로 자체적으로 제한한다.

Pod 사양에 포함되는 지침은 다음과 같이 요약될 수 있다.

  • Pod 라벨을 fluentd로 지정한다.
  • 노드 라벨 선택기 type: prod를 사용하여 Pod를 일치하는 노드로 예약하고 라벨 선택기가 없는 노드에서는 예약하지 않는다. 또는 nodeSelector 필드를 생략하여 모든 노드에 예약한다.
  • 1.20 버전에서 fluentd-elasticsearch를 실행한다.
  • 일부 메모리 및 CPU 리소스를 요청한다.

StatefulSet 이란?

StatefulSet은 상태 저장 애플리케이션을 관리하는 데 사용되는 워크로드 API 개체이다. Pod의 일련의 배포 및 확장을 관리하고 Pod의 순서 및 고유성에 대한 보증을 제공한다.

배포와 같이 StatefulSet는 동일한 컨테이너 사양을 기반으로하는 Pod를 관리한다. 그리고 배포와 달리 StatefulSet은 각 Pod에 대해 고정 ID를 유지한다. 이러한 포드는 동일한 사양에서 생성되지만 상호 교환할 수는 없다. 각 Pod에는 일정 변경시 유지되는 영구 식별자가 있다.

워크로드에 대한 지속성을 제공하기 위해 스토리지 볼륨을 사용하려는 경우 솔루션의 일부로 StatefulSet를 사용할 수 있다. StatefulSet의 개별 포드는 실패 할 수 있지만 영구 포드 식별자를 사용하면 기존 볼륨을 실패한 모든 포드를 대체하는 새 포드에 쉽게 일치시킬 수 있다.

StatefulSet 만들기

kubectl apply를 사용하여 StatefulSet를 생성할 수 있다. StatefulSet를 만든 후에는 원하는 개수의 Pod가 항상 실행되고 사용 가능한 상태로 유지된다. StatefulSet는 오류가 발생했거나 해당 노드에서 축출된 포드를 자동으로 교체하고, 새 포드를 StatefulSet의 포드 사양에 정의된 저장소 리소스, 리소스 요청 및 제한, 기타 구성과 자동으로 연결한다.

다음은 서비스 및 StatefulSet 매니페스트 파일 예시이다.

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # Label selector that determines which Pods belong to the StatefulSet
                 # Must match spec: template: metadata: labels
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx # Pod template's label selector
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

예를 들면 다음과 같다.

  • metadata: name 필드로 표시된 nginx라는 서비스 객체가 생성된다. 이 서비스는 labels: app: nginx 및 selector: app: nginx로 표시된 nginx라는 앱을 대상으로 한다.
  • 이 서비스는 포트 80을 노출하고 이름을 web으로 지정한다. 이 서비스는 네트워크 도메인을 제어하고 인터넷 트래픽을 StatefulSet으로 배포한 컨테이너식 애플리케이션으로 라우팅한다.
  • web이라는 StatefulSet은 복제된 Pod(replicas: 3) 세 개로 생성된다.
  • Pod 템플릿(spec: template)은 해당 Pod에 app: nginx 라벨이 지정되었음을 나타낸다.
  • Pod 사양(template: spec)은 버전 0.8에서 nginx-slim 이미지를 실행하는 nginx 컨테이너 한 개가 StatefulSet의 Pod에서 실행됨을 나타낸다. 컨테이너 이미지는 Container Registry에서 호스팅된다.
  • Pod 사양에는 서비스로 열린 web 포트가 사용된다.
  • template: spec: volumeMounts는 www라는 mountPath를 지정한다. mountPath는 스토리지 볼륨이 마운트되는 컨테이너 내의 경로이다.
  • StatefulSet는 1GB의 프로비저닝된 스토리지를 포함하여 PersistentVolumeClaim, www를 프로비저닝한다.

Pod 사양에 포함되는 지침은 다음과 같이 요약할 수 있다.

  • 각 Pod 라벨을 app: nginx로 지정한다.
    각 Pod에서 이름이 nginx인 하나의 컨테이너를 실행한다.
    0.8 버전에서 nginx-slim 이미지를 실행한다.
    Pod에 포트 80이 사용된다.
    데이터를 마운트 경로에 저장한다.
profile
Business & Software 💗🌎

0개의 댓글