'데이터 엔지니어'로 성장하기

정리하는 걸 좋아하고, 남이 읽으면 더 좋아함

기타/K8S

udemy)CKA 강의 듣고 따라하기_3장_scheduling :: mightytedkim

MightyTedKim 2022. 3. 26. 23:47
728x90
반응형

CKA 강의 듣고 따라하기_3장_scheduling

 

이번 장은 scheduling 부분

예전 부터 궁금했던 부분이라 재밌을 것 같음 ㅎㅎ

+ 후기
수강기간 : 20220326-27(2일)

몰랐던 개념들을 공부하기 시작!
node affinity, taint, tolerations,daemonset,scheduler 등등

특히 node에 할당하는 tain/toleration, nodeaffinity
사용만하고 왜 필요한지 몰랐던 daemonset
잘보지않았떤 scheduler를 더 깊이 볼 수 있어서 의미있었다 

주말은 없어졌지만, 재미있닼

Section 3: Scheduling

2 / 31 | 1hr 50min
 
48. Scheduling Section Introduction 1min
 
49. Download Presentation Deck for this section 1min
 
50. Manual Scheduling 3min
> scheduler 신경쓰지 않고 사용했는데, 재미있을 것 같음ㅎㅎ
 
Scheduler가 없다면, 수동으로 pod를 node에 할당해야됨
nodename을 평소에 쓰지 않는 것은 schdeuler가 node를 선정해주기 때문!
 
pod의 status가 pending이됨
이럴 경우 yaml에 nodeName을 할당해줘야함 (처음 만들때)
이미 만들어졌다면 변경할 수 없음
 
binding 오브젝트를 이용해서 연결해줘야함
 
 
51. Practice Test - Manual Scheduling 0min
> 풀면서 갸우뚱했음. nodeName을 내가 건드릴 일이 없으니까 ㅋㅋ
 
q1. node 할당되지 않아서 pending인것 같은데 어떻게 확인하지?
- k get pod --o wide 로 확인해야하나, descrbie, logs, event 모두 안나오는데
- describe에서도 볼 수 있구나
a1. 확인따위는 안함 ㅋㅋ 그냥 scheduler 안떠있네라고 바로 확인함
 
q2. scheduler가 떠있는지느 확인하지?
a1. k get pods -n kube-system에 kube-scheduler가 없음
52. Solution - Manual Scheduling (optional) 3min
> 답은 51번에
 
53. Labels and Selectors 6min
> 같은 묶음으로 모으는 기준이됨
 
label, selector는 그룹핑하는데 사용함
k get pod --selctor app=App1
 
- label -> key:value
- selector -> replicaset <-> pod 연결은 selector, replicaset의 label은 다른 용도로 사용됨
- anontation: 단순 기록용, version 정보 같은
 

54. Practice Test - Labels and Selectors 1min

> --help로 컨닝해서 문제 풀어음
 selctor 이용해서 특정 pod filter하기
$ k get pod -l env=dev | wc-l
$ k get all -l env=prod,bu=finance,tier=frontend
55. Solution : Labels and Selectors : (Optional) 4min
> 새로운 명령어 배워감
$ k get pods --show-labels
$ k get pod -l env=dev --no-headers | wc-l

56. Taints and Tolerations 10min
> 모르는 개념이 나오기 시작
노드에서 특정 pod를 제외시킬 때 사용

taint(오염) : node마다 설정가능하고, 설정한 노드에는 pod가 스케줄 되지 않음
toleration: pod에 설정하고, taint무시하게 할 수 있음

taint - node
$ k taint nodes node-name key=[value]:[taint-effect]
- NoScheduler | PreferNoScheduler | NoExecute
$ k taint nodes node1 app=blue:Noscheduler

taint, toleration한다고 특정 node에 위치시키지않음. -> callAsNodeaffinity 를 사용해야함

Master노드에 스케줄러가 pod를 할당하지 않는 이유가 이 taint 때문임
$ k describe node controlplane | grep Taint
Taints:             node-role.kubernetes.io/master:NoSchedule
57. Practice Test - Taints and Tolerations 1min
> 처음 써보는 명령어라 진땀 뺏음
q1. taint를 node에 설정하는 법
q2. toleration을 pod에 설정하는 법
q3. taint를 node에서 제거하는 법
$ k taint node controlplane node-role.kubernetes.io/master:NoSchedule
node/controlplane untainted

- taint로 pod 생성 막히면 나오는 event
Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  56s (x2 over 56s)  default-scheduler  0/2 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 1 node(s) had taint {spray: mortein}, that the pod didn't tolerate.
58. Solution - Taints and Tolerations (Optional) 8min
> --recusive 명령어를 배우게됨. 인터넷 안되는 곳에서는 아주 도움이 될 듯!
$ k describe node node01 | grep taint

