쿠버네티스 애플리케이션 배포법

CHAN LIM·2022년 8월 28일
0

K8S

목록 보기
5/11

기본 오브젝트

  • 파드

    • 쿠버네티스에서 실행되는 최소 단위, 즉 웹 서비스를 구동하는데 필요한 최소 단위.
    • 독립적인 공간과 사용 가능한 IP 소유.
    • 디플로이먼트, 레플리카셋, 잡, 크론잡, 데몬셋, 스테이트풀셋
  • 서비스

    • 파드가 죽었는지 살았는지 신경 쓰지 않아도 이를 논리적으로 연결하는 것.
    • 기존 인프라의 로드밸런서, 게이트웨이랑 비슷한 역할.
  • 네임스페이스

    • 쿠버네티스 클러스터에서 사용되는 리소스들을 구분해 관리하는 그룹.
  • 볼륨

    • 파드가 생성될 때 파드에서 사용할 수 있는 디렉터리를 제공.

++ 왜 컨테이너에 명령이 필요한가?

command와 args [커맨드와 인자]

1. 계속 동작하게 하고 싶을 때

...
command: ["/bin/sh", "-c", "sleep 3600"]

2. 사용자가 원하는 명령을 내리고 싶을 때

한번에 처리

...
command: ["/bin/sh", "-c", "echo run mutiple-command-v1 && sleep 3600"]

나눠서 처리

...
command: ["/bin/sh", "-c", "echo run mutiple-command-v2; sleep 3600"]

여러 줄로 처리

...
command:
  - "/bin/sh" 
  - "-c" 
  -
    echo run mutiple-command-v3
    sleep 3600

명령에 인자(args)를 추가하는 방법

...
command: ["/bin/sh", "-c"] 
args:
-
    echo run mutiple-command-w-args
    echo add commentary
    sleep 3600
도커(이미지)필드 이름쿠버네티스에 대응되는 필드 이름설명
Entrypointcommand컨테이너에서 실행되는 커맨드
Cmdarg커맨드에 전달되는 인자들

이미지
Entrypoint
이미지
Cmd
컨테이너
command
컨테이너
args
실행되는 커맨드
eprun cmd설정되지 않음설정되지 않음ep run cmd
eprun cmdc-ep설정되지 않음c-ep
eprun cmd설정되지 않음c-argsep c-args
eprun cmdc-epc-argsc-ep c-args



Pod

  • 쿠버네티스에서 실행되는 최소 단위, 즉 웹 서비스를 구동하는데 필요한 최소 단위이다.
  • Pod는 한 개 또는 여러 개의 컨테이너를 포함합니다.

EX)

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: po-nginx
  name: po-nginx
spec:
  containers:
  - image: nginx
    name: nginx
  • version, kind, metadata, spec는 리소스를 정의할 때 반드시 필요한 요소입니다.

Deployment

  • 시스템의 처리 능력을 분산시키고 장애가 발생한 서버들을 제외한 나머지 서버에게 부하를 분산하는 기능을 하는 오브젝트이다.
  • 파드의 수를 유지시키기도하며 애플리케이션의 버전을 업그레이드할 때 새로운 버전의 파드로 조금씩 바꾸며 업그레이드를 진행할 수 있기 때문에 무중단 업그레이드 가능하고, 보통 디플로이먼트가 생성되면 해당 디플로이먼트에 대응하는 레플리카셋도 함께 생성된다.
  • 따라서, 디플로이먼트를 사용하면 파드와 레플리카셋을 직접 생성할 필요가 없다.
  • 파드와 레플리카셋(ReplicaSet)에 대한 선언적 업데이트를 제공한다.
  • 파드의 수를 관리한다.
    • 레플리카셋을 이용하여 관리합니다.

API

apiVersion : apps/v1 설정
kind : Deployment
metadata : name에 오브젝트의 이름을 설정
spec : 디플로이먼트의 사용을 기술
	replicas : 파드 템플릿을 사용해서 가동할 파드의 수를 지정
	selector : matchLabels의 라벨을 통해 실행할 템플릿을 찾는다. template.metadata.labels의 값과 일치하지 않으면 에러 발생
	template : 
		metadata:
			labels: selector에서 지정한 matchLabels의 값과 같은 값을 입력
		spec:
			containers: 컨테이너 스펙을 작성

EX

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deploy-nginx
  name: deploy-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: po-nginx
  template:
    metadata:
      labels:
        app: po-nginx
    spec:
      containers:
      - name: nginx
        image: nginx

