본문 바로가기
kubernetes

[kubernetes] 쿠버네티스(kubernetes) 디플로이먼트(deployment)란

by devjh 2021. 6. 21.
반응형

1. deployment란

deployment가 등장하기 이전 레플리케이션 컨트롤러만 이용하는 경우

컨테이너에 들어가는 애플리케이션의 소스가 변경된경우 다시 레플리케이션 컨트롤러를 새로 만들고 rolling-update 수행했습니다.

 

그러나 deployment가 등장하며 pod의 컨테이너의 이미지만 변경해주면 편리하게 업데이트가 되며

히스토리 확인 및 롤백기능까지 사용할 수 있게 되었습니다.

 

2. yaml파일을 이용해 생성하기

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydeploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myHelloWorld
  template:
    metadata:
      labels:
        app: myHelloWorld
    spec:
      containers:
      - name: myapp
        image: jaeho310/helloworld:1

deployment의 yaml파일은 저번 게시글의 replicaset과 kind빼고는 모두 똑같습니다. 

 

3. 동작확인

$ kubectl apply -f mydeployment.yaml --record
deployment.apps/mydeploy created

yaml파일을 적용해 deployment를 생성합니다.

deployment는 --record를 적용해줍니다.(추후 히스토리 확인용)

 

$ kubectl get all
NAME                            READY   STATUS    RESTARTS   AGE
pod/mydeploy-5bd587868d-8442c   1/1     Running   0          85s
pod/mydeploy-5bd587868d-dgknp   1/1     Running   0          85s
pod/mydeploy-5bd587868d-txg9s   1/1     Running   0          85s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   8d

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mydeploy   3/3     3            3           85s

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/mydeploy-5bd587868d   3         3         3       85s

kubectl get all로 모두 확인해보니 여러 resource들이 올라와있습니다.

deployment는 replicaset을 생성하고

replicaset은 pod을 생성하여 생긴 결과입니다.

 

4. 이미지 업데이트하기

@RestController
public class DemoController {
    
    @GetMapping("/")
    public String test() {
        return "hello new world";
    }
}

hello world에서 hello new world를 리턴해주는 웹 애플리케이션으로 이미지가 업데이트 된 경우입니다.

helloworld:2에 이미지를 올려주고 deployment yaml파일에 가서

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydeploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myHelloWorld
  template:
    metadata:
      labels:
        app: myHelloWorld
    spec:
      containers:
      - name: myapp
        image: jaeho310/helloworld:2
        # pod의 image만 변경

image에 태그만 변경해 주고 apply 합니다.

$ kubectl apply -f mydeployment.yaml --record
deployment.apps/mydeploy configured

deployment는 --record 를 붙여줘야 history에서 확인이 가능합니다.

 

5. deployment rollout 이용하기

$ kubectl rollout status deployment mydeploy
deployment "mydeploy" successfully rolled out

먼저 rollout status 를 확인합니다.

rollout은 여러개의 pod를 모두 죽이지않고 순차적으로 업데이트하는 방식을 말합니다.

rollout restart {deployname}등의 옵션은 deployment의 pod을 순차적으로 모두 재시작하고싶을떄 사용하기도 합니다.

$ kubectl rollout history deployment mydeploy
REVISION  CHANGE-CAUSE
2         kubectl.exe apply --filename=mydeployment.yaml --record=true
3         kubectl.exe apply --filename=mydeployment.yaml --record=true

--record 옵션을 붙여서 apply 한 deployment의 경우 revision이 찍힙니다.

Revision 번호를 확인했으면 해당 revision을 확인해봅니다.

$ kubectl rollout history deployment mydeploy --revision=3
deployment.apps/mydeploy with revision #3
Pod Template:
  Labels:       app=myHelloWorld
        pod-template-hash=5bd587868d
  Annotations:  kubernetes.io/change-cause: kubectl.exe apply --filename=mydeployment.yaml --record=true
  Containers:
   myapp:
    Image:      jaeho310/helloworld:1
    Port:       <none>
    Host Port:  <none>
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

이전 버전이므로 revision3의 이미지태그가 1인걸 확인할 수 있습니다.

 

해당 이미지로 롤백하고싶다면 

yaml파일을 수정해서 다시 apply해도 되지만, 변경된부분이 많다면 rollout undo명령어를 활용해도 됩니다.

$ kubectl rollout undo deployment mydeploy --to-revision=3
deployment.apps/mydeploy rolled back

pod, replicaset, deployment를 알면 컨테이너를 생성, 복제, 유지하고 히스토리를 확인해서 롤백할 수 있습니다.

 

다음 게시글에서는 service에 대해 정리해보겠습니다.

반응형

댓글