$ k explain pod --recursive | less 
$ k explain pod --recursive | grep -A5 tolerations
- yaml 옵션값을 볼 수 있음!
59. Node Selectors 3min
> node selector로는 조건 설정에 어려움이 있음
pod를 node에 할당하는 방법

nodeSelector:
  size: Large   

$ k label nodes <node-name> <label-key>=<label-value>
$ k label nodes node-1 size=Large

한계
Large or Medium, not small 조건에는 어려움

60. Node Affinity 7min
> 이 부분은 있다는 것만 알고 나중에 필요하면 다시 검색해봐야겠음
affinity(유연성)

root@controlplane:~# k explain pods --recursive | grep affinity -A25
      affinity  <Object>
         nodeAffinity   <Object>
            preferredDuringSchedulingIgnoredDuringExecution     <[]Object>
               preference       <Object>
                  matchExpressions      <[]Object>
                     key        <string>
                     operator   <string>
                     values     <[]string>
                  matchFields   <[]Object>
                     key        <string>
                     operator   <string>
                     values     <[]string>
               weight   <integer>
            requiredDuringSchedulingIgnoredDuringExecution      <Object>
               nodeSelectorTerms        <[]Object>
                  matchExpressions      <[]Object>
                     key        <string>
                     operator   <string>
                     values     <[]string>
                  matchFields   <[]Object>
                     key        <string>
                     operator   <string>
                     values     <[]string>

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: size
           operator: Equal
           values:
           - Large
           - Medium

      #- key: size
      #   operator: NotIn
      #   values:
      #   - Small

requiredDuringSchedulingIgnoredDuringExecution : 필수
preferredDuringSchedulingIgnoredDuringExecution : 선호
- IgnoredDiringExecution: 실행 중에는 무시한다는거
- RequiredDutingdExecution: 실행 중이면 제외시킴
61. Practice Test - Node Affinity 1min
> 이번 문제는 한개 못풀었음ㅜ
noded에도 label이 있음
62. Solution - Node Affinity (Optional) 7min
> affinity 부분은 그냥 필요할 때 구글링하는걸로
$ k  get nodes node01 --show-labels
$ k label nodes node01 color=blue
$ k get deploy blue -o yaml > blue.yaml
$ vi blue.yaml
# 여기도 k8s document 보고 복사함ㅋㅋㅋㅋㅋ, 나도 그냥 검색해서 할걸
# template.spec.affiity.nodeAffinity

$ k create deploy red --image=nginx --dry-run=client -o yaml > re.yaml
$ vi re.yaml 
# spec에 k8s docu에서 복사한 내용 복붙
63. Taints and Tolerations vs Node Affinity 3min
>
두개 같이 사용해야함.
taint/toleration은 할당 못하게 제한만하지, 어디에 가도록 적용하지는 않음

nodeaffinity로는 특정  node에만 위치시키는거라서
다른 pod들도 해당 node에 설정이되어있을 수있음

이럴때 두개를 섞는거임
64. Resource Requirements and Limits 6min
> 메모리, 디스크 부족으로 문제 많이 생겼는데, 재미있을 것 같음 ㅎ java heap memory, ephemoral stroage

resources:
  requesets: 
    cpu: 1
    memory: 1Gi
  limits:
    cpu: 2
    memory: 2Gi

만약 limit를 넘어가면?
 - cpu는 limit을 넘기 않음
65. Note on default resource requirements and limits 1min
> default limit
memory: 256Mi-512Mi
cpu: 0.5-1

apiVersion
: v1

kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/ 
https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/


66. A quick note on editing PODs and Deployments 1min
>
실행 중인 pod에서는 변경할 수있는게 많지 않음
아래 항목들만 수정가능해서, 되도록이면 yaml로 수정하기
  • spec.containers[*].image
  • spec.initContainers[*].image
  • spec.activeDeadlineSeconds
  • spec.tolerations
67. Practice Test - Resource Requirements and Limits 0min
> 이건 어렵지 않았음
도커랑 비슷
68. Solution: Resource Limits : (Optional) 5min
> 특별한 내용은 없었음
-
69. DaemonSets 4min
>



replicaset과 비슷하지만, node마다 1개씩 생성
- node가 추가/제거되면 함께 추가/제거됨

사용예
- 모니터링, 로그 뷰어
- kube-proxy도 node마다 1개씩 있어야하기 때문에, demonset으로 배포됨
- 네트워크 세팅도 daemonset을 많이 사용함

동작 방식
- 과거 방식 : k8s 1.12까지, 각 node에 nodeName을 적고, node에 할당
- 이후부터 demonset 활용
70. Practice Test - DaemonSets 0min
> daemonset 만드는거 못품 ㅜ
flannel과 fluentd 로깅은 뭐지
- Flannel is an open-source virtual network project managed by CoreOS network designed for Kubernetes.