ReplicaSet

  • 레플리카 파드 집합의 실행을 항상 안정적으로 유지하는 것이다.
  • 보통 명시된 동일 파드 개수에 대한 가용성을 보증하는데 사용한다.

  • ReplicaSet은 label을 체크해서 원하는 수의 Pod이 없으면 새로운 Pod을 생성합니다.
    이를 설정으로 표현하면 다음과 같습니다.
정의설명
spec.selectorlabel 체크 조건
spec.replicas원하는 Pod의 개수
spec.template생성할 Pod의 명세

EX)

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  labels:
    app: rs-nginx
  name: rs-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: po-nginx
  template:
    metadata:
      labels:
        app: po-nginx
    spec:
      containers:
      - image: nginx
        name: nginx

replicaset이 아닌 deployment를 사용하는 이유

  • 위의 이미지는 컨테이너 버전을 업데이트 하는 과정입니다.
  • 롤링 업데이트 시, 파드를 생성하려면 디플로이먼트가 하나 더 생성해야하는데 그럴 필요 없이 디플로이먼트가 레플리카셋을 만들고 레플리카셋이 레플리카들의 복제본을 생성하여 두 개를 같이 유지하면서 업데이트 가능하다.

Job

Job의 동작

쿠버네티스에서 Job(잡)은 실행해야 할 작업 집합을 나타냅니다.

  • Job에 의해 생성된 파드는 작업을 완료하고 종료할 때까지만 실행됩니다.
  • Job은 작성한 파드의 정의, Job을 실행해야 하는 횟수, 병렬로 만들 파드의 최대 개수를 포함합니다.

  • curlchkhoon (존재하지 않음)

    • log 확인 시 작동하지 않는다.
  • restartPolicy

    • 기본 : 언제나 다시 시작한다.
    • never : 반복적으로 이루어지지 않게 한다.

Job의 병렬실행

  • job-completions
    • 하나 실행이 완료되면 다음 job을 차례대로 실행한다.
  • job-parallelism
    • 병렬적으로 동시에 실행한다.

Job의 자동 종료

  • 둘 다 sleep 60초 주목
  • job-activedeadlineseconds
    • Job이 실행되고 어느정도 시간이 되면 강제로 종료한다.
    • 강제성을 띈다.
  • job-ttlsecondsafterfinished
    • ttl : Time-To-Live
    • Job이 종료되고나서 30초를 센 후 종료한다.

CronJob

  • 주기성을 갖고 실행해야하는 Job이 있다면?
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cj-1m-hist10-curl 
spec:
  schedule: "*/1 * * * *"  
  successfulJobsHistoryLimit: 10
  jobTemplate:             # Template for job 
    spec:                  # same as before 
      template:
        spec:
          containers:
          - name: net-tools
            image: sysnet4admin/net-tools
            command: ["curlchk",  "nginx"]
          restartPolicy: Never

cron 규칙

  • 10분마다 (every) 실행하고 싶다면?
    • * /10 * * * *
  • 매일 2시에 실행하고 싶다면?
    • 0 2 * * *

history limit

  successfulJobsHistoryLimit: 10
  • 기본적으로 3개

DaemonSet

  • 노드마다 한 개씩 배포되는 파드
  • 모든(또는 일부) 노드가 파드의 사본을 실행하도록 한다.
  • 노드가 클러스터에 추가되면 파드도 추가된다.
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: ds-nginx 
  name: ds-nginx
spec:
  selector:
    matchLabels:
      app: po-nginx 
  template:
    metadata:
      labels:
        app: po-nginx
    spec:
      containers:
      - name: nginx 
        image: nginx 
  • kind는 대소문자 구분해야한다.
  • DaemonSetreplicas가 존재하지 않는다.
    • 디플로이먼트는 몇 개의 파드를 배포할지를 사용자가 결정해야 하지만
      데몬셋은 워커 노드에 한 개씩 할당하도록 이미 설정되어있습니다.

StatefulSet

  • 배포되는 파드들이 순서를 가지고 순서에 맞게 이름을 가집니다.
  • 따라서, 순서를 가지고 배포해야할 때 또는 고정된 이름이 필요한 그런 앱에 경우 StatefulSet으로 배포합니다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-chk-hn
spec:
  replicas: 3
  serviceName: sts-svc-domain #statefulset 에 꼭 필요하다.
  selector:
    matchLabels:
      app: sts
  template:
    metadata:
      labels:
        app: sts
    spec:
      containers:
      - name: chk-hn
        image: sysnet4admin/chk-hn
  • serviceName
    • 필수 사항이다.

From.

lectures
kubernetes Docs
쿠버네티스 안내서

profile
클라우드, 데이터, DevOps 엔지니어 지향 || 글보단 사진 지향

0개의 댓글