컨트롤러는 pod들을 관리하기 위한 쿠버네티스 오브젝트 이며, desired state로 Pod들을 관리하게 된다.
desired state란 컨트롤러가 궁극적으로 바라는 상태이며 컨트롤러는 해당 상태로 가기위해 pod들을 관리하게 된다.
현재상태는 pod 2개가 동작중이고, desired state는 pod3개 동작이라면, 컨트롤러는 해당 pod를 하나 더 실행시켜 desired state를 만족시키게 될 것 이다.
이러한 컨트롤러에는 여러가지가 있으며, 이 포스팅에서는
- ReplicaSet
- Deployment
- StatefulSet
- DaemonSet
- Job & CronJob
5가지 컨트롤러에 대해 알아본다.
ReplicaSet
레플리카셋
레플리카셋의 목적은 레플리카 파드 집합의 실행을 항상 안정적으로 유지하는 것이다. 이처럼 레플리카셋은 보통 명시된 동일 파드 개수에 대한 가용성을 보증하는데 사용한다. 레플리카셋의
kubernetes.io
ReplicaSet은 한번에 여러개의 Pod를 생성해주어 서비스의 가용성을 높여주는 쿠버네티스 컨트롤러다.
ReplicaSet은 desired-state를 가지며, 매 loop를 돌면서 현재 상태가 desired-state와 일치하는지 끊임없이 비교하게 된다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replica
labels:
controller: nginx-replica
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
apiVersion: apps/v1 고정
spec.replicas : 복제할 pod의 개수를 지정한다.
spec.selector : 복제할 pod를 정의한다. 예시에서는 label이 app: nginx인 pod를 복제한다
spec.template : pod들을 정의한다.
이로써 생성된 Pod들은 {pod이름}-replica-{id}의 형태를 가지게 된다.
스케일 확장 및 축소
쿠버네티스의 선언적 명령문을 통해 replicaset의 desired state 를 바꿔줄 수 있다.
kubectl scale rs --replicas <scale 수> <replicaset name>
다음 명령을 통해 바꿔줄 수 있다.
Deployment
디플로이먼트
디플로이먼트(Deployment) 는 파드와 레플리카셋(ReplicaSet)에 대한 선언적 업데이트를 제공한다. 디플로이먼트에서 의도하는 상태 를 설명하고, 디플로이먼트 컨트롤러(Controller)는 현재 상태에서 의
kubernetes.io
Deployment는 ReplicaSet에 업데이트 기능이 추가된 컨트롤러로써 Pod 업데이트 및 배포에 특화되어있다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
yml 파일 작성법은 replicaset과 동일하므로 따로 언급하진 않는다.
컨테이너 업데이트
deployment의 장점으로는 Pod의 업데이트가 쉽게 가능하다는 점이다.
kubectl set image deployment <deployment name> <pod.container name>=<container image> --record
다음 명령을 통해 롤링 업데이트(default)가 가능하게 한다.
위 예시는 nginx pod의 nginx 컨테이너 버전을 바꿔 업데이트 시키는 모습인데, 하나의 컨테이너가 생성이 되고, 기존 컨테이너가 종료되는 롤링 업데이트 방식을 취한다는것을 알 수 있다.
Rolling update
롤링 업데이트는 기본값이지만, 추가적인 롤링 업데이트 설정을 위해 yml 파일을 다음과 같이 수정해줄 수 있다.
spec:
...
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
...
spec에 다음 설정들을 추가해줄 수 있다.
maxUnavailable : 최대로 중단될 pod의 비율을 설정한다.
만약 4개의 pod가 있다면, 최대 1개의 pod가 중지될 수 있다는 의미다.
maxSurge : 최대로 초과될 수 있는 pod의 비율을 설정한다.
만약 4개의 pod가 있다면 최대 1개 초과, 즉 5개의 pod만 생성될 수 있다.
즉 위의 내용대로라면 업데이트시 무조건 1개의 파드가 생성되고, 한개의 파드가 사라지는 식으로 업데이트가 될것이다.
업데이트 기록 확인
kubectl rollout history deployment <deployment-name>
업데이트 롤백
kubectl rollout undo deployment --to-revision={n}
StatefulSet
스테이트풀셋
스테이트풀셋은 애플리케이션의 스테이트풀을 관리하는데 사용하는 워크로드 API 오브젝트이다. 파드 집합의 디플로이먼트와 스케일링을 관리하며, 파드들의 순서 및 고유성을 보장한다 . 디플
kubernetes.io
StatefulSet은 pod의 상태가 필요한 경우 사용되게 됩니다. StatefulSet으로 생성하게된 pod는, 순서를 가지며 각 순서마다 고유한 state를 가질 수 있습니다.
이는 순차적인 서비스가 진행되어야 하는 경우나, 각 Pod가 고유한 역할을 가져야할 경우 사용되게 됩니다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-statefulset
spec:
serviceName: jhkim
selector:
matchLabels:
app: nginx
replicas: 3
minReadySeconds: 10
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx:1.14.1
ports:
- containerPort: 80
DaemonSet
데몬셋
데몬셋 은 모든(또는 일부) 노드가 파드의 사본을 실행하도록 한다. 노드가 클러스터에 추가되면 파드도 추가된다. 노드가 클러스터에서 제거되면 해당 파드는 가비지(garbage)로 수집된다. 데몬
kubernetes.io
Job & CronJob
잡
잡에서 하나 이상의 파드를 생성하고 지정된 수의 파드가 성공적으로 종료될 때까지 계속해서 파드의 실행을 재시도한다. 파드가 성공적으로 완료되면, 성공적으로 완료된 잡을 추적한다. 지정
kubernetes.io
크론잡
FEATURE STATE: Kubernetes v1.21 [stable] 크론잡은 반복 일정에 따라 잡을 만든다. 하나의 크론잡 오브젝트는 크론탭 (크론 테이블) 파일의 한 줄과 같다. 크론잡은 잡을 크론 형식으로 쓰여진 주어진 일정
kubernetes.io