- For Kubernetes, a DaemonSet ensures that all (or some) nodes run a copy of a pod. To solve log collection, we are going to implement a Fluentd DaemonSet.

71. Solution - DaemonSets (optional) 6min
> daemonset 만드는거 처음 해봄
daemonset은 deployment로 먼저 만들고 수정해야함
daemonset은 replicaset처럼 갯수를 설정하지 않음
72. Static Pods 9min
> 이건 처음 듣는 개념이네

다시 강의 초반의 구조를 보면
k8s는 master와 worker node로 구성되어 있음

master에는 k8s 생태계를 관리해주는
- kube-apiserver, etcd cluster, kube-scheuduler, controll-managere들이 있음
- 만약 이곳들이 없으면? 

cluster없이, kubelet만 있다면 어떻게 관리가될까?
- Kubelet은 pod를 생성할 수 있음.
- api-server가 없어도? -> ㅇㅇ 가능함
- kubelet이 특정 directory를 보게하고, yaml을 거기에 저장하면 됨
  * 주기적으로 해당 directory를 조회하기 때문
  * 이 directory에서 yaml을 지우면, pod가 지워짐
-> 이렇게 생성되는 pod가 Static PODS임
kubeadmin을 이용해서 만들어지는 cluster는 이렇게 만들어짐

[설정]
kubelet.service 설정
--pod-manifest-path=/etc/Kubernetes/manifest
또는
--config=kubeconfig.yaml
kubeconfig.yaml # staticPodPath: /etc/Kubernetes/manifest 

static pod로 pod가 만들어지면, docker ps롭 봐야함
kubectl 명령어는 아직 설치가 되어있지 않기 때문에, 해당 방식으로 조회할 수는 없음

kubelet이 pod를 만드는 방식에는 2개가 있음
1. manifest를 이용하는 방법
2. http endpoint: kube-apiserver를 이용

api-server더 manifest로 만들어진 static pod를 조회할 수 있음
- static pod의 상태를 mirror object를 만들기 때문
- 따라서 수정할 수는 없고, 조회하거나 삭제만 할 수 있음
- ex) static-web-node01

use case
kubelet을 각 node에 설치하고, 각 node에 pod를 만들어야함
- manifest 폴더에 설정파일이 있으면, 알아서 만ㄷ를어짐
$ k get pods -n kube-system

그럼 daemonset과 차이는 뭐지?
1. static pods
- kubelet이 만듦
- control plane 컴포넌트를 배포
2. daemonSets
- kube-api server (Daemoset Controller)
- monitoring agents, logging agest들을 node에 배포
3. 공통점 : kube-scheduler가 무시함

73. Practice Test - Static Pods 1min
>
static pod는 -controlplane 이 뒤에 붙은 것
- etcd, apiserver,c controlmanager, scheduler
- X : proxy, coredns는 아님

root@controlplane:/etc/kubernetes/manifests# ll
total 28
-rw------- 1 root root 2177 Mar 27 07:56 etcd.yaml
-rw------- 1 root root 3802 Mar 27 07:56 kube-apiserver.yaml
-rw------- 1 root root 3314 Mar 27 07:56 kube-controller-manager.yaml
-rw------- 1 root root 1384 Mar 27 07:56 kube-scheduler.yaml

root@controlplane:/etc/kubernetes/manifests# ll
total 32
drwxr-xr-x 1 root root 4096 Mar 27 08:18 ./
drwxr-xr-x 1 root root 4096 Mar 27 07:56 ../
-rw------- 1 root root 2177 Mar 27 07:56 etcd.yaml
-rw------- 1 root root 3802 Mar 27 07:56 kube-apiserver.yaml
-rw------- 1 root root 3314 Mar 27 07:56 kube-controller-manager.yaml
-rw------- 1 root root 1384 Mar 27 07:56 kube-scheduler.yaml
-rw-r--r-- 1 root root  307 Mar 27 08:18 tmp.yaml

root@controlplane:/etc/kubernetes/manifests# k get all
NAME                              READY   STATUS    RESTARTS   AGE
pod/static-busybox-controlplane   0/1     Pending   0          6s

다른 node에 있는 static pod 지우는 것 -> 마지막 문제 못 풀었음 ㅜ
74. Solution - Static Pods (Optional) 11min
> k8s 설정값으로 들어가기 시작함
1. control-plane이 아닌 다른 node에 있는 static pod 지우기

