k8s의 Deployment는 ReplicaSet과 함께 무중단 배포를 할 때 쓰입니다.
예를 들어 webapp이라는 pod이 있고 2개의 Replica를 만들어서 배포중이라고 가정해봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
apiVersion: apps/v1
kind: Replicaset
metadata:
name: webapp
spec:
selector:
matchLabels:
app: webapp
replicas: 2
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: <imageName>
|
cs |
그렇다면 위 코드와 비슷한 yaml파일을 작성해볼 수 있습니다.
이제 버젼 업그레이드를 한 새로운 컨테이너를 똑같이 2개의 Replica로 만들어서 배포하고 싶은데
무중단 배포를 하고싶을 때 Deployment가 사용됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
minReadySeconds: 20
selector:
matchLabels:
app: webapp
replicas: 2
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: <업그레이드할 image>
|
cs |
Deployment를 사용하면 위 같은 코드가 작성될 것입니다.
잘보시면 kind 부분이 바뀌었고 spec 부분에 minReadySeconds 부분이 추가된 것을 볼 수 있습니다.
실제로 확인을 해보기 위해서는 첫번째 yaml 파일을 실행한 뒤,
Deployment yaml파일을 실행해보면 됩니다.
예를 들어서 첫번째 yaml파일에는 localhost:8080으로 접속했을 때 "hello world"가 나오고,
Deployment를 적용한 yaml파일은 "bye world"가 나온다고 가정해봅시다.
그럼 대략 20초 이후에 새로고침을 해보면 준비가 완료된 두번째 pod이 적용이 될 것입니다.
위 그림은 대략 20초가 지나고 Deployment가 모두 적용된 후에 kubectl get all 명령어를 실행했을 때의 결과입니다.
기존 pod이 없어지고 새로운 pod으로 대체되었습니다.
만약 새로운 pod이 적용되고 있는 상태일 때는 기존 pod의 CURRENT와 READY가 시간이 지남에 따라 줄어들게 됩니다.
(이번 예제에서는 Replica가 2이므로 2에서 0으로 점차 줄어듬)
이제 Rollout 기능에 대해 알아보겠습니다.
Rollout 기능은 스냅샷을 찍은 곳으로 rollback하는 기능이라고 보시면됩니다.
현재 localhost:8080에 들어가면 "bye world"가 나오는 pod이 실행중이라고 가정해봅시다.
그리고 아래와 같이 일종의 스냅샷을 찍는 명령어를 실행해봅니다.
1
|
kubectl rollout status deploy <podName> // 여기서는 webapp
|
cs |
그럼 아래와 같이 성공 메시지가 나오게 됩니다.
이제는 yaml 파일을 수정해서 "hello world"가 나오는 pod으로 수정했다고 가정해봅시다.
1
2
|
kubectl apply -f <yamlFile.yaml>
kubectl rollout status deploy <podName> // 여기서는 webapp
|
cs |
위처럼 수정한 yaml파일을 적용시켜주고 다시 스냅샷을 찍습니다. 이번에는 꽤 긴 문장들이 나온 후에 성공 메시지가 나옵니다.
rollback을 위한 스냅샷 트리를 만드는 과정이라고 보면 됩니다.
1
|
kubectl rollout history deploy <podName> // 여기서는 webapp
|
cs |
위 명령어를 치면 아래와 같은 그림이 나옵니다.
3은 현재를 뜻하고 2는 이전 상태를 뜻합니다.
위 내용을 잘 따라왔다면 현재 상태는 "hello world"가 나오는 pod이 실행되고 있는 상태입니다.
여기서 아래 명령어를 실행해봅니다.
1
|
kubectl rollout undo deploy <podName>
|
cs |
그럼 이제는 "bye world"가 나오는걸 볼 수 있습니다.
** 그러나 주의점이 하나 있습니다.
이렇게 rollout을 하면 yaml파일과 현재 실행되고 있는 pod이 일치하지 않습니다.
지금도 yaml파일은 "hello world"를 실행하는 것이지만 rollout으로 인해 "bye world"를 보여주는 pod이 실행되고 있습니다.
'k8s' 카테고리의 다른 글
k8s #5 networking&namespace (0) | 2021.11.24 |
---|---|
k8s #3 ReplicaSets (0) | 2021.11.22 |
k8s #2 무중단 배포 기초 (0) | 2021.11.22 |
k8s #1 hello world (0) | 2021.11.22 |