본문 바로가기
Kubernetes

워크로드

by Nirah 2023. 1. 3.

 

 

 

https://kubernetes.io/ko/docs/concepts/workloads/

 

워크로드

쿠버네티스에서 배포할 수 있는 가장 작은 컴퓨트 오브젝트인 파드와, 이를 실행하는 데 도움이 되는 하이-레벨(higher-level) 추상화

kubernetes.io

 

워크로드

 

워크로드는 쿠버네티스에서 구동되는 애플리케이션이다.

사용자를 대신하여 파드의 실패시 재생성 등 파드 집합을 자동으로 관리해주는 리소스이다.

리소스는 지정한 상태와 일치하도록 올바른 수의 올바른 파드 유형이 실행되고 있는지 확인하는 컨트롤러를 구성한다.

 

  • Deployment  ReplicaSet (레거시 리소스 레플리케이션컨트롤러(ReplicationController)를 대체). Deployment  Deployment 의 모든 Pod 가 필요 시 교체 또는 상호 교체 가능한 경우, 클러스터의 스테이트리스 애플리케이션 워크로드를 관리하기에 적합하다.
  • StatefulSet는 어떻게든 스테이트(state)를 추적하는 하나 이상의 파드를 동작하게 해준다. 예를 들면, 워크로드가 데이터를 지속적으로 기록하는 경우, 사용자는 Pod  PersistentVolume을 연계하는 StatefulSet 을 실행할 수 있다. 전체적인 회복력 향상을 위해서, StatefulSet  Pods 에서 동작 중인 코드는 동일한 StatefulSet 의 다른 Pods 로 데이터를 복제할 수 있다.
  • DaemonSet은 노드-로컬 기능(node-local facilities)을 제공하는 Pods 를 정의한다. 이러한 기능들은 클러스터를 운용하는 데 기본적인 것일 것이다. 예를 들면, 네트워킹 지원 도구 또는 add-on 등이 있다. DaemonSet 의 명세에 맞는 노드를 클러스터에 추가할 때마다, 컨트롤 플레인은 해당 신규 노드에 DaemonSet 을 위한 Pod 를 스케줄한다.
  • Job  CronJob은 실행 완료 후 중단되는 작업을 정의한다. CronJobs 이 스케줄에 따라 반복되는 반면, 잡은 단 한 번의 작업을 나타낸다.

 

 

 

Deployment  ReplicaSet

 

레플리카셋은 디플로이먼트에 의해 파드의 생성, 삭제 및 업데이트를 오케스트레이션 하는 메커니즘으로 사용

디플로이먼트는 여러개의 RS 를 관리

RS 는 하나 이상의 POD 를 관리

디플로이먼트 생성 순서

디플로이먼트 생성 → RS 생성 → POD 생성

 

예시로 레플리카 3개를 만드는 디플로이먼트를 생성해보자.

# 디플로이먼트
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dep-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14
        ports:
        - containerPort: 80
# 레플리카셋
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14
        ports:
        - containerPort: 80

 

다음과 같이 3개의 해시 이름이 붙은 레플리카가 생성된다. (pod 의 이름은 ‘RS + POD’ 로 생성된다.)

이렇게 파드가 생성되면 레플리카셋(RS)을 삭제해도 다시 생성된다.

디플로이먼트가 관리자기이기 때문에 디플로이먼트를 삭제하지 않는 이상 다 관리할 수 있다.

디플로이먼트 확인

k get deployment

 

레플리카셋 확인

k get rs

 

디플로이먼트의 특징은, 파드를 지워도 만들때 쓴 템플릿을 다시 참조하여 그대로 지워진 컨테이너 수 만큼 새로 생성한다는 점이다.

자동으로 복구된 파드는 해시 이름이 달라져서 재생성된다.

# k delete pods nginx-zddcg

# k get pods --show-labels

yaml파일의 replicas: 3 부분을 6으로 바꾸면 금방 6개의 파드를 생성해낼 수 있다.

이렇게 디플로이먼트는

scale out과 scale in이 빠르고 (동일 스펙의 장비 개수 조절)

scale up과 scale down이 빠르다 (장비의 스펙을 올리거나 내리는 것)

 

스케일 아웃

k scale deploy dep-nginx --replicas=5

 

스케일 인 ( cpu 100m, RAM 32Mi )

k set resources deploy dep-nginx --limits=cpu=100m,memory=32Mi

 

 

 

 

 

statefulset

 

클라이언트와 서버 관계에서, 서버가 클라이언트의 상태를 보존하는 형태의 서비스

파드 이름, 네트워크 신원, 스토리지 관계의 상태를 유지하여 Application의 안정적인 상태를 가지게 하는 워크로드 API 오브젝트

Statefulset을 생성하면 Pods에 PVC(영구 볼륨 클레임) 설정

 