$ k get pod -A
***-node01
$ k get nodes -o wide
#nod01 ip
$ ssh node01_ip
$ cd /var/lib/kubelet/config.yaml
# staticPodPath: /etc/***
$ cd /etc/*** 
# ***.yaml
$ rm ***.yaml
---
2. static pod definition 파일 위치 찾기

$ ps -ef | grep kubelet | grep "\--config"
#grep -i static /var/lib/kubelet/config.yaml

$ grep -i static /var/lib/kubelet/config.yaml 
staticPodPath: /etc/kubernetes/manfiest

---
3 기타
$ k get pod -A | grep "-controlplane" 
$ k run static-busybox --dry-run=client --image=busybox --command sleep 1000 > tmp.yaml

75. Multiple Schedulers 6min
> ssh까지 사용해야될줄 모름 ㅋㅋ
스케줄러가 여러개일 수 있을까?
 추가 검증이 끝난 후 적용이 필요한 경우는 별도의 scheduler를 사용할 수 있음

1. 설정에 scheduler 등록
$ cat kube-scheduler.service
--scheduler-name=default-scheduler
$ cat my-custom-kube-scheduler.service
--scheduler-name=my-custom-scheduler

2. static pod에 scheduler 등록
$ cat /etc/kubernetes/manifest/kube-scheudler.yaml
- --leader-elect=true #겹치면 1개만
$ cat /etc/kubernetes/manifest/my-custom-kube-scheudler.yaml
- --leader-elect=true #겹치면 1개만
- --scheduler-name=my-cusotm-scheduler
- --lock-object-name=my-custom-scheduler

3. scheduler 등록 확인
$ k get pods -n kube-system | grep scheduler
kube-scheduler
my-custom-scheduler

4. 특정 scheduler 사용하도록 pod에 할당
$ cat pod.yaml
spec:
  schedulerName: my-custom-scheduler
76. Practice Test - Multiple Schedulers 1min
> 커스텀 스케줄러 어렵네
커스텀 스케줄러 만드는 예시 못 풀었음
hint봐도 모르겠음 ㅜ
77. Solution - Practice Test - Multiple Schedulers : (Optional) 7min
> 지금까지 풀었던 것 중에 제일 어려웠음
$ cd /etc/kubernetes/manifests
$ cp kube-scheduler /root/my-scheduler.yaml #갑자기  root로 복사한다고?

1. scheduler 생성

$ vi /root/my-scheduler.yaml
#아.. 또 공식문서들간다. ㅋㅋㅋ 아니 봐도 된다고 메모라도 좀 해주던지
- --leader-elect=false
- --scheduler-name-my-scheduler
- --port=10282
- --secure-port=0

---
2. pod 생성할 때 Scheduler 할당
$ k create -f /root/my-scheduler.yaml

root@controlplane:~# cat nginx-pod.yaml 
apiVersion: v1 
kind: Pod 
metadata:
  name: nginx 
spec:
  schedulerName: my-scheduler
  containers:
  - image: nginx
    name: nginx

---
3. 사용된 scheduler 확인
Events:
  Type    Reason     Age   From          Message
  ----    ------     ----  ----          -------
  Normal  Scheduled  76s   my-scheduler  Successfully assigned default/nginx to controlplane
  Normal  Pulling    75s   kubelet       Pulling image "nginx"

---

이런 명렁어도 있네 ㅋㅋ
$ watch "kubectl get pods"
Every 2.0s: kubectl get pods           controlplane: Sun Mar 27 18:00:17 2022

NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          2m41s

78. Configuring Kubernetes Scheduler 1min
>필요할 때 와서 봐야겠다. 메모
advance scheduling 할 때 참고가능한 링크를 나눠줌

 

아래는 다른 챕터 공부 기록

https://mightytedkim.tistory.com/72?category=964188 

 

udemy)CKA 강의 듣고 따라하기_1장 :: mightytedkim

+ 후기 수강기간: 20220322 40분 구조 설명 부분이 기똥차다. 컨테이너 선박에 비유하면서 이야기해주는데 이정도 정성의 강의면 들을 가치가 충분하다고 생각한다. introduction은 어떻게 진행될건지

mightytedkim.tistory.com

https://mightytedkim.tistory.com/88?category=964188 

 

udemy)CKA 강의 듣고 따라하기_2장_핵심개념 :: mightytedkim

+ 후기 기간 : 20220322 ~ 20220326 (5일) 이번 챕터는 문제만 풀고 넘어가도 괜찮았을 것 같다. 특별히 모르는 개념은 없었지만, 그래도 복습한다는 기분이 느껴져서 좋았다 ㅎ 10 ~ 18 - master, worker, contr.

mightytedkim.tistory.com

https://mightytedkim.tistory.com/89?category=964188 

 

udemy)CKA 강의 듣고 따라하기_3장_scheduling :: mightytedkim

이번 장은 scheduling 부분 예전 부터 궁금했던 부분이라 재밌을 것 같음 ㅎㅎ + 후기 수강기간 : 20220326-27(2일) 몰랐던 개념들을 공부하기 시작! node affinity, taint, tolerations Section 3: Scheduling 2..

mightytedkim.tistory.com

 

728x90
반응형