K8S Workload

scvit·2023년 11월 17일

Replicaset


  • Replica : 같은 Application을 위해 구동되는 Pod 들의 집합
  • ReplicaSet : Pod들의 배포 규격을 정의하고, 규격에 정의된 수 만큼의 파드가 언제나 정상 구동 될 수 있도록 보장하는 역할
    만약 어떤 파드가 정지되면 → 동일한 새 파드를 즉시 배포 (pod 3개를 계속 유지하는 ‘선언적 구성’과 같은 개념)

예시

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3
  • apiVersion : 파드,서비스와 달리 복수의 객체를 다루는 ReplicaSet, Deployment는 apps/v1 명시 필요.
  • spec.selector.matchLabels , spec.template.metadata.labels 의 키-값 쌍은 동일해야 함

주요 명령어

kubectl get rs
kubectl get replicaset

kubectl describe rs/frontend
kubectl edit rs/frontend

# 레플리카셋 신규 배포
kubectl create -f replicaset.yaml

# 레플리카셋 신규/수정 배포
kubectl apply -f replicaset.yaml

# 레플리카셋 명세가 포함된 yaml 파일을 새로 적용
kubectl replace -f replicaset.yaml

# yaml 파일 바탕으로 배포된 레플리카셋의 레플리카 수를 6으로 조정
kubectl scale --replicas=6 -f replicaset.yaml

# myapp 이름의 레플리카셋이 가진 레플리카 수를 6으로 조정
kubectl scale --replicas=6 replicaset myapp

Deployment


  • pod와 Replicaset에 대한 선언적인 업데이트 제공
  • replicaset을 포함하는 상위 객체 (replicaset은 pod 상태체크 및 갯수 유지 담당)로, Application 또는 서비스 단위 관리를 위해 쓰임
  • Deployment로 배포된 Pod들은 <Deployment명>-<Replicaset 고유 번호> - <Random 해시 값> 의 고유식별자를 갖는다. 만약 replica 설정 변경이나 Pod가 재배포되면 식별자도 함께 변화한다.

배포

CLI

kubectl create deployment nginx --image=nginx:1.14.2 --replicas=3
  • kubectl create deployment <Deployment명> --image=<이미지명> --replicas=<replica 수> 형태로 구성
  • —image 로 지정된 이미지의 파드를 —replicas 에 지정된 숫자 만큼 생성하고 유지하는 deployment를 생성한다.
  • —image 는 필수 항목. —replicas의 default는 1

YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
  • kind 값은 반드시 Deployment여야 한다.
  • spec.replicas : 레플리카 수
  • spec.template : 배포할 파드에 대한 정보
    • spec.template.spec.containers : 파드에 들어갈 컨테이너 이미지 정보
  • spec.selector.matchLabels , spec.template.metadata.labels 에 명시된 키-값 쌍은 동일해야 한다.

배포된 Deployment 설정 바꾸기

이미 배포되어 구동중인 파드의 이미지를 업데이트 하거나, 레플리카 수 변경 등 설정 수정 필요성 발생

이미지 업데이트

  • nginx:1.14.2 → nginx:1.16.1 업데이트
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
  • 배포된 Deployment의 yaml을 불러와 컨테이너 이미지 수정 _ .spec.template.spec.containers[0].image
kubectl edit deployment/nginx-deployment

YAML파일로 직접 생성했다면, yaml파일 수정후 kubectl apply

스케일링

CLI 환경에서 레플리카 수만 조정하고 싶다면 kubectl scale 사용

kubectl scale deployment/nginx-deployment --replicas=5

단, 위 명령어는 yaml파일과 별개로 적용되므로, yaml 파일을 수정하고 apply 하는 것을 추천

Statefulset


Application의 상태를 저장하고 관리하는데 사용

Deployment와 달리, 각 Pod의 순서와 고유성을 보장하며 각각 영구 스토리지를 할당

