k8s/CKA

따배씨 / node selector, drain, taint

부엉이사장 2024. 9. 13. 08:57
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들은 옮겨간게 아니라 재생성된거임

drain전 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

하이픈뺴고 하면 다시 달아짐.