반응형
Kubernetes에서 특정 노드에 Pod이 할당되게끔 하는 방식은 대표적으로 taint & toleration 를 사용하는 방식이 있다.
- taint: 노드(Node)에 적용해서 특정 Pod이 해당 노드에 스케줄링 되지않도록 막는 역할을 함. 예를 들어, 노드가 특정 리소스가 부족하거나 유지보수 중일때 사용됨.
- toleration: Pod에 적용되어 특정 노드의 taint를 무시하고 그(해당) 노드에 스케줄링 될수 있도록 허용하는 역할을 함.
Taint
taint에는 "key=value:effect" 형식으로 사용할수있고. effect에는 아래 3가지 옵션을 사용 할 수 있음.
- NoSchedule: 이 taint가 설정되면 toleration이 없는 Pod은 스케줄링되지않음. 또한, 기존 실행되던 pod에는 적용이 안됨.
- PreferNoSchedule: 이 taint가 설정되면 toleration이 없는 Pod은 되도록 스케줄링되지않게함. 여기서 "되도록"이라는건 만약에 다른 노드에 리소스가 부족해지면 어쩔수없이 PreferNoSchedule taint가 설정된 노드에 pod이 뜨게됨
- NoExecute: 이 taint가 설정되면 pod이 스케줄링안되고, 기존에 해당 노드에서 실행되던 pod도 toleration이 없으면 종료가됨.
노드에 taint를 설정하는 kubectl 명령어는 다음과 같음
kubectl taint node {NODE_NAME} {key}={value}:{option}
Toleration
toleration은 위에서 설정한 taint를 무시하고 해당 노드에 Pod이 할당되게끔 설정할수있다. 아래는 예시이다.
- 첫번째 toleration는 taint를 설정한 key value를 확인해서 완전히 동일(Equal)할 경우
- 두번째 toleration은 taint를 설정한 key가 존재(Exists)할 경우 value는 상관없음. tolerationSeconds를 설정할 경우에는 해당 시간동안은 taint를 무시하고 pod을 생성할수있지만 그 이후에는 종료가됨.
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: nginx
image: nginx:1.21
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key2"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 3600
toleration에 사용되는 operator는 다음과같이 존재함.
- Exists: 해당 operator는 key만 사용되고 value는 필요하지않음. 특정 'key'가 있는 모든 taint를 허용함.
- Equal: 해당 operator는 key와 value 모두를 사용하고 두개의 값이 정확히 일치하는 taint만 허용됨.
nodeAffinity
taint를 설정하면 toleration으로 특정 노드에 Pod을 할당되게끔 설정할수있음. nodeAffinity는 taint를 보지않고, 특정 노드에 존재하는 "라벨"을 보고 Pod을 배치하게됨.
동작 방식:
- 노드의 라벨(key-value 쌍)에 따라 파드가 특정 노드에 스케줄링되도록 제어함
- nodeAffinity는 주로 "이 파드는 특정 라벨을 가진 노드에 배치되길 원한다"는 선호도를 설정하는 방식임
- requiredDuringSchedulingIgnoredDuringExecution: 필수 조건을 만족하는 노드에만 파드가 스케줄링됨.
- preferredDuringSchedulingIgnoredDuringExecution: 최대한 특정 조건을 만족하는 노드에만 스케줄링되게끔하지만, 특수한 상황(리소스 부족등)일 경우엔 할당 될 수 있음.
아래는 예시 pod yaml파일
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: nginx
image: nginx:1.21
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "disktype"
operator: "In"
values:
- "ssd"
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: "region"
operator: "In"
values:
- "us-west-1"
nodeAffinity의 operator는 4가지가 존재함.
- In: 특정 key에 대한 지정된 value 목록중 하나라도 일치 할 경우
apiVersion: v1
kind: Pod
metadata:
name: affinity-example
spec:
containers:
- name: nginx
image: nginx:1.21
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "disktype"
operator: "In"
values: ["ssd", "nvme"]
- key: "region"
operator: "NotIn"
values: ["us-east-1"]
- NotIn: In과 반대
- Exists: 특정 key만 존재하면 참으로 반환
- DoesNotExist: Exists와 반대
요약
- Toleration은 노드의 taint를 무시할 수 있도록 하여 파드가 해당 노드에 스케줄링될 수 있게 하는 반응적인 설정
- Node Affinity는 파드가 특정 라벨을 가진 노드에 배치되도록 하는 선호도 또는 필수 조건을 지정하는 설정
반응형
'Develop > DevOps' 카테고리의 다른 글
[Grafana] database is locked 에러 대응 + DB migration (2) | 2024.10.17 |
---|---|
[Go] Golang을 공부하면서 알게된것들 (0) | 2024.08.13 |
[Harbor] kubernetes 환경 harbor admin 초기 비밀번호 reset하는 방법 (0) | 2024.08.05 |
[Grafana] Helm chart grafana 생성 동시에 초기 대시보드 구축방법 (0) | 2024.07.15 |
[Git] .gitignore를 환경에 따라 쉽게 생성하는법 (0) | 2024.07.02 |