deployment와 차이점

  1. 모든 파드가 각각 고유하며 고유 식별자를 갖는다.
  2. 모든 파드는 삭제 후 재생성시 해당 식별자를 그대로 유지한다. (Deployment는 변경됨)
  3. 모든 파드의 식별자 끝에는 번호가 붙는다. 이 번호는 레플리카 수(n)를 기준으로 0 ~ n-1까지 존재
  4. 모든 파드의 생성과 스케일링, 업데이트는 위에서 부여된 번호 순서대로 이루어짐. (삭제는 역순)
  5. 각각 파드에는 영구 스토리지 (볼륨)이 할당된다. 파드가 삭제되어도 볼륨이 남아, 파드가 다시 생성되었을 때 볼륨이 붙는다.

언제 Statefulset이 필요할까?

  • Stateless : 어느 파드가 죽었다면, 동일한 파드를 다시 만들어 대체하면 그만 = Deployment
  • 반면, DB 클러스터 같은 경우는 데이터 안정성과 무결성 유지가 필요하다 = 영구 스토리지 필요 = Stateful
    • 각각 파드에 대한 안정적이고 고유한 네트워크 식별자
    • 안정적이고 지속적인 스토리지
    • 파드와 스토리지의 질서 확립된 배치, 그리고 확장성

Statefulset의 주의점

  1. 파드별로 PV도 함께 만들어진다. 그러나 statefulset이 삭제될때 이 PV는 삭제되지 않고 남아있는다.
  2. Statefulset의 파드에 사용할 스토리지는 오직 PVC를 통해서만 가능하다. ← 파드가 늘어날 때마다 볼륨이 동적으로 붙어줘야 하기 때문
    따라서, 클러스터에 PV와 StorageClass를 동적으로 프로비저닝 해줘야 한다.
  3. Statefulset의 특정 파드에 요청을 전달하기 위한 매개체로 헤드리스 서비스 (Headless Service) 가 필요하다.
  4. Statefulset은 노드에 장애가 발생하더라도 파드를 다른 노드로 옮기지 않는다. 볼륨에 탑재된 데이터 보호가 우선이기 때문

배포하기

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-statefulset
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 1Gi
  • kind 값은 반드시 Statefulset 이어야 한다.
  • spec.replicas : replica 수
  • spec.serviceName : 헤드리스 서비스 이름
  • spec.template : 배포할 파드에 대한 정보
    • spec.template.sepc.containers : 파드에 들어갈 컨테이너 이미지 정보, volumeMounts 에 볼륨정보 필수
  • spec.volumeClaimTemplates : 파드마다 부여될 볼륨에 대한 정보. PV가 미리 있어야함.
  • spec.selector.matchLabels , spec.template.metadata.labels 에 명시된 키-값 쌍은 동일해야 한다.

헤드리스 서비스

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
  • statefulset의 YAML에 선언된 spec.serviceName 과 동일한 이름을 metadata.name 에 부여
  • 자체적으로 IP를 갖지 않는 서비스이므로, spec.clusterIP의 값은 None

Daemonset

모든 노드 , 또는 특정 레이블을 가진 노드에 하나씩 동일한 파드를 구동하게 해주는 리소스

노드에 1개씩만 배치한다. ⇒ replica (복제) 설정을 하지 않는다.

데몬셋이 구동중인 클러스터에서 노드가 추가되면, 추가된 노드에도 데몬셋 파드가 배치되지만 삭제된 노드에 있던 데몬셋 파드가 다른 노드로 이동하지는 않는다.

주로 worker node에 리소스 모니터링용 Application, 로그 수집기 배포 용도로 쓰임

배포하기

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
  • kind : Daemonset
  • spec.template : 배포할 파드에 대한 정보
    • spec.template.spec.tolerations : 특정 조건을 가진 노드에 데몬셋 파드 배치
    • spec.template.spec.nodeSelector : 특정 레이블값 노드에만 데몬셋 파드를 배치하고 싶은 경우 활용
  • spec.selector.matchLabels , spec.template.metadata.labels 에 명시된 키-값 쌍은 동일해야 한다.

0개의 댓글