기타/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로 수정하기
|
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
https://mightytedkim.tistory.com/88?category=964188
https://mightytedkim.tistory.com/89?category=964188
728x90
반응형