이 글은 김태민님의 대세는 쿠버네티스 강의를 참고하여 정리하였습니다!
Recreate 구성
Rolling Update 구성
도커 이미지는 김태민님께서 만들어두신 이미지를 사용합니다.
먼저, Deployment Controller를 사용하는 이유를 알아봅시다.
한 서비스가 운영중일 때, 서비스의 버전을 업그레이드시키고 싶을 때 사용하는 Controller입니다.
버전을 업그레이드할 때도 다양한 방법이 있는데, Recreate, Rolling Updaten 방법에 대해서 배워봅시다.
Deployment를 만들게 되면 V1의 Pod들이 만들어지게 됩니다.
업그레이드를 하게되면 먼저 V1의 Pod들을 삭제시킨다음, 순차적으로 V2의 Pod들을 생성하면 됩니다.
단점은, V1의 Pod들을 먼저 삭제시키는 과정이 필요하므로, 서비스에 Down Time이 생길수도 있습니다.
이제 한번 해보도록 합시다!
dp1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dp-1
spec:
selector:
matchLabels:
type: app
replicas: 2
strategy:
type: Recreate
revisionHistoryLimit: 1
template:
metadata:
labels:
type: app
spec:
containers:
- name: container
image: kubetm/app:v1
terminationGracePeriodSeconds: 10
이제, Pod및 생성된 ReplicaSet을 확인해보도록 합시다!
이렇게 Pod와 ReplicaSet이 생성된 것을 확인 할 수 있습니다.
이제, Pod들에 접속할 Service를 하나 만들어 봅시다.
svc1.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
type: app
ports:
- port: 8080
protocol: TCP
targetPort: 8080
지금 부터 해볼 것은,
Service에 접속하여 무한루프로 Pod의 Version을 출력하는 명령어를 날리도록 하겠습니다.
그 다음, 무한 루프를 돌면서 버전을 업데이트 해보도록 합시다.
while true; do curl 10.109.168.121:8080/version; sleep 1; done
이제 Version을 바꿔보도록 합시다.
kubectl edit deployment dp-1 -o yaml
이렇게 Server가 잠시 끊겼다가 버젼이 업그레이드 되는 것을 볼 수 있습니다!
업그레이드를 실행하게 되면 먼저 V2 Pod를 하나 만들어 줍니다.
그 다음 V1 Pod를 하나 삭제하게 됩니다.
이런 과정을 순차적으로 진행하게 됩니다.
이 방식은 배포 중산에 Downtime이 없습니다!
한번 실습해보도록 합시다!
dp2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name dp-2
spec:
selector:
matchLabels:
type: app2
replicas: 2
strategy:
type: RollingUpdate
minReadySeconds: 10
template:
metadata:
labels:
type: app2
spec:
containers:
- name: container
image: kubetm/app:v1
terminationGracePeriodSeconds: 0
이제 Service를 만듭시다.
svc2.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
selector:
type: app2
ports:
- port: 8080
protocol: TCP
targetPort: 8080
이제,Recreate에서 했던거와 같이 똑같이 실습해보도록 합시다.
while true; do curl 10.102.205.50:8080/version; sleep 1; done
kubectl edit deployment dp-2 -o yaml
이런식으로, V2가 생성 되며 Downtime없이 순차적으로 V1이 삭제되는 것을 볼 수 있습니다!
👍