티스토리 뷰

여러가지 pod 스케쥴링 기법을 적절하게 잘 활용하여야 한다

  1. 일반적인 배포방법 (deploy,statefulset,daemonset)

각각의 pod 컨트롤러를 사용하여 기본적으로 배치

deployment = 수량에 맞게 적절하게 배포됨

statefulset = 수량에 맞게 순서대로 headless서비스와 pv를 붙힐수 있음

daemonset = 모든 노드에(혹은 노드셀렉터 사용) 원하는 파드를 배치

  1. 일반적인 배포 + 노드셀렉터 사용

파드를 배치할때 노드 셀럭터를 이용하여 특정 노드나 특정 노드그룹에만 파드를 스케쥴 할 수 있음

  1. 일반적인 배포 + 어피니티 사용

어피니티를 사용하면 좀더 복잡한 전략을 사용하여 파드를 스케쥴링 할 수 있음

어피니티도 기본은 레이블링 이지만 노드/파드를 다 선택하여 파드를 배치 할 수 있는데

이는 특정 파드가 생성된 노드에 배치를 시키거나 특정 파드가 있는 노드를 회피하는 등으로 파드의 스케쥴링 방법을 크게 확장 시킬 수 있다

노드어피티니

노드어피니티는 기본적으로는 노드셀렉터와 비슷하지만 아래의 두가지 옵션으로 차이점이 있다

 

requiredDuringSchedulingIgnoredDuringExecution

 

required는 규칙을 반드시 만족해야 하는 조건으로 노드셀렉터와 비슷하게 사용 할수 있다

 

preferredDuringSchedulingIgnoredDuringExecution

 

preferred의 경우 가능하면 조건의 만족하는 노드에 배치되나 만족하지 않는 경우 조건에 맞지 않는 노드에도 배치 될수 있다

required를 hard로 preferred를 soft로 생각하면 이해가 쉽다

  • 사용예제
apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/e2e-az-name
            operator: In
            values:
            - e2e-az1
            - e2e-az2
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value
  containers:
  - name: with-node-affinity
    image: k8s.gcr.io/pause:2.0

위 예제로 배포한 파드는 노드의 레이블을 체크하여 kubernetes.io/e2e-az-name 키의 값이 e2e-az1 e2e-az2인 노드에만 배포가 된다 해당 키와 값이 있는 노드가 없다면 파드는 그 어디에도 배치되지 않는다

또한 해당 값이 있는 노드들 중 키가 another-node-label-key이고 값이 another-node-label-value를 가진 노드를 선호하도록 선언했다 해당값이 없는 노드라도 파드는 배치될수 있으나 있는 노드가 있다면 해당 노드에 배치가 된다

 

파드 어피니티와 안티어피니티

파드의 경우 어피니티와 안티어피니티 두가지를 사용 할 수 있다

어피니티는 노드와 동일하게 사용하고 안티어피니티는 특정 pod가 배치된 노드를 회피하기 위해 사용 한다

  • 사용예제
apiVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - S1
        topologyKey: topology.kubernetes.io/zone
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: security
              operator: In
              values:
              - S2
          topologyKey: topology.kubernetes.io/zone
  containers:
  - name: with-pod-affinity
    image: k8s.gcr.io/pause:2.0

위 예제로 배포되는 파드는 어피니티+required로 인해 security: S1값이 레이블링 되어있는 하나이상의 이미 실행중인 파드와 동일한 노드에만 스케쥴 할수 있다

해당 파드가 없다면 이 파드는 스케쥴링 되지 않는다

안티어피니티+preferred로 인하여 파드의 레이블 중 security: S2값이 있는 파드가 배치되어있는 노드를 회피하도록 설정 하였다

  • 어피니티를 잘 활용하는 예제 중 하나다
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-cache
spec:
  selector:
    matchLabels:
      app: store
  replicas: 3
  template:
    metadata:
      labels:
        app: store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: redis-server
        image: redis:3.2-alpine
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  selector:
    matchLabels:
      app: web-store
  replicas: 3
  template:
    metadata:
      labels:
        app: web-store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web-store
            topologyKey: "kubernetes.io/hostname"
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: web-app
        image: nginx:1.16-alpine

위의 디플로이먼트는

redis와 web서버 파드를 각각 배포하는 디플로이먼트 이다

어피니티와 안티어피니티를 적절하게 사용하여 레디스는 노드가 겹치지 않도록 (안티어피니티로 자신의 label을 선택했기때문) 분배되어 배포되고 웹서버의 경우도 동일한 안티어피니티로 각각의 노드에 배치되지만 어피니티로 레디스의 레이블을 지정하였기때문에 레디스와 동일한 노드에 배치된다

 

 

  1. taint tolerations

테인트와 톨러레이션은 파드가 아닌 노드에 설정하는 속성이다

아래와 같이 노드에 taint를 설정하면

kubectl taint nodes node-1-hostname gpu=good:Noschedule

파드의 속성중 gpu: good톨러레이션이 없다면 파드는 해당 노드에 배치되지 않는다

위 테인트가 설정된 노드에 파드를 배치하려면 아래와 같이 배포하여야 한다

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "gpu"
    operator: "Equal"
    value: "good"
    effect: "NoSchedule"

위처럼 톨러레이션이 없는 파드의 경우 해당 노드에 배치되지 않는다

'클라우드 > 쿠버네티스' 카테고리의 다른 글

secret data 수동으로 base64인코딩시 주의점  (0) 2022.05.24
PVC Extend  (0) 2022.05.24
Configmap과 Secret  (0) 2022.05.24
Internal LoadBalancer 생성하기  (0) 2022.05.24
엘라스틱 서치 security 설정  (0) 2022.05.24
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함