12. 1 노드 셀렉터
파드가 클러스터 안 어떤 노드에서 실행될 지를 키-값 쌍으로 결정함.
노드에서도 레이블 설정이 가능한데 보통 노드의 환경(os, arch 등)을 적어둠.
- 노드에 레이블 추가
‘ kubectl label nodes “노드이름” 레이블키=레이블값 ’ - 파드에 노드셀렉터 설정
spec.nodeSelector 에 키값을 설정함
-> 해당 레이블을 가진 노드에 실행될 것임을 설정할 수 있음.
12.2 어피니티와 안티 어피니티
- 노드 어피니티
노드셀렉터와 비슷하게 노드의 레이블 기반으로 파드를 스케줄링함.
- spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution : 스케줄링하는 동안 꼭 필요한 조건
.nodeSelectorTerms[].matchExpressions[]
.key : 노드 레이블 키
.operator : 키가 만족할 조건
In : values[]에 설정한 값중 레이블과 일치하는게 하나라도 있으면 됨
NotIn : 값이 모두 맞는지 확인
Exists : 키를 노드가 가지면 됨 - spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution : 스케줄링하는 동안 만족하면 좋은 조건
2. 파드의 어피니티와 안티 어피니티
- 어피니티
디플로이먼트나 스테이트풀세트로 파드를 배포했을 때 파드 사이의 관계를 정의함.
서로 자주 통신하는 파드들을 같은 노드에 배치하도록 하여 효율을 높임
.spec.template.spec.affinity
.podAffinity : 해당 레이블 키-값에 해당하는 노드에 배치함
.topology : 파드에 노드를 배치할 때 사용할 기준을 설정함
어피니티 혹은 안티어피니티의 기준을 만족할 시, topology에 설정된 기준으로 다른 노드에 파드를 실행함.
- 안티 어피니티
하드웨어 자원을 많이 사용하는 앱 컨테이너가 있을 때 여러 노드로 파드를 분산함
.spec.template.spec.affinity
.podAntiAffinity : 해당 레이블 키-값에 해당하는 노드에 배치를 피함 -> 파드 2개이상 같은 노드에 속하지 못함
12.3 테인트와 톨러레이션 사용하기
테인트를 설정한 노드에는 파드들을 스케줄링 하지 않음.
테인트를 설정한 노드에 파드들을 스케줄링하려면 톨러레이션을 설정해야함.
-> 노드를 특정 역할만 하도록 만들 떄 사용함
‘ Kubectl taint nodes “노드이름” 키=값:효과 ‘ : 테인트 설정
‘ Kubectl taint nodes “노드이름” 키=값:효과- ‘ : 테인트 해제
- 테인트가 설정된 노드에 파드를 실행시키기 위해 톨러레이션 설정하기
.spec.template.spec.tolerations[] : 테인트가 설정된 노드의 키-값을 적어 배치되도록 함
- 테인트와 톨러레이션의 하위 필드
.spec.template.spec.tolerations[].effect : 효과
.NoSchedule : 톨러레이션 설정이 없으면 파드를 스케줄링 하지 않음.
.PreferNoSchedule : 톨러레이션 설정이 없으면 파드를 스케줄링 하지 않음. 단, 클러스터 안 자원이 부족하면 테인트를 설정한 노드에도 스케줄링 가능.
.NoExecute : 톨러레이션 설정이 없으면 파드를 스케줄링 하지 않음. 기존 파드도 톨러레이션 설정이 없으면 종료시킴
.spec.template.spec.tolerations[].operator :
.Exists : 앞 세가지 필드를 선별해서 사용함. 만약 .key값만으로 톨러레이션 설정시 파드의 key값만 비교하여 같을 시 스케줄링함.
.Equal : .key, .value, .effect값이 원하는 테인트의 설정값과 모두 같은지 확인
12.4 클러스터를 관리하는 커든과 드레인
특정 노드에 있는 파드들을 모두 다른 노드로 옮기거나 특정 노드에 파드들을 스케줄링 하지 않도록 제한할 수 있음
- 커든 설정하기
‘ Kubectl cordon “’노드이름” ‘ : 지정된 노드에 추가로 파드를 스케줄링해서 실행하지 않도록 함.
해당 노드에 커든 설정 시, Status에 SchedulingDisabled 가 추가됨
‘ Kubectl uncordon “노드이름” ‘ : 노드에 정상적으로 파드를 스케줄링하기
새로 생성된 파드가 노드에 배치됨. (이전에 설치된 것들은 자동이동이 안됨)
2. 드레인 설정하기
지정된 노드에 있는 파드들을 다른 노드로 이동시키기
‘ Kubectl drain “노드이름” ‘
( 데몬세트로 실행한 파드들은 드레인 설정을 할 수 없음. 데몬세트가 즉시 재실행시키기 때문. —ignore-daemonsets=true 옵션과 함께 명령 실행함)
( 컨트롤러로 생성되지 않은 파드들은 —force 명령으로 drain명령을 실행시킴. 강제로 삭제시 파드는 사라짐. )
( 스태틱파드는 kubelet이 kube-apiserver 컴포넌트로 실행하지 않았으므로 삭제되지 않음. 드레인 설정을 적용시 그레이스풀하게 종료됨 )
먼저 새로운 파드를 노드에 스케줄링해서 실행하지 않도록 설정함.
- Annotation
- Kubernetes.io/config.source : file
config.source가 file에서 실행되었음
- Kubernetes.io/config.mirror : “해시값”
config.mirror의 해시값을 확인할 수 있음.
‘ Kubectl uncordon “노드이름” ‘ : 드레인 설정 해제 (커든 해제 명령과 같음)
'DevOps > Kubernetes' 카테고리의 다른 글
[ 쿠버네티스 입문: 90가지 예제로 배우는 컨테이너 관리 자동화 표준 ] Chapter14. 데이터 저장 (0) | 2021.07.22 |
---|---|
[ 쿠버네티스 입문: 90가지 예제로 배우는 컨테이너 관리 자동화 표준 ] Chapter13. 인증과 권한 관리 (0) | 2021.07.21 |
[ 쿠버네티스 입문: 90가지 예제로 배우는 컨테이너 관리 자동화 표준 ] Chapter11. 시크릿 (0) | 2021.07.21 |
[ 쿠버네티스 입문: 90가지 예제로 배우는 컨테이너 관리 자동화 표준 ] Chapter10. 컨피그맵 (0) | 2021.07.21 |
[ 쿠버네티스 입문: 90가지 예제로 배우는 컨테이너 관리 자동화 표준 ] Chapter09. 레이블과 애너테이션 (0) | 2021.07.21 |