CKA 공부 6일차
in Devops on Kubernetes
스케쥴링
스케쥴러가 없으면 노드에 있는 파드들의 관리를 직접해야한다.
k8s에서는 스케쥴러 없이 매뉴얼로 스케쥴링하는 기능을 제공한다.
파드 디피니션 설정에 nodeName을 주어서 특정 노드에만 파드를 배포시킬 수 있다.
binding yaml 파일에 타겟 노드를 지정하고 파드에 바인딩 API로 해당 yaml 파일을 전송해서 특정 노드에만 스케쥴되게 할 수도 있다. (쬐끔 귀찮지만 이미 배포된 파드에서 써볼만 한 듯)
Label, Selector, Annotation
Label
이름 그대로 라벨링을 위한 용도
여러 개의 k8s 오브젝트들을 라벨링해서 나중에 찾기 쉽게 해준다.
라벨은 key, value로 자유롭게 설정이 가능하다. 가령
age: 18
과 같은 값도 가능하다.k8s 내에서 라벨은 유니크한 값이어야한다.
그래서 보통 라벨은 해당 서비스의 타입
type: froent-end
정도로 쓰인다.
Selector
존재하는 라벨을 선택하는 용도이다.
라벨링된 오브젝트들을 선택하는 용도인데, 가령 예를 들어 레플리카셋에서 파드의 레이블을
type: back-end
라고 했으면, 레플리카의 라벨을 설정하고, 파드 스펙안에서 셀렉터는 파드를 바라보게 해야한다.이렇게 설정된 레플리카에 서비스를 적용하고 싶다면 서비스의 셀렉터로
type: back-end
를 지정하기만 하면 간단하게 해당 서비스와 레플리카셋을 묶어주는 것이 가능하다.
Annotation
오브젝트에 메타데이터를 추가하는 용도로 사용된다.
이름 그대로 주석의 의미를 가지며, 애플리케이션의 버전, git 브랜치 등등을 정의해줄 수 있다.
k8s 오브젝트에 메타데이터를 남기고 싶은 경우에 사용할 수 있을 듯 하다.
Taints and Toleration
- Taints는 노드에 Toleration이 적용된 파드만 배포될 수 있게 하는 옵션이다.
kubectl taint node node-name key=value:traint-effect
Taints에는 3가지 옵션을 줄 수 있는데
NoSchedule
,PreferNoSchedule
,NoExecute
가 그 예시이다.NoSchedule
은 이름 그대로PreferNoSchedule
는 시스템이 가급적이면 파드를 해당 노드에 배포안해줄 것이지만, 보장은 못한다… 정도의 옵션이다.NoExecute
는Taint
를Tolerate
할 수 없는 파드가 배포되지 못하게 함은 물론이고, 이미 노드에 배포된 파드가Taint
를Tolerate
할 수 없다면 제거한다.여기서 중요한 사실이
NoExecute
에서Taint
노드의Toleratation
를 가진 파드가 항상Taint
노드에 배치되는 것은 아니다. 전혀 엉뚱한 노드에 배치될 가능성도 존재한다.그러나 여기서
Taint
노드는 반드시 특정Toleration
을 가진 파드만 허용해준다 것을 기억하자.만약 어떤 파드가 특정 노드에만 배포되길 원한다면 이는
node affinity
라는 다른 컨셉을 배워야하는데 이건 곧 배운다.또 하나 재밌는 사실은 스케쥴러가 마스터 노드에는 어떤 파드도 스케줄 하지 않는다는 사실이다.
이 역시도
Taint
와 관련이 있는데, k8s 클러스터가 구성될 때 마스터 노드에는 어떤 파드도 스케줄 되지 않게 클러스터가 마스터 노드에Taint
한다.- 가장 이상적인 것은 사실 마스터 노드에는 어떤 애플리케이션도 배포하지않는 것이 좋다고 한다.