Introduction
node에 관련한 명령어들과 CKA에 나오는 문제유형을 써보겠음.
일단 advanced라 유료결제안했었고 명령어들이 쎄보여서 어려울줄알았는데 pod만드는것보다 쉬운것같음.
따배씨에서 강의 세개인데 쉬워서 그냥 포스팅 하나로 합쳐봄.
문제 유형도 꽤 많이있어서 개꿀주제임.
Summary
- 노드라벨확인 : kubectl get nodes --show-labels
- 노드 특정라벨 확인 : kubectl get nodes -L 라벨키
- 라벨달기 : kubectl label nodes worker1 whos=muzzi
- nodeSelector와 nodeName은 pod의 spec필드 안에 넣어함
- 라벨삭제 : kubectl label node <노드이름> whos-
- 노드 스케줄링 금지 : kubectl cordon 노드이름
- 노스 스케줄링 재개 : kubectl uncordon 노드이름
- 노드 pod다 죽이기 : kubectl drain worker1 --ignore-daemonsets --force
- 노드 taint 확인 : kubectl describe nodes master |$grep taints --color=auto
- 노드 taint 삭제 : kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule-
- 노드 taint 추가 : kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule
- node drain하고 노드 아예 삭제시켜도 될듯. kubeflannel proxy같은 pod들은 어차피 데몬셋컨트롤러로 관리되니까 모든 노드에 다 있으니뭐..
- drain은 파드 다죽이고 node도 cordon시켜주는거임
- 안되면 대부분 옵션 더 적으라고 나오니까 걍 적으면 됨
- grep -i -w 단어 : 단어단위로 해당 단어 단어단위로 들어간것 만 출력해
- echo "1" > 파일경로 : 1이란내용으로 파일만들기
- kubectl get nodes | grep -i -w ready | wc -l : 단어수 카운트해서 출력하기
export samp="--dry-run=client -o yaml"
export grep="grep --color=auto -iC 3"
export now="--force --grace-period 0"
$samp, $grep, $now붙은건 이 명령어로 약어만든거니까 주의
Kubectl Reference Docs
kubernetes.io
# node에 있는 라벨링 확인하기
kubectl get nodes --show-labels
이렇게 기본적인 라벨링들이 되어있다.
꽤 지저분함..
# 특정 라벨만 확인하기
kubectl get nodes -L kubernetes.io/hostname
kubernetes.io/hostname이라는 라벨링만 떼서 확인해볼수있음
# 라벨 추가하기
kubectl label nodes worker1 whos=muzzi
worker1노드에 whos라는 라벨키값에 muzzi꺼라고 라벨링해줬음.
kubectl get nodes -L whos
위에서 배운 커맨드로 확인해보면
이렇게 whos라는 라벨링이 잘 되었다
# 특정 라벨이 있는 노드에만 리소스 배포하기
Assigning Pods to Nodes
You can constrain a Pod so that it is restricted to run on particular node(s), or to prefer to run on particular nodes. There are several ways to do this and the recommended approaches all use label selectors to facilitate the selection. Often, you do not
kubernetes.io
공식문서 링크.
근데 얘는 affinity쓰는것만 나와있음.
nodeLabels & annotation
## NodeLabels 우리는 pod에 라벨링을 해서 service나, deployment 또는 cli 커맨드상에서 selector조건에 맞는 라벨링을 가진 pod들에 대해서 컨트롤하는걸 배웠다. Nodelabels는 이런 pod뿐 아니라, 노드 자체에
jacobowl.tistory.com
affinity에 관해서 쓴 포스팅이 있다.
음 expression차이인듯? 기억이 가물가물..
참고로 mock exam풀때 affinity를 썼는데 난 더 간단한걸 써볼거임
Assign Pods to Nodes
This page shows how to assign a Kubernetes Pod to a particular node in a Kubernetes cluster. Before you begin You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. It is recommended to
kubernetes.io
공식문서 왜 나눠놨는지? ㅅㅂ
이게 노드 라벨에 따라 셀렉하는 거임.
졸라 쉽다.
간단한 pod yaml파일 만들어서
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: muzzi
name: muzzi
spec:
containers:
- image: nginx
name: muzzi
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
nodeSelector:
whos: muzzi
status: {}
이렇게 spec 필드에 nodeSelector을 넣어줬음
만들어보면
이렇게 whos=muzzi가 붙은 worker1노드에 pod가 생긴걸 볼 수 있음
우연일수도 있으니 다시 만들어봐도 계속 저럴거임
deployment로 하면 되겠지
kubectl create deployment testdpnodesel --image=nginx $samp>testdpnodesel.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: testdpnodesel
name: testdpnodesel
spec:
replicas: 5
selector:
matchLabels:
app: testdpnodesel
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: testdpnodesel
spec:
containers:
- image: nginx
name: nginx
resources: {}
nodeSelector:
whos: muzzi
status: {}
whos=muzzi라는 라벨링되어있는 worker1노드에만 deployment pods가 생성된걸 볼 수 있음
참고로 nodeSelector는 pod의 spec필드 안에 써줘야함.. 이거실수했었음
# 더 간단하게 그냥 노드 이름으로 만들어버리기
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: testdpnodesel
name: testdpnodesel
spec:
replicas: 5
selector:
matchLabels:
app: testdpnodesel
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: testdpnodesel
spec:
containers:
- image: nginx
name: nginx
resources: {}
nodeName: worker2
status: {}
nodeName에다가 그냥 대놓고 worker2노드에 pod만들어달라고 함
싹다 worker2노드에 생긴걸 볼 수 있음..
난 mock exam에서 이거 affinity로 풀었었음 ㅠㅠ
# 라벨링 삭제하기
kubectl label node <노드이름> whos-
worker2에 whos=dori라는 라벨링이 사라졌다
현업에서는 expression을 더 사용하겠지만 CKA수준에선 그냥 이정도만 알아도 쉽게풀듯
# cordon / 노드 스케줄링 막기
Kubectl Reference Docs
kubernetes.io
reference에서 cordon찾으면 저렇게 쓰래.
kubectl cordon 노드이름
worker1을 cordon명령어 쓰니까 저렇게 status에 schedulingDisabled라고 뜨게됨
deployment를 만들어보니 worker2노드에만 생기는걸 볼수있음.
참고로 testdpnodesel deployment는 nodeName필드 지워주고 만든거임
# uncordon
그냥 스케줄링 금지된 node에서 다시 배치할수있게 해주는거임
kubectl uncordon worker1
개단순..
# cordon한다고 해당 node에 있는 pod들이 다 죽는건 아님.
cordon한 worker2에 있던 deployment pod들이 그대로 잘 동작하고 있음
다 죽이려면 drain을 사용해야함
# drain
reference에 저렇게 써져있음
현재 worker1과 worker2노드에 deployment pods들이 분산되어있음
drain명령어를 써봤더니 데몬셋같은건 안되고 flannel이 데몬셋으로 배포된거라 저 --ignore머시기 옵션을 써달래
force도 써달래..
kubectl drain worker1 --ignore-daemonsets --force
worker1에 있던 deployment pods들이 다 지워지고 worker2에 생겨남
drain하면 worker1노드는 스케줄링이 금지된다
# pod들은 옮겨간게 아니라 재생성된거임
분명 일반 단일 pod인 muzzi가 하나 있었는데
drain하고나서 deployment pods들은 다섯개로 worker2에 있고 갯수도 다섯개임
deployment pods들은 컨트롤러에 관리되니까 worker1에 있는 pods들을 다 지우고 컨트롤러가 나머지 pods들을
worker2에 만들어준거임
컨트롤러에 관리안되는 muzzi pod는 그냥 지워진거고..
# taint
taint reference에는 이렇게 생겼음
다양한 taint가 있는데 그냥 단순히 우리는 스케줄링만 알면된다.
kubectl describe nodes |$grep taints --color=auto
이건 좀 헷갈리니까
각각 node들을 검색해보면
kubectl describe nodes master |$grep taints --color=auto
master node에만 noSchedule이 있다.
때문에 우리가 지금까지 pod를 생성해도 master node에는 안생겼던 거임
# master node에도 스케줄링 되게하기
kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule-
라벨빼는거랑 비슷하다
스케줄링 master에도 되게했음
deployment를 만들어보면,
master노드에도 deployment pods가 스케줄링된걸 볼 수 있음
되돌리려면
kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule
하이픈뺴고 하면 다시 달아짐.
'k8s > CKA' 카테고리의 다른 글
Mock Exam - 2 (0) | 2024.09.24 |
---|---|
role & rolebinding / clusterRole & clusterRolebinding / service account (0) | 2024.09.20 |
따배씨 / ETCD Backup & Restore (0) | 2024.09.12 |
Practice Test / Backup and Restore Methods (0) | 2024.09.12 |
Practice Test / Persistent Volume Claims (0) | 2024.09.09 |