본문 바로가기
  • 오늘처럼
소프트웨어 아키텍처/Kubernetes

[Kubernetes] 1-12. Deployment 구동해보기

by bluefriday 2022. 5. 6.
반응형

다음의 조건을 만족하는 deployment 를 클러스터에 배포해본다.

  • Namespace : test-namespace
  • Name : test-dp
  • Labels : hello=world (pod에도 필요)
  • Replicas : 3
  • 다음의 2개 컨테이너를 포함
    • Container1
      • image : nginx:1.19.3
    • Container2
      • image : tomcat:9
  • Deployment 의 각 파드는 각 노드에 하나만 배포 (노드가 2개 있을 경우, 3개의 파드가 모두 구동되지 않고 2개의 파드만 구동되며, 노드가 추가 될 경우 해당 노드에 3번째 파드가 구동되게 구성)

Deployment 가 생성하는 파드가 같은 노드에 2개 이상 배포되는 경우를 방지하기 위하여 다음의 2가지 방법을 사용할 수 있다.

  1. PodAntiAffinity 를 사용
  2. TopologySpreadConstraints 를 사용

2가지 방법 모두 topologyKey 값이 필요하다. 이 값은 모든 노드에 일관되게 가지고 있는 레이블을 사용하여야 하며, 'kubectl describe node' 명령을 사용하여 노드에서 조회한다. 여기에서는 'kubernetes.io/hostname' 을 사용한다.

1. PodAntiAffinity 를 사용

파드간에 안티 어피니티를 부여하여 파드가 서로 같은 노드에 구동되지 않게 한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    hello: world
  name: test-dp
  namespace: test-namespace
spec:
  replicas: 3
  selector:
    matchLabels:
      hello: world
  template:
    metadata:
      labels:
        hello: world
    spec:
      containers:
      - image: nginx:1.19.3
        name: container1
      - image: tomcat:9
        name: container2
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: hello
                operator: In
                values:
                - world
            topologyKey: kubernetes.io/hostname

 

2. TopologySpreadConstraint 를 사용

topologySpreadConstraints 를 사용한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    hello: world
  name: test-dp
  namespace: test-namespace
spec:
  replicas: 3
  selector:
    matchLabels:
      hello: world
  template:
    metadata:
      labels:
        hello: world
    spec:
      containers:
      - image: nginx:1.19.3
        name: container1
      - image: tomcat:9
        name: container2
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            hello: world

 

이제 상단 2가지 방법 중 하나로 준비된 yaml 파일을 생성한 후에 결과를 확인한다.

### deployment 생성
kubectl apply -f deployment.yaml


### deployment 확인
kubectl get deploy -n test-namespace -l hello=world
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
test-dp   2/3     3            2           1m12s

### pod 확인
kubectl get pod -n test-namespace -owide -l hello=world
NAME                       READY   STATUS    ...   NODE             
test-dp-dkejd8eiue-9ljpw   2/2     Running   ...   worker1
test-dp-dkejd8eiue-9kdds   0/2     Pending   ...   <none>          
test-dp-dkejd8eiue-knv3f   2/2     Running   ...   worker2

 

'kubectl describe' 명령을 사용하여 Pending 상태인 파드의 이벤트를 조회하면 각각 podAntiAffinity, topologySpreadConstraints 와 관련된 이유로 파드가 스케쥴링 되지 않고 있음을 확인할 수 있다.

댓글