컨트롤러란?
컨트롤러는 파드들을 관리하는 역할을 한다. 다양한 목적에 맞게 사용할 수 있는 컨트롤러가 있다는 것은 쿠버네티스의 장점 중 하나이다.
웹 서비스와 같이 오랜 시간 동안 계속 실행되어야 하는 파드들을 관리할 때는 레플리케이션 컨트롤러, 레플리카세트, 디플로이먼트 등을 사용한다.
클러스터의 전체 노드에 같은 파드를 실행할 때는 데몬세트를 사용한다. 그리고 stateless 앱을 실행하는 데 사용하는 컨테이너를 statefull앱을 실행할 때 사용하도록 만드는 스테이트풀 세트도 있다. 마지막으로 1회성 작업을 할 때 사용하는 잡, 주기적인 배치 작업을 실행할 때 사용하는 크론잡도 있다.
1. 레플리케이션 컨트롤러
레플리케이션 컨트롤러는 쿠버네티스 프로젝트의 초기부터 존재한 가장 기본적인 컨트롤러이다. 지정한 숫자만큼의 파드가 항상 클러스터 안에서 실행되도록 관리한다. 예를 들어, 파드 2개를 명시해 둔 레플리케이션 컨트롤러가 있을 때 장애나 다른 이유로 파드 개수가 2개보다 적을 시 다시 새로운 파드를 실행해 파드 개수를 2개로 맞춘다. 만약 파드가 2개보다 많아졌을 때는 그 숫자를 줄여 2개만큼만 실행되도록 조정한다.
컨트롤러를 사용하지 않고 파드를 직접 실행하면 파드에 이상이 생겨 종료되었을 때 재시작하기가 어렵다. 레플리케이션 컨트롤러를 이용해 실행한 파드라면 클러스터 안 다른 노드에 다시 파드를 실행시킬 수 있다.
레플리케이션 컨트롤러는 쿠버네티스 초창기부터 존재했지만 최근에는 비슷한 역할을 하는 레플리카세트를 사용하는 추세이다.
2. 레플리카세트
레플리카세트는 레플리케이션 컨트롤로의 발전형이다. 레플리케이션 컨트롤러와 같은 동작을 하지만 집합 기반의 셀렉터를 지원하는 차이점이 있다. 레플리케이션 컨트롤러는 실렉터가 등호 기반이므로 레이블을 선택할 때 같은지(=) 다른지(!=)만 확인한다. 하지만 집합 기반의 셀렉터는 in, notin, exists 같은 연산자를 지원한다.
또한 레플리케이션 컨트롤러는 kubectl에서 rolling-update 옵션을 사용할 수 있지만 레플리카세트는 사용할 수가 없으므로, rolling-update 옵션이 필요할 때는 디플로이먼트를 사용해야 한다.
2.1. 레플리카세트 사용
- 자세한 명세는 .spec 필드에 설정한다. .spec.template 필드에는 레플리카세트가 어떤 파드를 실행할지에 관한 정보를 설정한다.
- .spec.template.spec.containers[ ] 필드는 하위에 .name, .imgae, .ports[ ], .containerPort 필드를 이용해 컨테이너의 구체적인 명세를 설정한다. 위 예시에서는 nignx를 컨테이너 이미지, 해당 컨테이너에 접속할 포트 번호는 80번으로 설정했다.
- .spec.replicas는 파드를 몇 개 유지할지 개수를 설정하는 필드이다. (기본 값은 1이다.)
- .spec.selector는 어떤 레이블(.labels)의 파드를 선택해서 관리할지를 설정한다. 레이블을 기준으로 파드를 관리하므로 실행 중인 파드를 중단하거나 재시작하지 않고 레플리케이션 컨트롤러가 관리하는 파드를 변경할 수 있다. 그렇기때문에 처음 레플리케이션 컨트롤러를 생성할 때 .spec.template.metadata.labelsd의 하위 필드 설정과 .spec.selector.matchLabels의 하위 필드 설정이 같아야 한다. 만약 다를시 kube-apiserver에서 유효하지 않은 요청이라고 판단해 파드 변경을 거부한다.
.spec.replicas를 3으로 설정했으므로 3개의 파드가 실행된 것을 확인할 수 있다.
임의로 파드 1개를 삭제한 뒤 다시 pod를 확인했을 때 파드 개수를 3개로 유지하기 위해 파드 1개가 추가로 실행되는 것을 확인할 수 있다.
파드 개수를 조절하려면 replicaset-nginx.yaml 안 .spec.replicas 필드 값을 원하는 숫자로 수정한 뒤 다시 kubectl apply -f replicaset-nginx.yaml 명령을 실행한다.
2.2. 레플리카세트와 파드의 연관 관계
파드는 레이블 기준으로 관리하기 때문에 레플리카세트와 파드는 느슨하게 결합되어 있다. 즉, 레플리카세트와 파드를 한꺼번에 삭제할 때는 kubectl delete replicaset 컨테이너이름 --cascade=false 명령으로 레플리카세트를 삭제한다.
이때 레플리카의 상태도 확인을 할 수가 있다.
레플리카 상태 항목:
- DESIRED: 레플리카세트 설정에 지정한 파드 개수
- CURRENT: 레플리카세트를 이용해 현재 클러스터에서 동작하는 실제 파드 개수
새로 만든 레플리카세트가 정상적으로 동작하는지 확인.
새롭게 nginx-replicaset-j7gdf라는 파드를 생성한 것을 확인할 수 있다.
실행 중인 파드의 .metadata.labels.app 필드를 수정했을 때 발생하는 상황
우선 실행 중인 파드 목록을 확인한다.
kubectl edit pod 수정하려는 파드이름 명령을 실행한다.
위와같이 .metadata.labels.app 필드에서 nginx-replicaset >> nginx-other이라고 변경한다.
kubectl get pods 명령을 실행했을 때, 위와 같이 파드가 추가되어 4개가 실행되는 것을 확인할 수 있다.
<출처>
정원천 외 3명, 쿠버네티스 입문 90가지 예제로 배우는 컨테이너 관리 자동화 표준
'DevOps > KUBERNETES' 카테고리의 다른 글
[7] 서비스(Services) (0) | 2024.04.29 |
---|---|
[6-2] 컨트롤러(Controller) - 디플로이먼트 (1) | 2024.04.26 |
[5] 파드(Pod) -2 (1) | 2024.04.23 |
[4] 파드(Pod) (0) | 2024.04.22 |
[3] 쿠버네티스 오브젝트와 컨트롤러 - 네임스페이스, 템플릿 (0) | 2024.04.19 |