System Engineering/Kubernetes

3. K8s Controller

Hopulence 2021. 3. 25. 20:23
반응형

1. Cotroller

 - K8s에서 ReplicationController(RC), ReplicaSet(RS), DaemonSet, Jon, StatuefulSet, Deployment 등이 콘트롤러가 있다

 

2. ReplicationContoller

 - Label을 기준으로 Replicas에 설정값만큼 구동되는 Pod의 개수를 보장

 - 구동중인 Pod가 죽으면 Replias의 개수가 맞게 Auto Deploy하여 개수 유지

 - Equality Based Label

    * Container의 Image가 다르더라도 selector가 일치하는 Pod가 이미 구동중이라면, 새로 Deploy되지 않음.

  replication.yaml docs/concepts/workloads/controllers
  apiVersion: v1
  kind: ReplicationController
  metadata:
    labels:
      app: nginx
    name: nginx
  spec:
    replicas: 3     
    selector:
      app: nginx
    template:       
      metadata:
        name: nginx
        labels:
          app: nginx
      spec:
        containers:
        - name: nginx
          image: nginx
          ports:
          - containerPort:30

 

3. ReplicaSet

 - ReplicationContoller의 새버전으로 기능은 동일하나 Set based Label 사용한다

 

4. Deployment

 - ReplicaSet을 만들고 관리

    * 실제 운용 환경에서는 ReplicaSet과 Pod를 직접 배포하는 것은 특수한 케이스이다.

       일반적으로 Deployment를 통하여 배포한다.

    * Histroy 기능으로 기존에 배포된 형상을 가지고 있어 Roll-back이 용이

 

새버전의 RC를 배포하고 기존의 RC를 자동으로 삭제

  kind: Deployment
  apiVersion: v1beta1
  metadata:
    name: frontend
  spec:
    replicas: 4
      selector:
        role: web
      template:
        metadata:
        name: web
        labels:
          role: web
      spec:
        containers:
        - name: my-app
          image: my-app
        - name: nginx-ssl
          image: nginx
          ports:
          - containerPort: 80
          - containerPort: 443

 

- Deploy Strategies

    1) Supported Strategy

  • Rolling update : 구버전의 Pod를 하나씩 내리고 새버전의 Pod를 배포

        * On-premise에서 H/W 자원에 제약 사항이 있을때 좋다

kubectl rollout undo deployment [ deployment_name ] --to-revision=[version to raollback]

        * history 기능으로 쉽게 Rollback이 가능

 

    1) Unupported Strategy

  • Blue&Green : 새버전의 Pod를 배포하고 구버전의 Pod가 구동중이면 내린다.

        * Resource가 순간적으로 2배가 필요

        * Deploy를 할때, selector의 version을 변경해서 새버전으로 라우팅을 변경한다.

 

  • Canary deployment : 일부 Node만 새버전으로 Deloy한 뒤 Traffic을 수용

 

5. DaemonSet

  - Pod가 각 노드에서 하나씩 구동되게 하는 형태로 관리하는 콘트롤러

  - 주로 모니터링, 로그수집 등의 용도로 사용

  - selector를 통해 특정 Node에만 배포되도록 설정 가능

 

 

 

 ex) GPU가 설치된 노드에만 DaemonSet을 구동하여 모니터링

  ### daemonset.yaml
  
  apiVersion: v1
  kind: DaemonSet
  metadata:
    name: fluentd-elasticsearch
    namespace: kube-system
    labels:
      k8s-app: fluentd-logging
  sepc:
    selector:
      matchLabels:
        name: fluentd-elasticsearch
      affinity:
        nodeAffinity:
          requireDuringSchedulingIgnoreDuringExecetuon:
            nodeSelectorTerms:
            - matchExpressions:
              - key: aliyun.accelerator/nvidia_name
                operator: DoesNotExist
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name:  fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
  ...

 

5. Job

  - 배치나 일회성 형태의 워크로드 모델을 지원하는 콘트롤러

  - Job에 의해 관리되는 Pod는 Job이 종료되면 Pod도 같이 종료

 

  - Crash 등 비정상 상황 발생 시 작업 종료 또는 재시작 가능 

    * 작업이 처음부터 다시 시작되는 것으로 Resume이 아닌 Restart이다

 

    * 프로세스의 exit 코드를 기준으로 작업 실패시 조치 가능

  apiVersion: batch/v1
  kind: Job
  metadata:
    name: pi
  spec:
    template:
      spec:
        containers:
        - name: pi
          image: perl
          command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
        restartPolicy: Never
    backoffLimit: 4

  - 작업 방식에 Parallel run과 Sequential run 두 가지 방법이 있다.

  - CronJob을 통해 자동화하여 주기적으로 Job 실행이 가능

  apiVersion: batch/v1
  kind: CronJob
  metadata:
    name: hello
  spec:
    schedule: "0 5 * * *"
    jobTemplate:
      spec:
        template:
          spec:
            containers:
            - name: hello
              image: busybox
              args:
              - /bin/sh
              - -c
              - date; echo Hello from the K8s Cluster
            restartPolicy: OnFailure

 

6. Reference

Kubernetes Advanced Workshop
반응형