일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- redash
- spring
- 설정
- aws
- Docker
- Cluster
- 자바
- 간단
- Zeppelin
- java
- SpringBoot
- Kafka
- vue
- Redis
- 젠킨스
- 로그인
- hive
- 머신러닝
- config
- EMR
- fastcampus
- 클러스터
- gradle
- 예제
- ec2
- 자동
- Jenkins
- login
- 레디스
- Mac
- Today
- Total
코알못
[kubernetes] ReplicaSet 실습 - pod 수 조정, 롤백 본문
이번 실습 시간에는 1) Pod 수 조정하는 실습과 2) 롤백하는 실습을 진행해보도록 한다.
1) Pod 수 조정하는 실습
우선 replicaset 생성할 수 있는 파일을 만든다.
# replicaset-v3.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp
spec:
selector:
matchLabels:
app: my-app
replicas: 1
template:
metadata:
labels:
app: my-app
env: prod
spec:
containers:
- name: my-app
image: yoonjeong/my-app:1.0
ports:
- containerPort: 8080
resources:
limits:
memory: "64Mi"
cpu: "50m"
아래와 같이 적용하고 확인해보면 label app 이 붙은 pod 가 하나 뜬것을 볼 수 있다.
$ kubectl apply -f replicaset-v3.yaml
replicaset.apps/myapp created
$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-kcfm8 1/1 Running 0 56s app=my-app
이제 설정 중에 label env 를 추가 해보자!
spec:
selector:
matchLabels:
app: my-app
replicas: 1
template:
metadata:
labels:
app: my-app
env: prod
수정 사항을 클러스터에 배포 하고
$ kubectl apply -f replicaset-v3.yaml
replicaset.apps/myapp configured
확인해보면 이전 실습과 같이 이미 떠있는 파드의 경우 설정이 반영되지 않고 떠있는것을 볼 수 있다.
$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-kcfm8 1/1 Running 0 2m30s app=my-app
이제 replicas 를 1개 > 3개로 변경하여 scale 명령어를 통해 변경 하도록 한다.
$ kubectl scale rs myapp --replicas=3
replicaset.apps/myapp scaled
파드를 확인해보면 새로운 파드 두개가 생성 되었으며 새로 생성된 파드만 변경사항이 적용 되었다!
$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-598cm 1/1 Running 0 32s app=my-app,env=prod
myapp-kcfm8 1/1 Running 0 2m30s app=my-app
myapp-lmrlb 1/1 Running 0 32s app=my-app,env=prod
다시 scale 을 통해 파드 수를 3개 > 1개로 수정하며
$ kubectl scale rs myapp --replicas=1
replicaset.apps/myapp scaled
나중에 생성된 파드가 제거 되는것을 볼 수 있다.
$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-kcfm8 1/1 Running 0 3m53s app=my-app
scale을 통해 이번에는 파드를 0개로 만든다!
확인해보면 파드는 제거되고 replicaset은 남아 있는것을 볼 수 있다.
이처럼 replicaset 은 유지하고 파드를 제거 할 수도있다.
$ kubectl scale rs myapp --replicas=0
replicaset.apps/myapp scaled
$ kubectl get pod --show-labels
No resources found in default namespace.
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp 0 0 0 4m59s
이제 실습을 완료 하였으니 해당 오브젝트를 모두 제거한다.
$ kubectl delete rs myapp
replicaset.apps "myapp" deleted
$ kubectl get pod
No resources found in default namespace.
$ kubectl get rs
No resources found in default namespace.
2) 롤백하는 실습
다음 실습은 장애가 발생했을때 ReplicaSet을 통해 롤백하는 방법을 알아보자!
두가지 방법을 생각할 수 있다.
1. label 을 이용한 방법
- 롤백할 이미지 버전으로 yaml 파일을 수정한다.
- 기존 파드의 라벨을 변경하여 ReplicaSet 관리 범주에서 벗어나도록 한다.
- 기존 파드가 관리 범주에 벗어나 현재 파드 수가 0개로 감지 되므로 새 버전 파드가 생성된다.
2. scale 을 이용한 방법
- 롤백할 이미지 버전으로 yaml 파일을 수정한다.
- scale 0으로 수정하여 기존 버전을 모두 제거한다.
- scale 을 이용하여 pod 수를 정의 하여 새 버전으로 파드를 띄운다.
2번은 이전시간에 scale 사용 방법에 대해서 알아보았기에 이번 시간에서는 1번만 진행해보도록 한다!
아래와 같이 replicaset 파일을 생성하며 이미지는 5번 호출하면 오류를 리턴하는 이미지 파일이다.
# replicaset-v4.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-replicaset
spec:
selector:
matchLabels:
app: my-app
replicas: 3
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: yoonjeong/my-app:2.0-unhealthy
ports:
- containerPort: 8080
resources:
limits:
memory: "64Mi"
cpu: "50m"
아래와 같이 클러스터에 적용 하고 파드를 보면 정상적으로 3개가 생성 되었다.
$kubectl apply -f replicaset-v4.yaml
replicaset.apps/myapp-replicaset created
$ kubectl get pod -L app
NAME READY STATUS RESTARTS AGE APP
myapp-replicaset-4fgt9 1/1 Running 0 17s my-app
myapp-replicaset-h5c6x 1/1 Running 0 17s my-app
myapp-replicaset-j9468 1/1 Running 0 17s my-app
포트 포워딩을 걸어두고
$ kubectl port-forward rs/myapp-replicaset 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
컨테이너를 5번 호출하면 아래와 같이 오류 메세지 crashed 를 볼 수 있다.
$ curl localhost:8080
Welcome to Version 2!
===== Host Info =====
HostIP: 10.100.3.17
HostName: myapp-replicaset-4fgt9
$ curl localhost:8080
Welcome to Version 2!
===== Host Info =====
HostIP: 10.100.3.17
HostName: myapp-replicaset-4fgt9
$ curl localhost:8080
Welcome to Version 2!
===== Host Info =====
HostIP: 10.100.3.17
HostName: myapp-replicaset-4fgt9
$ curl localhost:8080
Welcome to Version 2!
===== Host Info =====
HostIP: 10.100.3.17
HostName: myapp-replicaset-4fgt9
$ curl localhost:8080
"Crashed! Please fix me."
이제 롤백할 이미지로 변경하며 파일을 변경하여 apply 해도 되지만 아래와 같이 명령어를 통해서도 가능하다.
kubectl set image rs/[ReplicaSet name] [container name]=[image]
실제로 클러스터에 호출하여 이미지를 변경하며 ReplicaSet 정보를 보면 정상적으로 이미지가 변경 된것을 확인 할 수 있다.
$ kubectl set image rs/myapp-replicaset my-app=yoonjeong/my-app:1.0
replicaset.apps/myapp-replicaset image updated
$ kubectl get rs myapp-replicaset -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-replicaset 3 3 3 7m16s my-app my-app:1.0 app=my-app
그 기존 파드의 라벨을 변경하여 replicaset의 관리 범주에서 벗어나게 할 것이며
그 전에 현재 관리 범주 안에 있는지 확인 하면 정상적으로 소유자인 ReplicaSet name 이 나온다.
$ kubectl get pod myapp-replicaset-4fgt9 -o jsonpath="{.metadata.ownerReferences[0].name}"
myapp-replicaset%
이제 하나의 떠있는 파드의 lable을 변경 한다.
$ kubectl label pod myapp-replicaset-4fgt9 app=tb-be-fixed --overwrite
pod/myapp-replicaset-4fgt9 labeled
관리 범주에서 벗어났는지 명령어 호출해보면 안나오는것을 보아 정상적으로 벗어 남을 확인 할 수 있다.
$ kubectl get pod myapp-replicaset-4fgt9 -o jsonpath="{.metadata.ownerReferences[0].name}"
이제 나머지 파드로 라벨을 수정하여 모든 파드를 제외 시킨다.
$ kubectl label pod myapp-replicaset-h5c6x app=tb-be-fixed --overwrite
pod/myapp-replicaset-h5c6x labeled
$ kubectl label pod myapp-replicaset-j9468 app=tb-be-fixed --overwrite
pod/myapp-replicaset-j9468 labeled
이제 파드 정보를 모두 보면 기존 3개의 파드는 라벨이 변경되어 관리 범주에 벗어나 현재 파드수가 0개로 인식되며
새로운 이미지가 적용된 파드가 3개 생성된것을 볼 수 있다.
$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-replicaset-4fgt9 1/1 Running 0 13m app=tb-be-fixed
myapp-replicaset-frmt4 1/1 Running 0 15s app=my-app
myapp-replicaset-h5c6x 1/1 Running 0 13m app=tb-be-fixed
myapp-replicaset-hkdlb 1/1 Running 0 15s app=my-app
myapp-replicaset-j9468 1/1 Running 0 13m app=tb-be-fixed
myapp-replicaset-tw2fj 1/1 Running 0 15s app=my-app
포트 포워딩을 하여 정상적으로 호출 되는지 보면
$ kubectl port-forward rs/myapp-replicaset 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
아래와 같이 버전 1로 정상 호출 되는것을 볼 수 있다.
$ curl localhost:8080
Welcome to Version 1!
===== Host Info =====
HostIP: 10.100.2.14
HostName: myapp-replicaset-frmt4
이제 실습이 완료 되었으니 오브젝트 모두 제거한다.
$ kubectl delete rs/myapp-replicaset
replicaset.apps "myapp-replicaset" deleted
$ kubectl delete pod --all
pod "myapp-replicaset-4fgt9" deleted
pod "myapp-replicaset-h5c6x" deleted
pod "myapp-replicaset-j9468" deleted
정상적으로 제거 된것을 볼 수 있다.
$ kubectl get pod
No resources found in default namespace.
$ kubectl get rs
No resources found in default namespace.
끝!
'ETC' 카테고리의 다른 글
[kubernetes] Deployment - 배포 전략 Recreate, RollingUpdate 및 롤백 (1) | 2023.05.26 |
---|---|
[kubernetes] Deployment 란? (0) | 2023.05.20 |
[kubernetes] ReplicaSet 실습 - pod 종료, template 수정 (1) | 2023.05.20 |
[kubernetes] ReplicaSet 란? (0) | 2023.05.20 |
레인저 적용 EMR의 zepplelin에서 spark 사용 (0) | 2023.05.17 |