본문으로 바로가기
반응형

Intro

kubernetes 는 여러개의 노드가 클러스터링 되어있고, 그 안에 pod가 어느 노드로 스케줄링 해야할지를 상황에 따라 컨트롤 할 수 있어야 합니다. 오늘은 pod 스케줄링 기능중에 pod anti affinity 를 사용하여 각각 다른 노드와 다른 AWS AZ에 생성되도록 구성하는 방법에 대해 알아보고 관련된 내용을 살펴보겠습니다.

pod의 기본(default) 스케줄링

pod의 기본 스케줄링은 first-come, first-served (FCFS) 방식입니다. 즉, pod가 생성되면, pod의 자원 요구 사항을 충족시키는 첫 번째 유효한 노드에 배치하게 됩니다. k8s의 Scheduler는 사용할 수 있는 리소스가 가장 많은 노드부터 시작해서 사용 가능한 노드 목록을 검토하고, pod의 자원 요구 사항을 충족시킬 수 있는 노드를 찾습니다. 한마디로 별도의 스케줄링 정책을 넣지 않아도 알아서 사용할 수 있는 노드에 배치해준다는 것이죠.

pod의 스케줄링 정책들

위에서 설명드린 pod의 기본 스케줄링 정책외에 다른 스케줄링 정책을 사용하여 pod의 스케줄링을 컨트롤 할 수 있습니다. 그 종류가 resource-based scheduling, affinity/anti-affinity rules, custom scheduling algorithms 이 있습니다. custom scheduling algorithms은 직접 알고리즘을 구현하는 방법으로 일반적으로 사용하지 않기 때문에 나머지 resource-based scheduling, affinity/anti-affinity rules 를 예시를 보면서 살펴보겠습니다.

resource-based scheduling의 예시

  • resources 의 request , limits 필드를 사용하여 원하는 리소스 용량을 지정하여, 이에 만족되는 노드에 스케줄링 되도록 할 수 있습니다. 여기서 request는 컨테이너 실행에 필요한 최소 리소스양이고, limit은 최대 리소스양입니다
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: myimage:v1
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  nodeSelector:
    disktype: ssd

affinity/anti-affinity 란

우선 affinity란 nodeselector와 비슷한 기능으로 더 다양한 옵션을 제공합니다. 조금 상세한 스케줄링을 원한다면 affinity를 사용하는 것이 좋겠죠 affinity 정책으로는 반드시 조건을 만족해야 스케줄링해주는 hard affinity 가 있고, 조건을 만족하지 않을 경우에도 스케줄링 해주는 soft affinity 가 있습니다.

pod affinity/anti affitnity 에서는 hard 가 requiredDuringSchedulingIgnoredDuringExecution 이고 soft가 preferredDuringSchedulingIgnoredDuringExecution 입니다.

affinity 예시

아래 예시는 node lable에 key=value 로 app=myapp가 설정이 되었는 경우에만 스케줄링 하는 정책입니다.

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - myapp
        topologyKey: "kubernetes.io/hostname"
  containers:
  - name: mycontainer
    image: myimage

anti-affinity 예시

이번에는 anti-affinity를 사용하여 각각 다른 노드와 다른 AWS AZ에 생성되도록 구성해보겠습니다.

  • hard affinity 사용
apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: security
                operator: In
                values:
                - high
            topologyKey: failure-domain.beta.kubernetes.io/zone
          - labelSelector:
              matchExpressions:
              - key: env
                operator: In
                values:
                - prod
            topologyKey: kubernetes.io/hostname
      ... (other specifications)
  • soft affinity 사용
apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: security
                  operator: In
                  values:
                  - high
              topologyKey: failure-domain.beta.kubernetes.io/zone
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 90
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: env
                  operator: In
                  values:
                  - prod
              topologyKey: kubernetes.io/hostname
      ... (other specifications)
반응형