728x90
ReplicaSet
레플리케이션컨트롤러
- 포드가 항상 실행되도록 유지하는 쿠버네티스 리소스
- 노드가 클러스터에서 사라지는 경우 해당 포드를 감지하고 대체 포드 생성
- 실행 중인 포드의 목록을 지속적으로 모니터링으로 하고 '유형'의 실제 포드 수가 원하는 수와 항상 일치하는지 확인
레플리케이션(Replication): 데이터 저장과 백업하는 방법과 관 련이 있는 데이터를 호스트 컴퓨터에서 다른 컴퓨터로 복사하는 것 (위키백과)
레플리케이션컨트롤러의 세 가지 요소
- 레플리케이션컨트롤러가 관리하는 포드 범위를 결정 하는 레이블 셀렉터
- 실행해야 하는 포드의 수를 결정하는 복제본 수
- 새로운 포드의 모양을 설명하는 포드 템플릿
레플리케이션컨트롤러의 장점
- 포드가 없는 경우 새 포드를 항상 실행
- 노드에 장애 발생 시 다른 노드에 복제복 생성
- 수동, 자동으로 수평 스케일링
레플리케이션컨트롤러의 YAML 작성
http-go-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
# 레플리케이션컨트롤러 이름
name: http-go
spec:
# 실행해야 하는 포드의 수를 결정하는 복제본 수
replicas: 3
# 레플리케이션컨트롤러가 관리하는 포드 범위를 결정 하는 레이블 셀렉터
selector:
app: http-go
# 새로운 포드의 모양을 설명하는 포드 템플릿
template:
# 포드와 완전히 동일
metadata:
name: http-go
labels:
app: http-go
spec:
containers:
- name: http-go
image: gasbugs/http-go
ports:
- containerPort: 9080
- 실행 중인 레플리케이션컨트롤러와 포드 확인
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
http-go-ffbjw 1/1 Running 0 23s
http-go-s6fkl 1/1 Running 0 23s
http-go-xzgr4 1/1 Running 0 23s
$ kubectl get rc
NAME DESIRED CURRENT READY AGE
http-go 3 3 3 17s
- 포드를 임의로 정지시켜 반응 확인
$ kubectl delete pod http-go-ffbjw
pod "http-go-ffbjw" deleted
$ kubectl get pod
http-go-5z7hf 1/1 Running 0 9s
http-go-s6fkl 1/1 Running 0 3m25s
http-go-xzgr4 1/1 Running 0 3m25s
레플리케이션 정보 확인
$ kubectl describe rc http-go
Name: http-go
Namespace: default
Selector: app=http-go
Labels: app=http-go
Annotations: <none>
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=http-go
Containers:
http-go:
Image: gasbugs/http-go
Port: 9080/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 4m13s replication-controller Created pod: http-go-ffbjw
Normal SuccessfulCreate 4m13s replication-controller Created pod: http-go-xzgr4
Normal SuccessfulCreate 4m13s replication-controller Created pod: http-go-s6fkl
Normal SuccessfulCreate 57s replication-controller Created pod: http-go-5z7hf
노드 통신 직접 다운시켜 보기
- GCP 에서 테스트 시
$ gcloud compute ssh gke-standard-cluster-1-default-pool-b1e2cd6b-z2nd
$ sudo ifconfig eth0 down
- VirtualBox 에서 테스트 시
- work2 node 네트워크 연결 끊기
$ kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready master 73d v1.19.2
work1 Ready <none> 73d v1.19.2
work2 Ready <none> 73d v1.19.2
work2 NotReady <none> 73d v1.19.2
레플리카컨트롤러의 관리 레이블 벗어나기
- 포드의 레이블이 변경되어 관리 밖으로 벗어나면 이를 건드리지 않고 새로운 포드를 생성
$ kubectl get pod -L app
NAME READY STATUS RESTARTS AGE APP
http-go-5z7hf 1/1 Running 0 22m http-go
http-go-s6fkl 1/1 Running 0 26m http-go
http-go-xzgr4 1/1 Running 0 26m http-go
$ kubectl label pod http-go-5z7hf app=http-go2 --overwrite
pod/http-go-5z7hf labeled
$ kubectl get pod -L app
NAME READY STATUS RESTARTS AGE APP
http-go-5z7hf 1/1 Running 0 23m http-go2
http-go-qnnzz 0/1 ContainerCreating 0 2s http-go
http-go-s6fkl 1/1 Running 0 27m http-go
http-go-xzgr4 1/1 Running 0 27m http-go
레플리케이션컨트롤러 설정 바꾸기
-
다음 명령어로 replicationcontroller 설정파일 접근
-
임시 디렉토리에 접근해서 수정을 하면 바로 반영이 됨
-
pod은 이런 방식으로 수정할 수 없음
-
deployment 나 replicationcontroller 옵션만 수정됨
- 다른 옵션은 수정이 되는 것처럼 보이지만 임시 디렉토리에 저장만되고 수정되지 않음
-
vim이 열리면 replicas 개수를 3에서 20개로 수정하고 저장 종료
$ kubectl edit rc http-go
-
포드의 수 변화 확인
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
http-go-46592 1/1 Running 0 20s
http-go-5vxc2 0/1 ContainerCreating 0 20s
http-go-5z7hf 1/1 Running 0 26m
http-go-68l4r 0/1 ContainerCreating 0 20s
http-go-785n6 1/1 Running 0 20s
http-go-89lvp 0/1 ContainerCreating 0 20s
http-go-97czq 1/1 Running 0 20s
http-go-9p4wm 1/1 Running 0 20s
http-go-bmngp 0/1 ContainerCreating 0 20s
http-go-clh8k 0/1 ContainerCreating 0 20s
http-go-f55dm 1/1 Running 0 20s
http-go-fmwgk 1/1 Running 0 20s
http-go-frc6j 1/1 Running 0 20s
http-go-hffzq 0/1 ContainerCreating 0 20s
http-go-m4fhc 0/1 ContainerCreating 0 20s
http-go-ms4wz 1/1 Running 0 20s
http-go-nnlck 1/1 Running 0 20s
http-go-qnnzz 1/1 Running 0 2m4s
http-go-s6fkl 1/1 Running 0 29m
http-go-wvhg9 1/1 Running 0 20s
http-go-xzgr4 1/1 Running 0 29m
- 다음 명령어로 레플리케이션컨트롤러 설정 변경
$ kubectl scale rc http-go --replicas=10
replicationcontroller/http-go scaled
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
http-go-46592 1/1 Running 0 102s
http-go-5z7hf 1/1 Running 0 27m
http-go-97czq 1/1 Running 0 102s
http-go-9p4wm 1/1 Running 0 102s
http-go-f55dm 1/1 Running 0 102s
http-go-ms4wz 1/1 Running 0 102s
http-go-nnlck 1/1 Running 0 102s
http-go-qnnzz 1/1 Running 0 3m26s
http-go-s6fkl 1/1 Running 0 30m
http-go-wvhg9 1/1 Running 0 102s
http-go-xzgr4 1/1 Running 0 30m
- 다른 설정파일을 적용하여 레플리케이션컨트롤러 설정 변경
- 파일을 copy 해서
replicas: 5
수정 후 apply
- 파일을 copy 해서
$ kubectl apply -f http-go-rc-v2.yaml
replicationcontroller/http-go created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
http-go-2v82m 1/1 Running 0 9m56s
http-go-2vkst 1/1 Running 0 10s
http-go-44ts8 1/1 Running 0 10s
http-go-dztth 1/1 Running 0 9m56s
http-go-mfnt6 1/1 Running 0 9m56s
레플리케이션컨트롤러 삭제 바꾸기
- 일반적인 삭제 명령어와 동일
$ kubectl delete rc http-go
replicationcontroller "http-go" deleted
- 실행 시키고 있는 포드는 계속 실행을 유지하고 싶은 경우에는
--cascade
옵션 사용
$ kubectl delete rc http-go --cascade=false
replicationcontroller "http-go" deleted
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
http-go-2v82m 1/1 Running 0 39s
http-go-dztth 1/1 Running 0 39s
http-go-mfnt6 1/1 Running 0 39s
레플리카셋의 등장
- 쿠버네티스 1.8버전부터 디플로이먼트(Deployment), 데몬셋(Daemonset), 레플리카셋(ReplicaSet), 스테이트풀셋(SatetfulSet) 네 API가 베타로 업데이트되고 1.9 버전에서는 정식 버전으로 업데이트됨
- 레플리카셋은 차세대 레플리케이션컨트롤러로 레플리케이션컨트롤러를 완전히 대체 가능
- 초기 쿠버네티스에서 제공했기 때문에 현장에서는 여전히 계속 사용중인 경우 존재
레플리케이션컨트롤러 vs. 레플리카셋
- 레플리카셋과 레플리케이션컨트롤러은 거의 동일하게 동작
- 레플리카셋이 더 풍부한 표현식 포드 셀렉터 사용 가능
- 레플리케이션컨트롤러: 특정 레이블을 포함하는 포드가 일치하는지 확인
- 레플리카셋: 특정 레이블이 없거나 해당 값과 관계없이 특정 레이블 키를 포함하는 포드를 매치하는지 확인
레플리카셋 생성
https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/#example
- 대부분의 요소는 거의 비슷
- apiVersion: apps/v1beta2
- kind: ReplicaSet
- matchExpressions: 레이블을 매칭하는 별도의 표현 방식 존재
apiVersion: apps/v1
kind: ReplicaSet
metadata:
# 레플리케이션컨트롤러 이름
name: http-go
spec:
# 실행해야 하는 포드의 수를 결정하는 복제본 수
replicas: 3
# 레플리케이션컨트롤러가 관리하는 포드 범위를 결정 하는 레이블 셀렉터
selector:
matchExpressions:
- key: app
operator: In
values:
- http-go
# 새로운 포드의 모양을 설명하는 포드 템플릿
template:
# 포드와 완전히 동일
metadata:
labels:
app: http-go
spec:
containers:
- name: http-go
image: gasbugs/http-go
ports:
- containerPort: 9080
$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
http-go-rs-7smqc 1/1 Running 0 2m44s app=http-go
http-go-rs-blrgz 1/1 Running 0 2m44s app=http-go
http-go-rs-f76tz 1/1 Running 0 2m44s app=http-go
레플리카셋의 조회와 삭제
- 다른 리소스와 모두 동일
- 조회:
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
http-go-rs 3 3 3 47s
- 상세조회:
$ kubectl describe rs http-go-rs
$ kubectl describe rs http-go-rs
Name: http-go-rs
Namespace: default
Selector: app=http-go-rs
Labels: <none>
Annotations: <none>
Replicas: 10 current / 10 desired
Pods Status: 10 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=rs-nginx
Containers:
nginx:
Image: nginx
Port: 9080/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 3m54s replicaset-controller Created pod: http-go-rs-7smqc
Normal SuccessfulCreate 3m54s replicaset-controller Created pod: http-go-rs-blrgz
Normal SuccessfulCreate 3m54s replicaset-controller Created pod: http-go-rs-f76tz
- 삭제
$ kubectl delete rs http-go-rs
연습문제
- nginx를 3개 생성하는 rs-nginx 레플리카셋을 생성하라
apiVersion: apps/v1
kind: ReplicaSet
metadata:
# 레플리케이션컨트롤러 이름
name: rs-nginx
spec:
# 실행해야 하는 포드의 수를 결정하는 복제본 수
replicas: 3
# 레플리케이션컨트롤러가 관리하는 포드 범위를 결정 하는 레이블 셀렉터
selector:
matchLabels:
app: rs-nginx
# 새로운 포드의 모양을 설명하는 포드 템플릿
template:
# 포드와 완전히 동일
metadata:
labels:
app: rs-nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 9080
- rs-nginx 포드의 개수를 10개로 스케일링하라
$ kubectl edit rs rs-nginx
replicaset.apps/rs-nginx edited
NAME READY STATUS RESTARTS AGE
rs-nginx-7smqc 1/1 Running 0 82s
rs-nginx-blrgz 1/1 Running 0 82s
rs-nginx-f76tz 1/1 Running 0 82s
rs-nginx-g2lms 0/1 ContainerCreating 0 5s
rs-nginx-g52wg 0/1 ContainerCreating 0 5s
rs-nginx-gcj6s 0/1 ContainerCreating 0 5s
rs-nginx-gq4fj 0/1 ContainerCreating 0 5s
rs-nginx-jl4qk 0/1 ContainerCreating 0 5s
rs-nginx-l22vq 0/1 ContainerCreating 0 5s
rs-nginx-xrzqr 0/1 ContainerCreating 0 5s
728x90
'개발강의정리 > DevOps' 카테고리의 다른 글
[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-애플리케이션 롤링 업데이트와 롤백 (0) | 2020.12.04 |
---|---|
[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-디플로이먼트 (0) | 2020.12.01 |
[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-레이블을 이용한 포드 구성 (0) | 2020.11.27 |
[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-라이브니스, 레디네스, 스타트업 프로브 구성 (0) | 2020.11.27 |
[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-pod (0) | 2020.11.27 |
댓글