구분 레플리카셋 스테이트풀셋

파드 생성 시 이름 설정 Random 이름으로 설정 cf) Pod-ska25, Pod-dk15d ... Ordinal index 이름으로 생성 cf) Pod-0, Pod-1, Pod-2 ...
파드 생성 시 순서 동시 생성 순차 생성 ( 0->1->2... )
파드 Recreate 시 파드 이름 변경 cf) Pod-sdf34 -> Pod-vjng3 파드 이름 유지 cf) Pod-2 -> Pod-2
파드 삭제 시 순서 동시 삭제 인덱스 높은 순부터 순차 삭제 ( 2->1->0 )
볼륨 생성 하는 방법 PVC를 직접 생성 volumeClaimTemplates 을 통한 동적 생성
파드의 수를 늘리면 PVC는? 1개의 PVC에 모두 연결 각각의 PV 를 생성한 뒤 연결
PVC 연결된 특정 파드를 죽으면? NodeSelector 가 설정 되어 있다면 해당 노드에 동일한 서비스로 랜덤한 파드이름 생성(같은 노드에 PVC,파드가 생성되지 않으면 연결되지 않음) 특정 파드와 동일한 파드를 생성 후 기존 PVC와 연결
PVC가 연결된 파드 수를 0으로 하면? PVC도 삭제함 PVC는 삭제하지 않음

 

node3 에서 진행

systemctl status nfs-server

저번에 설정한 nfs-server가 활성화 되어 있음

exportfs

 

node2, 3에서

cat > st-nginx.yaml

apiVersion: v1
kind: PersistentVolume # PV 설정
metadata:
  name: nfs-pv # pv명
spec:
  capacity:
    storage: 10Gi # pv 용량
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  storageClassName: manual
  persistentVolumeReclaimPolicy: Recycle
  nfs:
   server: 192.168.108.6 # pv 서버 지정
   path: /html
---
apiVersion: v1
kind: PersistentVolumeClaim # PVC 설정
metadata:
  name: nfs-pvc # pvc명
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  resources:
    requests:
      storage: 2Gi
  storageClassName: manual # 접점자
---
apiVersion: apps/v1
kind: StatefulSet # statefull set 설정
metadata:
  name: st-nginx # statefull명
spec:
  replicas: 3
  serviceName: st-nginx
  podManagementPolicy: OrderedReady # 순차적으로 파드 생성(병렬처리 하려면 'Parallel' 입력
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14
        ports:
        - containerPort: 80
        volumeMounts: # 볼륨 마운트 설정
        - mountPath: /usr/share/nginx/html # 마운트 볼륨 위치
          name: pvc-volume # pvc 연결
      volumes:
      - name: pvc-volume
        persistentVolumeClaim:
          claimName: nfs-pvc

k create -f st-nginx.yaml

k delete pods st-nginx-2

이름, 노드, 볼륨이 모두 동일한 파드가 자동 재생성된다.

node3에서 진행

cd /html

echo "Hello SeSAC" > index.html

 

master node에서 진행

curl http://10.40.0.2

마운트된 볼륨에서 수정한 내용이 잘 출력 됨

k scale statefulset st-nginx --replicas=5

curl http://10.36.0.3

스케일아웃으로 생성 된 파드들도 모두 동일한 내용을 출력함

 

k delete statefulset --all

 

 

 

Job

1개 이상의 파드를 지정한 후 지정한 파드를 성공적으로 실행하도록 하는 설정

 

apiVersion: batch/v1
kind: Job
metadata:
  name: job-example # job의 이름
spec:
  completions: 5 # Pod를 5개 순차적으로 실행.
  parallelism: 2 # running중인 Pod를 2개까지 유지, completions 5 까지
  activeDeadlineSeconds: 5 # 작업이 5초내에 마치지 않으면 강제로끝냄
  template:
    spec:
      containers:
      - name: centos-container
        image: centos:7
        command: ["bash"]
        args:
        -  "-c"
        - "echo 'Hello world' ; sleep 50 ; echo 'Bye' "
      restartPolicy: Never # 파드의 재시작 정책 (Job 실패 시 Pod를 재실행 X)
    # restartPolicy: Always # Job 실패하면 Pod 재실행
    # restartPolicy: OnFailure # Job 실패하면 Pod 재실행
    # backoffLimit: 6 # 기본값 OnFailure 때 Pod 재실행 횟수 제한

 

job으로 파드 실행

k create -f job.yaml

watch get pods -o wide

 

 

 

 

 

 

 

 

 

 

 

 

 

'Kubernetes' 카테고리의 다른 글

secret  (0) 2023.01.04
ConfigMap (환경변수)  (0) 2023.01.04
Networkpolicy  (0) 2023.01.02
쿠버네티스 논리연산자  (0) 2023.01.02
스케쥴링  (0) 2023.01.02