Kubernetes

Kubernetes - Deployment

rygus 2025. 9. 28. 21:52
728x90

안녕하세요.

오늘은 쿠버네티스에서 가장 많이 사용되는 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`

보시면 아까 저희의 레플리카셋으로 돌아온 것을 확인 가능합니다. 

 

감사합니다.