안녕하세요.
오늘은 쿠버네티스에서 가장 많이 사용되는 Deployment에 대해 확인해 보겠습니다.
# Replicaset 이란?
Deployment를 알아보기 전에 Replicaset부터 먼저 알아봐야하는데요.
Replicaset을 관리하는 것이 Deployment의 역할이기 때문입니다.
본론으로 돌아와 Replicaset은 파드의 개수를 유지해주는 역할을 합니다.
만약 최소 3개의 파드가 유지되어야 할 때 노드에 문제가 생겨서 파드가 하나 삭제되어도 Replicaset은 이를 바로 감지하고 하나를 생성합니다.
반대로 하나가 더 추가로 생성되어도 바로 파드 하나를 삭제시켜 3개를 유지시키는 역할을 합니다.
직접 테스트를 진행해보겠습니다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: test-replicaset
spec:
template:
metadata:
name: pod
labels:
app: lable-test
spec:
containers:
- name: container
image: nginx
ports:
- containerPort: 80
replicas: 3
selector:
matchLabels:
app: label-test

`kubectl apply -f replicaset.yml`
배포 후 정상적으로 레플리카셋과 파드 3개가 생성되어 있는 것을 확인가능합니다.
참고로 Replicaset의 각 항목의 의미는 아래와 같습니다.
DESIRED : 유지되어야 하는 파드의 수
CURRENT : 현재 파드 수
READY : 현재 정상 작동 중인 파드의 수

이제 특정 파드를 삭제해 보겠습니다.
정상적으로 삭제가 진행되었으며 옆에 AGE에 보면 4s로 방금 생성된 것을 확인 가능합니다.

이제 테스트가 끝났으니 Replicaset을 삭제하겠습니다.
파드 및 레플리카셋이 정상적으로 삭제된 것을 확인가능합니다.
# Deployment 란?
앞서 말씀드렸듯이 디플로이먼트는 레플리카셋을 관리해 주는 관리해주는 상위 개념이라고 말씀드렸습니다.
관리한다라는 말이 잘 와닿지 않으실 수도 있는데요.
만약 서비스 업데이트가 필요한데 서비스 중단이 발생하면 안 될 경우 디플로이먼트는 레플리카셋을 관리하여 파드 업데이트를 무중단으로도 진행할 수 있습니다.
테스트를 위해 배포해 보겠습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-test
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: label-test
template:
metadata:
labels:
app.kubernetes.io/name: label-test
spec:
containers:
- name: pod
image: nginx:1.17

`kubectl apply -f deployment.yml`
저희는 디플로이먼트만 생성했음에도 중간에 레플리카셋까지 생성되어 있는 것을 확인 가능합니다.

당연하게 특정 파드 삭제 시 바로 생성되는 것을 확인 가능합니다.

`kubectl describe deployments | grep Image`
현재 버전을 확인하면 1.17 버전입니다.

`kubectl set image deployment/deploy-test pod=nginx:1.28`
이제 nginx 이미지를 1.28 버전으로 업그레이드해보겠습니다.
정상적으로 파드 이미지가 업데이트된 것을 확인 가능합니다.

다들 눈치채셨겠지만 저 레플리카셋은 기존 버전의 레플리카셋입니다.
그렇다면 왜 갑자기 저희가 생성하지도 않은 레플리카셋이 생성되었을까요?

그 이유는 바로 위 사진과 같이 Rolling Update를 진행하기 때문입니다.
저희가 업데이트 명령어를 날리면 1.28 버전의 레플리카셋이 생성이 되고 점진적으로 파드를 추가하여 무중단으로 배포가 가능한 것입니다.
그렇기 때문에 저희가 생성하지도 않은 레플리카셋이 보였던 것입니다.
저 남은 0개 파드가 배포되어 있는 레플리카셋을 이용하여 기존 버전으로 백업도 가능하게 됩니다.
이번에는 기존 버전 1.17 버전으로 백업해 보겠습니다.


`kubectl rollout undo deployment/deploy-test`
보시면 아까 저희의 레플리카셋으로 돌아온 것을 확인 가능합니다.
감사합니다.