[k8s] Controller
Controller
- Service를 관리하고 운영하는 데 도움을 주는 객체
- Pod를 생성하는 주체가 된다
- Auto Healing, Auto Scaling, Software Update, Job 등
1. ReplicaSet
- 여러 개의 Pod를 복제하여 관리 (
Replication Controller는 deprecated) -
ReplicaSet을 직접 사용하기 보다는
Deployment등 다른 오브젝트에 의해 사용되는 경우가 많다 - Template : 템플릿을 설정을 바탕으로 Pod를 생성한다 (Pod 명세)
- Replicas : 실행 시킬 Pod의 갯수
- Selector :
ReplicaSet에 연결 시킬 파드 조건- matchLabels : 레이블을 사용해서 연결
- matchExpressions : 자세한 조건으로 연결
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replica1
spec:
replicas: 4 # 실행할 pod 수
selector:
matchLabels:
app: web
template: # pod 명세
metadata:
name: pod1
labels: # key: value 형태로 레이블 지정
app: web
spec:
containers:
- name: container
image: europani/init
2. Deployment
-
ReplicaSet을 이용하여 Pod을 업데이트하고 이력을 관리하여 롤백하거나 특정 버전으로 돌아갈 수 있다
- ReCreate : 버전 업그레이드시 v1 pod를 내리고 v2 pod를 올림 (downtime 발생)
- Rolling Update : v2 pod를 먼저 올리고 v1 pod를 내림 [default]
- resource를 순차로 올리고 내리기 때문에 +1개 필요
- Blue/Green : v2[blue] pod를 올리고 service의 레이블을 v1->v2로 변경, 이상이 없다면 v1[green] pod를 내림
- resource가 2배로 필요
- Canary : 특정 대상에게만 v2를 배포했다가 이상이 없다면 전체에게 배포
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment1
spec:
replicas: 4 # 실행할 pod 수
selector:
matchLabels:
app: web
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 3 # replicas 기준 최대 이용 불가능 파드수
maxSurge: 3 # replicas 기준 최대 새로 추가되는 파드수
template: # pod 명세
metadata:
name: pod1
labels: # key: value 형태로 레이블 지정
app: web
spec:
containers:
- name: container
image: europani/init
HPA
- Horizonal Pod Autoscaler
- CPU, Memory 등 리소스의 임계치를 초과할 경우 자동으로 스케일 아웃 / 미만일 경우 스케일 인
- Memory는 사용량에 따라 변하는 CPU와 달리 GC에 의해 감소하기 때문에 HPA에서 거의 사용할 일이 없다
- HPA는 지정한 MinReplicas, MaxReplicas 범위 내에서
Deployment의replicas를 변경한다 - 변경될 파드 수 공식 (소수점은 올림 처리)
현재 파드 수 * (평균 CPU / HPA CPU)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa1
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: deployment1
minReplicas: 2 # 최소 Pod 개수
maxReplicas: 4 # 최대 Pod 개수
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60 # Scale in 이 일어날 CPU 평균사용량
behavior: # 잦은 스케일링 방지 목적
scaleUp:
stabilizationWindowSeconds: 120 # 120s 동안 60%이상 유지시 Scale out
scaleDown:
stabilizationWindowSeconds: 600 # 600s 동안 60%미만 유지시 Scale in
policies:
- type: Pods # 60s에 1개의 파드만 죽도록 정책설정
value: 1
periodSeconds: 60
3. DaemonSet
- ReplicaSet과는 다르게 Node의 상황을 고려하지 않고 모두 동일하게 Pod 생성
- Node마다 0~1개의 Pod를 생성한다(Selector로 생성하거나 생성하지 않게 설정 가능하지만 2개이상 생성은 불가능)
- ex) 모니터링, 로그 등
4. Job, CronJob
- Job : 특정 작업을 수행하는 Object
- CronJob : Job을 주기적으로 실행하는 Object
- 작업이 시작되면 Pod가 올라가고 종료 되면 Pod가 내려간다(제거되지는 않음)