0부터 시작하는 Kubernetes 공부 - Affinity & Selector & Taint

Jaehong Lee·2023년 6월 2일
2
post-thumbnail

Scheduler Filter & Pod 배치 설정

Scheduler Filtering

Pod가 배치될 Node가 선정되기 위해선 아래 3가지 필터를 순차적으로 거친다

  • Schedular는 Pod가 배포될 적합한 Node 리스트를 생성하기 위해 먼저 Filtering을 한다
  1. 볼륨 필터 : pod를 생성되고자 하는 디스크 볼륨에 대해서 노드가 지원할 수 있는 확인하고, 마운트 되는 볼륨이 충돌되는지 확인한다. 사용자가 Node Affinity를 통해 특정 Node에만 Volume을 생성하게 했는지도 확인한다

  2. 리소스 필터 : 파드가 배포될 충분한 리소스를 가지고 잇는지 확인. 네트워크 포트도 체크한다

  3. 토폴로지 필터 : pod affinity, node selector, taint - toleration 을 확인하여 파드가 해당 노드에서 실행될 수 있는지 확인한다

    • 토폴로지 : 컴퓨터 네트워크 요소들을 물리적으로 연결해 놓은 것 혹은 연결 방식

Filtering을 거쳐서 Pod가 배치될 수 있는 Node들의 리스트가 생성되면, Scoring을 통해 최적의 Node를 선택한다. 이후 Binding을 통해 Pod와 해당 Node를 묶는다


Pod 배치 설정

사용자는 Pod가 특정 Node에만 배치되게, 혹은 Node에 특정 Pod만 허용하게 설정할 수 있다

  • Nodename, Node Selector, Node Affinity, Pod Affinity, Taint / Toleration 이 있다

    • Taint / Toleration을 통해 Node를 필터링 하여 배치될 Node를 선정할 수 있다
    • Nodename, Node Selector, Affinity를 통해 배치될 Node를 선택할 수 있다
  • 쿠버네티스의 Node를 용도에 맞게 구분할 수 있다. 이때, 용도에 맞게 Pod를 배치하기 위해 Label과 Label을 선택할 Node Selector & Affinity & Taint 기능을 사용한다

토폴로지 분재 제약 조건인 topologySpreadConstraints를 이용하여 클러스터에 걸쳐 Pod가 분배되는 방식을 제어할 수 있다


Nodename & Node Selector

Nodename

  • nodename은 pod 배포 시, 배포될 node의 이름을 명시하는 방법

  • nodename은 node selector나 affinity보다 우선적으로 적용된다 ( overrule )

  • 단점 : 클라우드 환경에 노드 이름은 항상 안정적이거나 예측가능하지 않으므로 만약 해당 노드 이름이 없어진 경우 파드가 실행되지 않으며, 해당 노드의 리소스가 없는 경우 파드 배포가 실패한다


Node label & Node selector

  • node 역시 쿠버네티스 오브젝트로 관리되기에 label을 할당할 수 있다

  • nodeselector를 통해 배치할 node의 label을 지정하여, 해당 node에 파드 배치가 가능하다

    • label : 쿠버네티스 클러스터 상의 오브젝트를 식별하기 위한 key-value 쌍의 메타 정보
    • selector : label을 이용해 쿠버네티스 클러스터 상의 오브젝트를 필터링하고, 원하는 오브젝트를 구하기 위한 기능
    • annotation : 메타데이터로 쿠버네티스 시스템이 필요한 정보를 표시한다. 필드, 사용자 지시사항, 이미지 정보 등과 같은 메타데이터를 설정할 수 있다

Affinity

Affinity

  • pod 배치간에 선호 사항을 설정할 수 있는 리소스로, matchExpressions을 이용하여 nodeselector보다 더 다양한 조건을 제시할 수 있다

    • matchExpressions는 operator 필드를 통해 논리 연산자 지정 가능 → key, value, operator 로 구성
  • 노드를 기준으로 하는 node affinity와 파드를 기준으로 하는 pod affinity, anti affinity가 있다

  • 옵션을 통해 하드한 규칙과 소프트한 규칙을 설정할 수 있다

    • 소프트한 규칙 : 반드시 충족해야하는 hard가 아닌, 선호하는 조건을 말한다

Affinity 옵션

Node Affinity, Pod Affinity, Pod Anti Affinity 등 모든 Affinity는 옵션을 통해 Hard / Soft 설정이 가능하다

  • requiredDuringSchedulingIgnoredDuringExecution : 규칙이 만족되지 않으면 파드를 스케줄링 불가. 기존에 존재하는 파드들은 이 조건을 무시 ( hard )

  • preferredDuringSchedulingIgnoredDuringExecution : 해당 규칙을 선호하며, 만족되지 않아도 파드를 스케줄링한다. 기존에 존재하는 파드들은 이 조건을 무시 ( soft )

    • 가중치 설정 가능 → 조건에 맞는 노드를 찾으면, weight 값 계산을 통해 가중치 값이 가장 높은 노드에 스케줄링 한다

ignoredDuringExecution을 RequiredDuringExecution으로 바꾸면, 실행중인 파드에 대해서도 해당 규칙을 적용한다

  • 옵션의 앞 부분은 Scheduling 되는 Pod에 대한 옵션이고, 뒷 부분은 이미 실행중인 Pod에 대한 옵션이다

Node Affinity

  • 선호하는 노드를 선택하는 방법으로 Node Selector 보다 확장된 Label Selector 기능을 지원한다

  • Node Label을 기준으로 Pod를 Scheduling 한다

  • Node Selector와 함께 설정할 수 있으며, 둘 다 설정되어 있다면, 두 조건을 만족하는 Node에 Pod가 배치된다


Pod Affinity

  • 선호하는 파드를 선택하는 방법으로 Node의 Label 대신, 각 노드에 실행중인 Pod의 Label을 기반으로 스케줄링될 노드를 제한한다

  • 토폴로지키를 통해 label selector를 수행할 노드의 범위를 설정한다. 노드 단위, 존 단위, 리전 단위로 설정 가능

    • 토폴로지키에 설정한 단위의 범위에 적용되며, 특정 규칙을 만족하는 pod가 존재하는 노드에 배치되게 한다

Pod Anti Affinity

  • 선호하지 않는 파드를 선택하는 방법으로, 구현은 Pod Affinity와 비슷하다

  • 토폴로지키에 설정한 단위의 범위에 적용되며, 특정 규칙을 만족하는 Pod가 존재하는 Node에는 배치되지 않게 한다

  • 만약, Pod Anti Affinity를 requiredDuringSchedulingIgnoredDuringExecution 모드로 설정하면, 각 Node에는 하나의 파드만 스케줄링 될 수 있다. 이를 통해, 동일한 Pod가 서로 다른 노드에서 실행되어야 할 때 사용되기도 한다

profile
멋진 엔지니어가 될 때까지

0개의 댓글