본 포스팅은 Udemy Certificated Kubernetes Administrator 강좌를 공부한 내용입니다.
DaemonSet
Kubernetes의 node를 모니터링한다고 생각해보자.
각 node에는 docker daemon에서 모이는 로그, node의 CPU/Memory 사용량 등 수집해야할 정보가 많다.
이런 데이터를 수집하는 agent가 모든 node에 배포되어 이를 중앙 저장소에 모은다고 했을 때,
이 agent를 Pod로 생성할 수 있을까?
이를 위해서는 Pod가 모든 node에 하나씩 생성되어 있어야 한다.
이를 위해 있는 것이 DaemonSet이다.
Node가 새로 생성되거나 삭제될 때 DaemonSet의 Pod 역시 생성/삭제 된다.
DaemonSet을 생성하는 방법은 Deployment와 유사하다.
apiVersion: apps/v1
kind: DaemonSet
metadata:
creationTimestamp: null
labels:
app: elasticsearch
name: elasticsearch
spec:
selector:
matchLabels:
app: elasticsearch
template:
metadata:
creationTimestamp: null
labels:
app: elasticsearch
spec:
containers:
- image: k8s.gcr.io/fluentd-elasticsearch:1.20
name: fluentd-elasticsearch
resources: {}
$ kubectl create -f daemonset.yaml
daemonset.apps/elasticsearch created
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
elasticsearch-l87cf 1/1 Running 0 29s 10.44.0.1 node01 <none> <none>
$ kubectl get daemonset
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
elasticsearch 1 1 1 1 1 <none> 34s
DaemonSet 역시 Pod이기 때문에 이전에 배운 Taint와 NodeAffinity가 마찬가지로 적용될지 살펴보자.
Taint & Toleration
$ kubectl taint nodes node01 color=red:NoExecute
node/node01 tainted
$ kubectl get daemonset
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
elasticsearch 0 0 0 0 0 <none> 3m14s
$ kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready master 5m8s v1.16.0
node01 Ready <none> 4m25s v1.16.0
color=red taint를 node01에 적용했더니 DaemonSet의 Pod 갯수가 0이 된걸 확인할 수 있다.
master node 역시 node-role.kubernetes.io/master:NoSchedule taint가 설정되어 있어 Pod가 생성되지 않았다.
Node Affinity
apiVersion: apps/v1
kind: DaemonSet
metadata:
creationTimestamp: null
labels:
app: elasticsearch
name: elasticsearch
spec:
selector:
matchLabels:
app: elasticsearch
template:
metadata:
creationTimestamp: null
labels:
app: elasticsearch
spec:
containers:
- image: k8s.gcr.io/fluentd-elasticsearch:1.20
name: fluentd-elasticsearch
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: In
values:
- small
$ kubectl label node node01 size=large
$ kubectl create -f daemonset-small.yaml
daemonset.apps/elasticsearch created
$ kubectl get daemonset
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
elasticsearch 0 0 0 0 0 <none> 12s
size=large 로 label이 된 node에 NodeAffinity size=small인 daemonset의 pod가 생성되지 않은 것을 확인할 수 있다.
참고로 Node Affinity는 kubernetes 1.12 버전 이후에 적용되었다고 한다.
Static Pod
Kubernetes는 위 그림처럼 Control Plane과 kubelet에 의해 관리되는 Worker Node들이 존재한다.
Control Plane의 역할을 하는 api-server, kube-scheduler 등이 없다면 Worker Node는 동작하지 않을까?
각 노드에서 Container를 실행시키고 관리하는 것은 kubelet이기 때문에 Control Plane이 없더라도 각 Worker Node는 정상 동작한다.
하지만 yaml 형식으로 api-server에 Pod 생성을 스케쥴링할 수 없게 된다.
kubelet은 각 node에 특정 path(/etc/kubernetes/manifests)에서 control plane이 아닌 노드 자체적으로 생성하고 관리할 수 있는 Pod yaml을 가지게 할 수 있다.
여기서 생성되는 Pod는 api-server를 통해서가 아닌 kubelet이 자체적으로 path로부터 pod를 생성/재생성/삭제 한다.
이를 Static Pod이라고 한다.
Static Pod을 이용하는 곳은 어디일까?
Master Node에서 Control Plane의 역할을 하는 Pod를 Static Pod을 이용해 생성할 수 있다.
Static Pod는 kubelet이 api-server에 pod에 대한 정보를 주기 때문에 kubectl을 사용해 조회가 가능하다.
'Kubernetes > CKA' 카테고리의 다른 글
CKA 준비 (10) - Cluster Upgrade (0) | 2020.06.19 |
---|---|
CKA 준비 (9) - Monitoring & Logging (0) | 2020.06.16 |
CKA 준비 (7) - Scheduling 2 (Node Selector, Node Affinity) (0) | 2020.06.09 |
CKA 준비 (6) - Scheduling 1 (Manual, taint and toleration) (0) | 2020.06.07 |
CKA 준비 (5) - namespace, service (0) | 2020.06.07 |