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에 대해 정리해보겠습니다.
'kubernetes' 카테고리의 다른 글
[kubernetes] 쿠버네티스(kubernetes) service(NodePort)란 (0) | 2021.07.14 |
---|---|
[kubernetes] 쿠버네티스(kubernetes) service(clusterip)란 (0) | 2021.06.22 |
[kubernetes] 쿠버네티스(kubernetes) 레플리카셋(replicaset)이란 (0) | 2021.06.21 |
[kubernetes] 쿠버네티스(kubernetes) 팟(pod)이란? (0) | 2021.06.13 |
[kubernetes] 쿠버네티스 시작하기(minikube를 사용한 클러스터 구축) (0) | 2021.06.13 |
댓글