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를 실행할 수 있지만, 여러 하드웨어 유형 및 리소스 요구에 따라 다른 구성을 사용하도록 할 수 있다.
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
예를 들면 다음과 같습니다.
Pod 사양에 포함되는 지침은 다음과 같이 요약될 수 있다.
StatefulSet은 상태 저장 애플리케이션을 관리하는 데 사용되는 워크로드 API 개체이다. Pod의 일련의 배포 및 확장을 관리하고 Pod의 순서 및 고유성에 대한 보증을 제공한다.
배포와 같이 StatefulSet는 동일한 컨테이너 사양을 기반으로하는 Pod를 관리한다. 그리고 배포와 달리 StatefulSet은 각 Pod에 대해 고정 ID를 유지한다. 이러한 포드는 동일한 사양에서 생성되지만 상호 교환할 수는 없다. 각 Pod에는 일정 변경시 유지되는 영구 식별자가 있다.
워크로드에 대한 지속성을 제공하기 위해 스토리지 볼륨을 사용하려는 경우 솔루션의 일부로 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
예를 들면 다음과 같다.
Pod 사양에 포함되는 지침은 다음과 같이 요약할 수 있다.