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을 업데이트하고 이력을 관리하여 롤백하거나 특정 버전으로 돌아갈 수 있다

image

  • 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 범위 내에서 Deploymentreplicas를 변경한다
  • 변경될 파드 수 공식 (소수점은 올림 처리)
    현재 파드 수 * (평균 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

image

  • ReplicaSet과는 다르게 Node의 상황을 고려하지 않고 모두 동일하게 Pod 생성
  • Node마다 0~1개의 Pod를 생성한다(Selector로 생성하거나 생성하지 않게 설정 가능하지만 2개이상 생성은 불가능)
  • ex) 모니터링, 로그 등

4. Job, CronJob

  • Job : 특정 작업을 수행하는 Object
  • CronJob : Job을 주기적으로 실행하는 Object
  • 작업이 시작되면 Pod가 올라가고 종료 되면 Pod가 내려간다(제거되지는 않음)