sungsu9022 / study-kubernetes-in-action

study-kubernetes
12 stars 8 forks source link

16. 고급 스케줄링 #16

Open sungsu9022 opened 3 years ago

sungsu9022 commented 3 years ago

16. 고급 스케줄링

파드 스펙의 노드 셀렉터를 통해 특정 노드로 스케줄링되는 것을 수행할 수 있지만, 이것만으로는 특정 니즈를 처리할 수 없기 때문에 쿠버네티스에서는 이를 확장하는 매커니즘을 제공한다.

16.1 테인트와툴러레이션을 사용해 특정 노드에서 파드 실행 제한

테인트와 노드 어피니티 규칙의 차이점 이해

16.1.1 테인트와 툴러레이션 소개

노드의 테인트 구성

스크린샷 2020-09-22 오후 6 39 58
# <key>=<value>:<effect>
# key : node-role.kubernetes.io/master
# value : null
# effect : NoSchedule
# 파드가 이 테인트를 허용하지 않는 한 마스터 노드에 스케줄링되지 못하게 막는다는 의미를 가진다.(이 테인트를 허용하는 파드는 주로 시스템 파드에 해당된다.)
node-role.kubernetes.io/master:NoSchedule
스크린샷 2020-09-22 오후 6 45 13

파드의 톨러레이션 표시하기

스크린샷 2020-09-22 오후 10 30 02

테인트 효과 이해

NoSchedule
PreferNoSchedule
NoExecute

16.1.2 노드에 사용자 정의 테인트 추가하기

# 노드에 테인트  추가
kubectl taint node node1.k8s node-type=production:NoSchedule 

# 파드 생성(deployment)
kubectl run test --image busybox --replicas 5 -- sleep 9999
스크린샷 2020-09-22 오후 10 38 51

16.1.3 파드에 톨러레이션 추가

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: prod
spec:
  replicas: 5
  template:
    metadata:
      labels:
        app: prod
    spec:
      containers:
      - args:
        - sleep
        - "99999"
        image: busybox
        name: main
      tolerations:               # 프로덕션 노드에 파드가 스케줄링 될수 있도록 톨러레이션 추가
      - key: node-type
        operator: Equal
        value: production
        effect: NoSchedule
스크린샷 2020-09-22 오후 10 40 48

16.1.4 테인트와 톨러레이션의 활용 방안

스케줄링에 테인트와 톨러레이션 사용하기

노드 실패 후 파드를 재스케줄링하기까지의 시간 설정

스크린샷 2020-09-22 오후 10 47 25

16.2 노드 어피니티를 사용해 파드를 특정 노드로 유인하기

노드 어피니티와 노드 셀렉터 비교

디폴트 노드의 레이블 검사

스크린샷 2020-09-22 오후 11 24 18

디폴트 노드의 레이블들 중 중요한 요소

16.2.1 하드 노드 어피니티 규칙 지정

노드 셀렉터를 이용한 방식

apiVersion: v1
kind: Pod
metadata:
  name: kubia-gpu
spec:
  nodeSelector:
    gpu: "true"
  containers:
  - image: luksa/kubia
    name: kubia

노드 어피니티 규칙을 이용한 방식

apiVersion: v1
kind: Pod
metadata:
  name: kubia-gpu
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: gpu
            operator: In
            values:
            - "true"
  containers:
  - image: luksa/kubia
    name: kubia

긴 nodeAffinity 속성 이름에 관하여

nodeSelectorTerm 이해

스크린샷 2020-09-22 오후 11 47 52

16.2.2 파드의 스케줄링 시점에 노드 우선순위 지정

노드 레이블링

스크린샷 2020-09-22 오후 11 50 09

선호하는 노드 어피니티 규칙 지정

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: pref
spec:
  replicas: 5
  template:
    metadata:
      labels:
        app: pref
    spec:
      affinity:
        nodeAffinity:        
          preferredDuringSchedulingIgnoredDuringExecution:    # 필수가 아닌 선호 어피니티 속성 지정
          - weight: 80            # 가중치 80의 availability-zone 선호도 지정
            preference:
              matchExpressions:
              - key: availability-zone
                operator: In
                values:
                - zone1
          - weight: 20          # 가중치 20의 share-type 선호도 지정
            preference:
              matchExpressions:
              - key: share-type
                operator: In
                values:
                - dedicated
      containers:
      - args:
        - sleep
        - "99999"
        image: busybox
        name: main

노드 선호도 작동 방법

스크린샷 2020-09-22 오후 11 53 02

노드가 두 개인 클러스터에 파드 배포하기

스크린샷 2020-09-22 오후 11 53 54

16.3 파드 어피니티와 안티-어피니티를 이용해 파드 함께 배치하기

16.3.1 파드 간 어피니티를 사용해 같은 노드에 파드 배포하기

대상 파드 생성

# app=backend 레이블을 붙인 파드 생성
kubectl run backend -l app=backend --image busybox -- sleep 99999

파드 정의에 파드 어피니티 지정

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 5
  template:
    metadata:
      labels:
        app: frontend
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:   # 필수 파드 어피니티 속성
          - topologyKey: kubernetes.io/hostname                      # 동일한 노드에 배포하기 위해 topologyKey를 호스트이름으로 지정
            labelSelector:
              matchLabels:
                app: backend
      containers:
      - name: main
        image: busybox
        args:
        - sleep
        - "99999"
스크린샷 2020-09-23 오전 12 01 40

파드 어피니티를 갖는 파드 배포

스크린샷 2020-09-23 오전 12 20 45 스크린샷 2020-09-23 오전 12 20 50

스케줄러가 파드 어피니티 규칙을 사용하는 방법

스크린샷 2020-09-23 오전 12 25 04

16.3.2 동일한 랙, 가용 영역 또는 리전에 파드 배포

동일한 가용 영역에 파드 함께 배포하기

동일한 리전에 파드 함께 배포하기

topologyKey 작동 방식

스크린샷 2020-09-23 오전 12 29 48

다른 네임스페이스의 파드 참조방법

16.3.3 필수 요구 사항 대신 파드 어피니티 선호도 표시하기

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 5
  template:
    metadata:
      labels:
        app: frontend
    spec:
      affinity:
        podAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:   # 선호 파드 어피니티
          - weight: 80            # 가중치 80의 availability-zone 선호도 지정
            podAffinityTerm:
              topologyKey: kubernetes.io/hostname
              labelSelector:
                matchLabels:
                  app: backend
      containers:
....
스크린샷 2020-09-23 오전 12 35 30 스크린샷 2020-09-23 오전 12 36 05

16.3.4 파드 안티-어피니티를 사용해 파드들이 서로 떨어지게 스케줄링하기

스크린샷 2020-09-23 오전 12 38 38

파드 안티-어피니티를 언제 사용하는가?

같은 디플로이먼트의 파드를 분산시키기 위해 안티-어피니티 사용

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 5
  template:
    metadata:
      labels:
        app: frontend
    spec:
      affinity:
        podAntiAffinity:         
          requiredDuringSchedulingIgnoredDuringExecution:   # 필수의 파드 안티 어피니티 사용
          - topologyKey: kubernetes.io/hostname                       # 같은 노드에서 실행되지 않도록 설정
            labelSelector:
              matchLabels:
                app: frontend
      containers:
      - name: main
        image: busybox
        args:
        - sleep
        - "99999"
스크린샷 2020-09-23 오전 12 41 54

선호하는 파드 안티-어피니티 사용하기