kubernetes controller - ReplicaSet VS ReplcationController
kubernetes controller
Kubernetes 컨트롤러는 Kubernetes 시스템의 핵심 구성 요소로, 원하는 상태(desired state)를 현재 상태(current state)와 일치시키기 위해 지속적으로 작업을 수행한다.
컨트롤러는 클러스터 내의 리소스 상태를 관찰하고, 필요한 경우 조정 작업을 수행하여 원하는 상태를 유지한다.
Kubernetes에는 여러 종류의 내장 컨트롤러가 있으며, 각각 특정 종류의 리소스를 관리한다.
예를들어,
ReplicaSet: 지정된 수의 파드 복제본이 항상 실행되도록 보장한다.
Deployment: 애플리케이션의 업데이트와 롤백을 관리한다. ReplicaSet을 사용하여 파드의 원하는 수를 유지 관리한다.
StatefulSet: 순서가 지정된 파드 집합을 관리한다. 주로 상태를 유지하는 애플리케이션에 사용된다.
DaemonSet: 클러스터의 모든 노드(또는 일부 노드)에 파드의 복사본을 실행하도록 보장한다.
Job: 일회성 작업을 실행하며, 작업이 성공적으로 완료되면 파드를 종료한다.
CronJob: Job을 사용하여 예약된 시간에 작업을 실행한다.
컨트롤러는 Kubernetes API 서버와 지속적으로 통신하며, API 서버를 통해 리소스의 상태를 관찰하고, 필요한 변경 사항을 적용한다.
컨트롤러는 원하는 상태를 달성하기 위해 필요한 조치를 취하며, 이 과정은 선언적 API를 통해 정의된 원하는 상태와 실제 클러스터 상태 간의 차이를 해소하는 데 중점을 둔다.
ReplicationController
요구하는 Pod의 개수를 보장하며 파드 집합의 실행을 항상 안정적으로 유지하는 것을 목표로 하는 Controller
- 요구하는 Pod의 개수보다 부족하면 template을 이용해 Pod를 추가
- 요구하는 Pod의 개수보다 많으면 최근에 생성된 Pod를 삭제
기본 구성
- selector
- replicas
- template
apiVersion: v1
kind: ReplicationController
metadata:
name: <이름>
spec
replicas: <배포갯수>
selector:
key: value
template:
<컨테이너 템플릿>
여기, 하나의 Pod를 생성하기 위한 yaml 파일을 가지고 ReplicationController를 이용하여 여러개의 파드를 생성해보자.
Pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:latest
ReplcationController.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-nginx
spec:
replicas: 3
selector:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:latest
ReplicationController VS ReplicaSet
ReplicationController와 ReplicaSet은 Kubernetes에서 파드의 복제본을 관리하는 데 사용되는 리소스이다.
두 리소스 모두 지정된 수의 파드 복제본이 클러스터 내에서 실행되고 있음을 보장한다. 그러나 주요 차이점은 선택기(selector)의 유연성과 Kubernetes API의 버전에서 나타난다.
ReplicationController의 설정을 ReplicaSet으로 구현해보면 ReplicaSet의 유연한 selector에 대해서 알 수 있다.
ReplicationController.yaml
spec:
replicas: 3
selector:
app: webui
version: "2.1"
temp..
ReplicaSet.yaml
spec:
replicas: 3
selector:
matchLabels:
app: webui
matchExpressions:
- {key: version, operator: In, value: ["2.2","2.1"] }
temp..
ReplicationController에 대비해 ReplicaSet은 보다 유연한 selector를 제공하는 것을 보여준다.
ReplicationController의 selector는 정확히 하나의 버전만을 지칭하지만 그에 반해
ReplicaSet에서는 matchExpressions 연산자를 사용해 여러가지 버전에 해당하는 파드를 replica 할 수 있다.
matchExpressions 연산자 사용방법
selector:
matchLabels:
component: redis
matchExpressions:
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: Notin, values: [dev]
matchExpressions 연산자
- In : key와 values를 지정하여 key, value가 일치하는 Pod만 연결
- Notln:key는 일치하고 value는 일치하지 않는 Pod에 연결
- Exists : key에 맞는 label의 pod를 연결
- DoesNotExist : key와 다른 label의 pod를 연결
출처
https://www.youtube.com/watch?v=78QmQdjovCc&list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&index=18&pp=iAQB