쿠버네티스 Kubernetes 레플리케이션 컨드롤러 (Replication Controller)
# 레플리케이션 컨트롤러
ReplicationController(RC)
컨트롤러에 따라 파드를 관리하는 방법이 다르다
파드단위로 복제 된 복제본을 제어
복제= 서비스를 지속시키는데에 좋다
Scale out (로드밸런서 필요)
분산 아키텍처 구성에는 레플리케이션 컨트롤러가 가장 적합
레플리케이션 컨트롤러가 레이블 셀렉터를 이용하여 관리할 대상의 선택
# 레플리케이션 컨트롤러 구성
1. 파드를 지정하는 레이블 셀렉터
2. 파드를 생서아기위한 파드 템플릿?
3. 복제본 수
# 레플리케이션 컨트롤러가 제공하는 기능
원하는 복제본 수의 파드가 없는경우 파드 템플릿을 이용하여 파드를 생성
노드에 장애가 발생하면 장에가 발생한 노드에서 실행중이던 파드를 다른 노드에 복제본을 생성
수동이나 자동으로 파드를 수평적으로 스케일링
# 야믈파일 작성
vagrant@k-control:~$ cat ldh-rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: ldh-rc
spec:
replicas: 3
selector:
app: dh-rc #selector와 template의 labels가 무조건 같아야 한다
template:
metadata:
labels:
app: dh-rc
spec:
containers:
- image: ghcr.io/c1t1d0s7/go-myweb
name: ldh
ports:
- containerPort: 8080
protocol: TCP
#레플리케이션 컨트롤러 생성
vagrant@k-control:~$ kubectl create -f ldh-rc.yml
#레플리케이션 컨트롤러 확인
vagrant@k-control:~$ kubectl get replicationcontrollers
NAME DESIRED CURRENT READY AGE
ldh-rc 3 3 3 77s
# 파드 목록 확인
vagrant@k-control:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
ldh-rc-5thnq 1/1 Running 0 91s
ldh-rc-dhnvq 1/1 Running 0 91s
ldh-rc-gcwwz 1/1 Running 0 91s
# 파드에 구성된 레이블 확인
vagrant@k-control:~$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
ldh-rc-5thnq 1/1 Running 0 108s app=dh-rc
ldh-rc-dhnvq 1/1 Running 0 108s app=dh-rc
ldh-rc-gcwwz 1/1 Running 0 108s app=dh-rc
#레플리케이션 컨드롤러와 파드
# 장애가 발생했다고 가정하고 파드 삭제
vagrant@k-control:~$ kubectl delete pod ldh-rc-5thnq
pod "ldh-rc-5thnq" deleted
# 파드 목록 확인
# ldh-rc-5thnq는 삭제되고 ldh-rc-qgnwq 파드가 생성되었다
# 레플리케이션 컨트롤러가 없어진 것을 확인하고 생성
vagrant@k-control:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
ldh-rc-dhnvq 1/1 Running 0 3m12s
ldh-rc-gcwwz 1/1 Running 0 3m12s
ldh-rc-qgnwq 1/1 Running 0 40s
# 레플리케이션 컨트롤러와 레이블
# 레이블 확인
vagrant@k-control:~$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
ldh-rc-dhnvq 1/1 Running 0 3m36s app=dh-rc
ldh-rc-gcwwz 1/1 Running 0 3m36s app=dh-rc
ldh-rc-qgnwq 1/1 Running 0 64s app=dh-rc
# 기존 파드에 레이블 추가
vagrant@k-control:~$ kubectl label pod ldh-rc-dhnvq env=dev
# 레이블 확인
# 추가 레이블만 구성하였고 변경사항이 없다
vagrant@k-control:~$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
ldh-rc-dhnvq 1/1 Running 0 4m9s app=dh-rc,env=dev
ldh-rc-gcwwz 1/1 Running 0 4m9s app=dh-rc
ldh-rc-qgnwq 1/1 Running 0 97s app=dh-rc
# 기존 파드의 레이블 변경
vagrant@k-control:~$ kubectl label pod ldh-rc-dhnvq app=ldh --overwrite
# 레이블 확인
# app=dh-rc 레이블이 두개밖에 없기 때문에 새로운 ldh-rc-m2hsc 파드 생성
vagrant@k-control:~$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
ldh-rc-dhnvq 1/1 Running 0 4m49s app=ldh,env=dev
ldh-rc-gcwwz 1/1 Running 0 4m49s app=dh-rc
ldh-rc-m2hsc 1/1 Running 0 4s app=dh-rc
ldh-rc-qgnwq 1/1 Running 0 2m17s app=dh-rc
# 원래대로 ldh-rc-dhnvq 파드를 app=dh-rc 레이블로 변경
vagrant@k-control:~$ kubectl label pod ldh-rc-dhnvq app=dh-rc --overwrite
# 확인
vagrant@k-control:~$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
ldh-rc-dhnvq 1/1 Running 0 5m19s app=dh-rc,env=dev
ldh-rc-gcwwz 1/1 Running 0 5m19s app=dh-rc
ldh-rc-m2hsc 0/1 Terminating 0 34s app=dh-rc
ldh-rc-qgnwq 1/1 Running 0 2m47s app=dh-rc
-> 가장 최근에 생성된 ldh-rc-m2hsc를 삭제한다
# 삭제 확인
vagrant@k-control:~$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
ldh-rc-dhnvq 1/1 Running 0 5m36s app=dh-rc,env=dev
ldh-rc-gcwwz 1/1 Running 0 5m36s app=dh-rc
ldh-rc-qgnwq 1/1 Running 0 3m4s app=dh-rc
# 파드의 수평 스케일링
복제본 수를 변경하여 수평 스케일링
# 명령을 이용한 스케일링
vagrant@k-control:~$ kubectl scale replicationcontroller ldh-rc --replicas=4
# 레플리케이션 컨트롤러 상태 확인
vagrant@k-control:~$ kubectl get replicationcontrollers
NAME DESIRED CURRENT READY AGE
ldh-rc 4 4 4 6m44s
# 파드 목록
# 하나 늘어남
vagrant@k-control:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
ldh-rc-dhnvq 1/1 Running 0 6m52s
ldh-rc-gcwwz 1/1 Running 0 6m52s
ldh-rc-mw8rr 1/1 Running 0 19s
ldh-rc-qgnwq 1/1 Running 0 4m20s
# 오브젝트 수정을 이용한 스케일링
vagrant@k-control:~$ kubectl edit replicationcontrollers ldh-rc
spec:
replicas: 5
# 확인
vagrant@k-control:~$ kubectl get replicationcontrollers
NAME DESIRED CURRENT READY AGE
ldh-rc 5 5 5 9m8s
# 파드 목록
vagrant@k-control:~$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
ldh-rc-6qqk5 1/1 Running 0 64s app=dh-rc
ldh-rc-dhnvq 1/1 Running 0 9m13s app=dh-rc,env=dev
ldh-rc-gcwwz 1/1 Running 0 9m13s app=dh-rc
ldh-rc-mw8rr 1/1 Running 0 2m40s app=dh-rc
ldh-rc-qgnwq 1/1 Running 0 6m41s app=dh-rc
# 오브젝트 파일 수정을 이용한 스케일링
vagrant@k-control:~$ kubectl replace -f ldh-rc.yml
# 확인
원래 야믈파일의 정의대로 수정됨
vagrant@k-control:~$ kubectl get replicationcontrollers
NAME DESIRED CURRENT READY AGE
ldh-rc 3 3 3 10m
# 파드 목록
5->3으로 변경 되었기 때문에 두개 삭제됨
vagrant@k-control:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
ldh-rc-dhnvq 1/1 Running 0 11m
ldh-rc-gcwwz 1/1 Running 0 11m
ldh-rc-qgnwq 1/1 Running 0 8m29s
# 레플리케이션 컨트롤러 및 파드 삭제
vagrant@k-control:~$ kubectl delete replicationcontrollers ldh-rc
# 확인
vagrant@k-control:~$ kubectl get replicationcontrollers
No resources found in default namespace.
# 파드 목록
vagrant@k-control:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
ldh-pod 1/1 Running 1 23h
ldh-pod-label 1/1 Running 0 4h29m
A | A(복제본) | A(복제본) | ||||||
node1 | node2 | node3 |