Deployment 를 사용한 컨테이너 운영은 kubernetes 에서 가장 권장하는 방법이다.

컨테이너를 기동하는 방법에는

1. pod 를 직접 사용하는 방법(단순 기동)

2. replicaset 으로 파드의 replica 갯수를 설정된 상태에 맞도록 유지하도록 유지하는 방법(자동복구 + scaling 가능)

3. deployment 로 n개의 replicaset 을 제어하면서 전체 파드의 갯수는 설정된 상태에 맞도록 유지하는 방법(rolling update 가능)

 

pod < replicaset < deployment 순서로 포함하는 구조이며, 따라서 상위에서는 하위의 기능을 사용할 수 있다.

 

1. 디플로이먼트 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.16
          ports:
            - containerPort: 80

 

위 내용으로 디플로이먼트를 생성한 후, 아래 커맨드로 디플로이먼트 및 디플로이먼트가 관리하는 레플리카셋, 그리고 그 레플리카셋이 관리하는 파드를 조회할 수 있다.

$ kubectl get deployments.apps sample-deployment
sample-deployment

$ kubectl get replicasets.apps -l app=sample-app
sample-deployment-79cd77b9d6

$ kubectl get pods -l app=sample-app
sample-deployment-79cd77b9d6-767b4
sample-deployment-79cd77b9d6-7j2zh
sample-deployment-79cd77b9d6-ksjpf

 

조회 결과를 보면, 디플로이먼트 > 레플리카셋 > 파드 순서로 네이밍 규칙을 이어받아 따르는 것을 알 수 있다.

  • deployment 명: {deployment 명}
    • ex) sample-deployment
  • replicaset 명: {deployment 명}-{10자리 랜덤hash 문자열}
    • ex) sample-deployment-79cd77b9d6
  • pod 명: {replicaset 명}-{5자리 랜덤hash 문자열}
    • ex) sample-deployment-79cd77b9d6-767b4

 

2. 디플로이먼트 업데이트

이제 deployment 매니페스트 파일의 컨테이너 이미지의 nginx 버전을 1.16 -> 1.17로 변경하고 apply 하면, 자동으로 새로운 replicaset 이 생성되며 rolling update 가 진행된다. 즉, 디플로이먼트가 알아서 rolling update 방식으로 무중단 배포를 진행해준다.

# 매니페스트 파일 수정 후
$ kubectl apply -f sample-deployment.yaml
$ kubectl get replicasets.apps -l app=sample-app
# rolling update 를 위한 새로운 replicaset 이 추가로 생성되었는지 확인

 

참고로, 다시 nginx 버전을 1.17 -> 1.16 으로 변경하여 rolling update 를 진행한 후 pod 명을 확인해보면, replicaset 과는 다르게 pod 는 재활용되지 않고 새로 생성된 것을 알 수 있다.(파드명이 다름)

  • replicaset 은 업데이트시 삭제되지 않고 유지되며, 다시 동일한 spec.template 으로 업데이트시 재사용된다.
    • 즉, spec.template 내용의 변경이 있으면 해당 내용으로 레플리카셋이 새로 생성된다.
    • 실제로 레플리카셋명의 hash 값은 spec.template 아래의 값으로부터 생성된다.(파드 템플릿 해시)
    • nginx 버전을 1.16 -> 1.17 -> 1.16 으로 변경한 경우에 1.16 버전 파드 템플릿 해시값이 동일할 것이므로, 레플리카셋이 새로 생성되지 않고 재사용되는 것이다.
  • pod 는 업데이트시 삭제되고 새롭게 생성된다.
# 최초 상태
$ kubectl get rs
sample-deployment-558978b4c5   3         3         3       2m40s
sample-deployment-79cd77b9d6   0         0         0       17m

$ kubectl get po
sample-deployment-558978b4c5-6d9gw   1/1     Running   0          3m56s
sample-deployment-558978b4c5-c7qjx   1/1     Running   0          3m57s
sample-deployment-558978b4c5-tffhz   1/1     Running   0          3m55s

# 첫번째 rolling update 후 => 새로운 replicaset 이 생성되고, 기존 replicaset 는 유지됨. 새로운 replicaset 하위로 pod 가 생성됨.
$ kubectl get rs
sample-deployment-558978b4c5   0         0         0       8m26s
sample-deployment-79cd77b9d6   3         3         3       23m

$ kubectl get po
sample-deployment-79cd77b9d6-56vlj   1/1     Running   0          4s
sample-deployment-79cd77b9d6-rznvh   1/1     Running   0          2s
sample-deployment-79cd77b9d6-tlk5f   1/1     Running   0          4s

# 두번째 rolling update 후 => replicaset 은 유지되나, 그 하위 pod 는 새로 생성됨
$ kubectl get rs
sample-deployment-558978b4c5   3         3         3       8m50s
sample-deployment-79cd77b9d6   0         0         0       24m

$ kubectl get po
sample-deployment-558978b4c5-c4dwd   1/1     Running   0          20s
sample-deployment-558978b4c5-hkb7p   1/1     Running   0          19s
sample-deployment-558978b4c5-tcrtx   1/1     Running   0          18s

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,