k8s controller

김승윤·2021년 11월 4일
0

k8s controller

  • 상태를 유지하지 않아도 되는 파드를 관리하는 경우
    • 레플리케이션 컨트롤러(Replication Controller)
    • 레플리카 세트(Replica Set)
    • 디플로이먼트(Deployment)
  • 클러스터 전체에 배포가 필요한 파드를 관리하는 경우
    • 데몬 셋(Demon Set)
  • 상태관리가 필요한 파드를 관리하는 경우
    • 스페이트풀세트(Stateful Set)
  • 배치성 작업을 진행하는 파드를 관리하는 경우
    • 잡(Job)
    • 크론잡(Cronjob)

Replication Controller

  • Pod가 항상 실행되도록 유지하는 kubernetes resource이다.

  • Node가 클러스터에서 사라지는 경우나 노드에서 pod가 제거된 경우와 같이 어떤 이유로든 pod가 사라지면 rc는 누락된 pod를 감지하고 대체 pod를 만든다.

  • pod의 개수를 관리

    • current state 개수와 desired state 개수가 같을 때 까지 관리
  • 세가지 요소

    • label selector
    • replica count
    • pod template
  • horizontally scaling pods

    • scale 명령어
    • edit 명령어
$ kubetcl scale rc <rc이름> --replicas=N
$ kubectl edit rc <rc이름>
  -> 아래 예시에서 replicas: 수정
  • 삭제
$ kubectl delete rc <rc이름>

예시)

apiVersion: v1
kind: ReplicationController
metadata:
  name: re-nginx
spec:
  replicas: 3
  selector:
    app: webui
  template:
    metatdata:
      name: nginx-pod
      labels:
        app: web
      spec:
        container:
        - name: nginx-container
          image: nginx:1.14
$ kubectl apply -f rc-nginx.yaml
$ kubectl get replicationcontrollers
$ kubectl describe rc rc-nginx

ReplicaSet

  • ReplicationController와 같은 역할을 하는 컨트롤러

  • rc보다 풍부한 selector

  • matchExpressions 연산자

    • In : key와 values를 지정하여 key, value가 일치하는 pod만 연결
    • NotIn : key는 일치하고 value는 일치하지 않는 pod에 연결
    • Exists : key에 맞는 label의 pod에 연결
    • DoesNotExist : key와 다른 label의 pod에 연결

    예시)

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
    matchExpressions:
    - {key: version, operator: In, values: ["1.14", "1.15"]}
  template:
    metatdata:
      name: nginx-pod
      labels:
        app: web
      spec:
        container:
        - name: nginx-container
          image: nginx:1.14
$ kubectl apply -f rs-nginx.yaml
$ kubectl get pod --show-labels
$ kubectl scale rs rs-nginx --replicas=5

Deployment

  • ReplicaSet controller를 통해 pod 수를 유지하며, Rolling Update 또는 Rolling Back 하는 기능을 포함하고 있다.

  • annotation

    • key-value를 통해 리소스 특성을 기록
    • kubernetes에게 특정 정보 전달할 용도로 사용
    • 예를 들어 Deployment의 rolling update 정보 기록
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
  annotation:
    kubernetes.io/change-cause: version 1.15
spec:
  progressDeadlineSeconds: 600
  revisionHistoryLimit: 10
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  relicas: 3
  selector:
.....

Stateful Set

  • pod의 상태를 유지해주는 컨트롤러

    • pod 이름
    • pod의 볼륨(스토리지)
    • 호스트 이름(네트워크 id)
  • pod는 고유한 ID를 가지고 순서대로 scale-out이나 scale-in을 수행할 수 있다.

  • Replicas 수를 변경할 경우 pod를 제거하거나 추가한다. 이 과정에서 가장 높은 번호를 가지는 pod부터 순서대로 종료시키는데 낮은 번호를 갖는 pod의 상태가 read 및 running 상태가 될 때까지 높은 번호를 갖는 pod를 종료시키지 않는다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sf-nginx
spec:
  replicas: 3
  serviceName: sf-nginx-service
  selector:
    matchLabels:
      app: web
  template:
    metatdata:
      name: nginx-pod
      labels:
        app: web
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14

Job

  • kubernetes는 pod를 running 상태로 유지

  • Batch 처리하는 pod는 작업이 완료되는 종료됨

    • 작업이 완료되어도 pod가 제거되지는 않음
    • 작업이 완료되는 시점이 중요한 서비스에 유용
  • Batch 처리에 적합한 컨트롤러로 pod의 성공적인 완료를 보장

    • pod 내의 컨테이너가 비정상 종료시 다시 실행
    • pod 내의 컨테이너가 정상 종료시 완료

restartPolicy

  • OnFailure : 비정상 종료시 원래 실행중이던 노드에서 컨테이너 재시작

  • Never : 비정상 종료시 재시작을 막은 후 새로운 pod를 실행

ParallelJobs

  • completions : job 오브젝트로 실행할 pod 수

  • parallelism : job에서 여러 개의 pod를 동시에 실행

activeDeadlineSeconds

  • 지정된 시간 안에 job 애플리케이션을 동작시키고 종료하려면 activeDeadlineSeconds 필드에 시간을 설정

  • 아래 예와 같이 300초를 할당하면 300초 내에 pod가 실행되어 종료되어야 하는데, 종료하지 못하면 강제로 종료시키고 DeadlineExceeded를 기록한다.

spec:
  completions: 5
  parallelism: 3
  activeDeadlineSeconds: 300
  template:
    metadata:
   ...
    spec:
      restartPolicy: OnFailure
   ....

Cronjob

  • job 오프젝트에 linux cronjob의 스케줄링 기능을 추가

  • 다음과 같은 자동화 작업에 유리

    • Data Backup
    • Send email
    • Cleaning tasks
  • Cronjob Controller가 관리

  • Cronjob Schedule

    • Minutes (from 0 to 59)
    • Hours (from 0 to 23)
    • Day of the month (from 1 to 31)
    • Month(from 1 to 12)
    • Day of the week (from 0 to 6)
      예) 매일 아침 9시 정각에 실행 : "0 9 * * *"
  • Cronjob 실패처리 : cronjob이 등록한 일정을 실행할 수 업으면 실패로 간주한다. 이후 Cronjob controller는 10초마다 한번씩 검사하며 실패한 작업을 재시도하는데, 실패횟수가 100번에 도달하면 해당 job은 실패로 간주하고 더이상 시도하지 않는다.

  • StartingDeadlineSeconds : 지정된 시간에 cronjob이 실행되지 못했을때 해당 cronjob 작업을 실행하지 않도록 한다. 아래 예는 600초 내에 등록된 cronjob의 job이 실행되지 못하면 해당 작업을 취소한다. startingDeadlineSeconds에 값이 할당되면, 실패한 작업을 재시도할 때 startingDeadlineSeconds로 할당된 시간동안은 100번의 실패횟수를 카운트하지 않고 재시도한다.

spec:
  schedule: " * * * * *"
  startingDeadlineSeconds: 600
  concurrencyPolicy: Forbid
  job Template
  ......
  • concurrencyPolicy : Forbid로 설정 시 job을 동시에 실행하지 않도록 한다.

0개의 댓글