일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- config
- ec2
- hive
- 젠킨스
- SpringBoot
- Docker
- redash
- 예제
- 로그인
- Redis
- Kafka
- login
- gradle
- spring
- vue
- java
- 설정
- aws
- 레디스
- EMR
- 머신러닝
- Zeppelin
- Cluster
- 자바
- 자동
- Mac
- Jenkins
- fastcampus
- 간단
- 클러스터
- Today
- Total
코알못
[kubernetes] ReplicaSet 실습 - pod 종료, template 수정 본문
이번 시간에는 1) pod를 임의로 종료 하였을시 어떻게 ReplicaSet이 동작하는지 확인 하는 실습과 2) template를 수정하는 실습을 진행해보도록 한다!
1) pod를 임의로 종료 하였을시 어떻게 ReplicaSet이 동작하는지 확인 하는 실습
우선 ReplicaSet으로 Pod 를 생성한다!
아래와 같이 yaml 파일을 작성하고
# replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: blue-replicaset
spec:
replicas: 3
selector:
matchLabels:
app: blue-app
template:
metadata:
labels:
app: blue-app
spec:
containers:
- name: blue-app
image: yoonjeong/blue-app:1.0
ports:
- containerPort: 8080
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
resources:
limits:
memory: "64Mi"
cpu: "50m"
클러스터에 적용 한다!
$ kubectl apply -f replicaset.yaml
replicaset.apps/blue-replicaset created
정상적으로 생성 되었는지 확인하면 정상임을 알 수 있다.
$ kubectl get rs blue-replicaset
NAME DESIRED CURRENT READY AGE
blue-replicaset 3 3 3 52s
파드를 -w(watch 모드)로 보면서 확인 하도록 하며 해당 옵션을 사용하면 실시간으로 상태를 확인 할 수 있다.
$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
blue-replicaset-jzhdl 1/1 Running 0 71s
blue-replicaset-tqmqn 1/1 Running 0 71s
blue-replicaset-wqpmc 1/1 Running 0 71s
파드 하나를 삭제해보자!
$ kubectl delete pod blue-replicaset-jzhdl
pod "blue-replicaset-jzhdl" deleted
파드 상태를 보면 삭제한 'jzhdl' 파드가 종료 되는 동시에 'hsn2f' 파드가 생성 되는것을 볼 수 있다.
$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
blue-replicaset-jzhdl 1/1 Running 0 71s
blue-replicaset-tqmqn 1/1 Running 0 71s
blue-replicaset-wqpmc 1/1 Running 0 71s
blue-replicaset-jzhdl 1/1 Terminating 0 107s
blue-replicaset-hsn2f 0/1 Pending 0 0s
blue-replicaset-hsn2f 0/1 Pending 0 0s
blue-replicaset-hsn2f 0/1 ContainerCreating 0 0s
blue-replicaset-jzhdl 0/1 Terminating 0 108s
blue-replicaset-jzhdl 0/1 Terminating 0 108s
blue-replicaset-jzhdl 0/1 Terminating 0 108s
blue-replicaset-hsn2f 1/1 Running 0 10s
replicaSet 동작을 상세하게 보기위해 describe 명령어를 사용하며
Events 부분에서 'hsn2f'가 Replicaset에 의해 생성된 것임을 알 수 있다.
$ kubectl describe rs blue-replicaset
Name: blue-replicaset
Namespace: default
Selector: app=blue-app
Labels: <none>
Annotations: <none>
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=blue-app
Containers:
blue-app:
Image: yoonjeong/blue-app:1.0
Port: 8080/TCP
Host Port: 0/TCP
Limits:
cpu: 50m
memory: 64Mi
Environment:
NODE_NAME: (v1:spec.nodeName)
NAMESPACE: (v1:metadata.namespace)
POD_IP: (v1:status.podIP)
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 3m44s replicaset-controller Created pod: blue-replicaset-wqpmc
Normal SuccessfulCreate 3m44s replicaset-controller Created pod: blue-replicaset-jzhdl
Normal SuccessfulCreate 3m44s replicaset-controller Created pod: blue-replicaset-tqmqn
Normal SuccessfulCreate 117s replicaset-controller Created pod: blue-replicaset-hsn2f
이제 replicaSet 을 삭제해보자!
$ kubectl delete rs blue-replicaset
replicaset.apps "blue-replicaset" deleted
삭제하게 되면 ReplicaSet이 관리하고 있는 pod도 삭제 되며 ReplicaSet도 정상적으로 제거 됐음을 알 수 있다.
$ kubectl get pod
No resources found in default namespace.
$ kubectl get rs
No resources found in default namespace.
만약 ReplicaSet 오브젝트만 삭제하고 Pod를 남겨 둘 수 있을까?
정답은 Yes 로 실습을 통해 알아보자!
아래와 같이 ReplicaSet 을 다시 생성하고
$ kubectl apply -f replicaset.yaml
replicaset.apps/blue-replicaset created
파드와 ReplicaSet을 확인하면 정상적으로 생성 됨을 확인할 수 있다.
% kubectl get pod
NAME READY STATUS RESTARTS AGE
blue-replicaset-42z5p 1/1 Running 0 19s
blue-replicaset-8mf5g 1/1 Running 0 19s
blue-replicaset-pklsv 1/1 Running 0 19s
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
blue-replicaset 3 3 3 3m32s
해당 파드가 replicaSet에 의해 관리 되고 있는지 확인 하는 방법이 있는데 아래와 같이 jsonpath 또는 yaml 형식으로 확인 가능하다.
우선 yaml 로 보면 metadata.ownerReference[0].name을 보면 소유자가 blue-replicaset 임을 알 수 있다.
$ kubectl get pod blue-replicaset-42z5p -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2023-05-20T06:24:48Z"
generateName: blue-replicaset-
labels:
app: blue-app
name: blue-replicaset-42z5p
namespace: default
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: blue-replicaset
..
jsonpath로 본다고 하면 yaml에서 확인했던 경로를 정의하여 특정값을 볼 수도 있으며 해당 파드의 소유자는 blue-replicaset 으로 ReplicaSet에 의해 관리됨을 알 수 있다.
$ kubectl get pod blue-replicaset-42z5p -o jsonpath="{.metadata.ownerReferences[0].name}"
blue-replicaset
이제 파드는 유지하고 ReplicaSet 오브젝트만 삭제한다!
--cascase 옵션을 이용하면 되며 'orphan'(고아) 값을 주면 파드가 고아가 되어 소유자인 ReplicaSet 만 삭제 된다.
$ kubectl delete rs blue-replicaset --cascade=orphan
replicaset.apps "blue-replicaset" deleted
아래와 같이 확인하면 ReplicaSet 만 삭제되고 파드는 유지됨을 알 수 있다.
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
blue-replicaset-42z5p 1/1 Running 0 4m7s
blue-replicaset-8mf5g 1/1 Running 0 4m7s
blue-replicaset-pklsv 1/1 Running 0 4m7s
$ kubectl get rs
No resources found in default namespace.
파드의 소유자를 다시 확인하면 값이 나오지 않으며 이를 통해 어떠한 ReplicaSet에도 관리 되고 있지 않는 다는것을 확인 할 수 있다.
$ kubectl get pod blue-replicaset-42z5p -o jsonpath="{.metadata.ownerReferences[0].name}"
이제 다음 실습은 Pod를 죽이지 않고 yaml 파일을 수정하여 Pod 수를 조정해보도록 하자!
ReplicaSet 생성 하는 yaml 파일의 replica 수를 3개 > 2개로 변경한다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: blue-replicaset
spec:
replicas: 2
클러스터에 적용한다.
$ kubectl apply -f replicaset.yaml
replicaset.apps/blue-replicaset created
파드를 확인하면 기존에 띄워져 있던 파드가 사라지고 2개만 띄워져 있음을 알 수 있다.
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
blue-replicaset-8mf5g 1/1 Running 0 7m30s
blue-replicaset-pklsv 1/1 Running 0 7m30s
상세 정보를 보면 삭제된 파드 이벤트만 보이는데 이유는
이미 파드가 고아로 3개 남겨져 있는 상태에서 ReplicaSet 을 띄웠으니 파드를 생성하지 않았으므로 이벤트 발생하지 않았고
여기서 ReplicaSet Pod 수가 2개이므로 하나의 파드를 삭제하는 이벤트만 발생한 것이다.
$ kubectl describe rs blue-replicaset
Name: blue-replicaset
Namespace: default
Selector: app=blue-app
Labels: <none>
Annotations: <none>
Replicas: 2 current / 2 desired
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=blue-app
Containers:
blue-app:
Image: yoonjeong/blue-app:1.0
Port: 8080/TCP
Host Port: 0/TCP
Limits:
cpu: 50m
memory: 64Mi
Environment:
NODE_NAME: (v1:spec.nodeName)
NAMESPACE: (v1:metadata.namespace)
POD_IP: (v1:status.podIP)
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulDelete 41s replicaset-controller Deleted pod: blue-replicaset-42z5p
이제 실습을 완료 하였으니 모든 오브젝트를 삭제 하도록 한다.
$ kubectl delete rs blue-replicaset
replicaset.apps "blue-replicaset" deleted
$ kubectl get pod
No resources found in default namespace.
$ kubectl get rs
No resources found in default namespace.
이제 두번째 실습을 진행해본다!
이를 통해 알고자 하는것은 기존에 배포된 파드에 대해서는 변경사항이 적용되지 않으며 새로 생성된 파드에 대해서만 변경 사항이 적용된다는점이다.
2) template를 수정하는 실습
우선 RelpicaSet 을 먼저 생성한다.
# replicaset-v2.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-replicaset
spec:
selector:
matchLabels:
app: my-app
replicas: 2
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: yoonjeong/my-app:1.0
ports:
- containerPort: 8080
resources:
limits:
memory: "64Mi"
cpu: "50m"
클러스터에 적용하고 확인 하면 정상적으로 파드가 생성 되었음을 알 수 있다.
$ kubectl apply -f replicaset-v2.yaml
replicaset.apps/myapp-replicaset created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-replicaset-d2cnk 0/1 ContainerCreating 0 5s
myapp-replicaset-rrslc 0/1 ContainerCreating 0 5s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-replicaset-d2cnk 1/1 Running 0 24s
myapp-replicaset-rrslc 1/1 Running 0 24s
이제 파드 설정을 수정 해보도록 하자!
아래와 같이 spec.template.labels에 env 라벨을 추가한다.
# replicaset-v2.yaml
spec:
selector:
matchLabels:
app: my-app
replicas: 2
template:
metadata:
labels:
app: my-app
env: prod
추가 한 부분을 적용하기 위해 apply 명령어를 입력한다.
$ kubectl apply -f replicaset-v2.yaml
replicaset.apps/myapp-replicaset configured
파드를 보면 라벨의 변화가 없으며 이는 이미 생성된 파드에 대해서 변경 사항이 적용되지 않음을 의미한다.
$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-replicaset-d2cnk 1/1 Running 0 3m12s app=my-app
myapp-replicaset-rrslc 1/1 Running 0 3m12s app=my-app
우리는 새로 파드를 생성하기 위해 기존에 떠있던 파드를 제거한다.
$ kubectl delete pod myapp-replicaset-d2cnk
pod "myapp-replicaset-d2cnk" deleted
ReplicaSet 이벤트 정보를 보면 새로운 '6g2gt' 파드를 생성한것을 볼 수 있다.
$ kubectl describe rs myapp-replicaset
Name: myapp-replicaset
Namespace: default
Selector: app=my-app
Labels: <none>
Annotations: <none>
Replicas: 2 current / 2 desired
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=my-app
env=prod
Containers:
my-app:
Image: yoonjeong/my-app:1.0
Port: 8080/TCP
Host Port: 0/TCP
Limits:
cpu: 50m
memory: 64Mi
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 5m28s replicaset-controller Created pod: myapp-replicaset-rrslc
Normal SuccessfulCreate 5m28s replicaset-controller Created pod: myapp-replicaset-d2cnk
Normal SuccessfulCreate 114s replicaset-controller Created pod: myapp-replicaset-6g2gt
새로 생성된 파드에 대해 변경 사항이 적용됐는지 라벨을 확인하면 env 라벨이 추가된 파드가 생성 되었음을 알 수 있다.
$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-replicaset-6g2gt 1/1 Running 0 68s app=my-app,env=prod
myapp-replicaset-rrslc 1/1 Running 0 4m42s app=my-app
끝!
'ETC' 카테고리의 다른 글
[kubernetes] Deployment 란? (0) | 2023.05.20 |
---|---|
[kubernetes] ReplicaSet 실습 - pod 수 조정, 롤백 (0) | 2023.05.20 |
[kubernetes] ReplicaSet 란? (0) | 2023.05.20 |
레인저 적용 EMR의 zepplelin에서 spark 사용 (0) | 2023.05.17 |
Ranger 설정 수정 및 인증서 교체 (0) | 2023.05.17 |