컨트롤러는 파드를 관리하는 역할

레플리케이션 컨트롤러

  • 지정된 숫자만큼 파드가 항상 클러스터 안에서 실행되도록 관리
  • 예를 들어 파드 개수를 2로 명시한 레플리케이션 컨트롤러는 장애나 여러 이유로 파드 개수가 2보다 적으면 자동으로 2개로 맞춤(반대로 많아져도 2개만 실행되도록 조정)

레플리카세트

정의

  • 레플리케이션과 같은 역할을 수행 하지만 집합 기반(set-based)의 셀렉터(selector)를 지원
  • 예를 들어 레플리케이션 컨트롤러에서 레이블을 선택할 때 등호(=)로 동일 여부를 확인하지만, 레플리카세트는 in. notin, exists 같은 연산자를 지원하는 점이 다름

레플리카세트 예시

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: whms-replicaset
spec:
  template: -----------------------> 어떤 파드를 실행할지 설정
    metadata:
      name: whms-replicaset-pod -----> 파드 이름
      labels:
        app: whms-replicaset-pod -----> 앱 컨테이너이고, 식별자는 whms-replicaset-pod이라고 설정
    spec:
      containers:
      - name: whms-replicaset-pod-con ---> 컨테이너 이름
        image: sftth/whms:latest --------------> 컨테이너 이미지
        ports:
        - containerPort: 8080 -------> 컨테이너 내부 포트
  replicas: 3 ---------------------> 리플리카세트가 유지할 파드 개수
  selector:
    matchLabels:
      app: whms-replicaset-pod -------> 관리할 파드의 레이블 (.spec.template.metadata.labels와 같음)

리플리카셋 삭제

  • 리플리카셋 삭제시 파드도 같이 삭제 됨
kubectl delete replicaset nginx-replicaset
  • 파드는 남겨두고 리플리카셋만 삭제하려면 –cascade=false 옵션을 사용
kubectl delete replicaset nginx-replicaset --cascade=false

레이블 수정

  • replicaset이 관리하는 pod 중에 .metadata.labels.app 필드가 변경 되면 replicaset은 해당 pod를 관리 대상에서 제외하고 replicas 개수에 따라 새롭게 pod를 생성함
  • 아래 커멘드는 pod 중에 whms-replicaset-5vv8c의 레이블을 변경 후 변경된 레이블 값 확인하기 위해 pod의 레이블 값을 출력해 보는 예제임
[summit@gcp-minikube-vm template]$ kubectl get pods -o=jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.metadata.labels}{'\n'}{end}"
whms-replicaset-5vv8c   map[app:whms-replicaset2-pod]
whms-replicaset-hsn5b   map[app:whms-replicaset-pod]
whms-replicaset-njz8m   map[app:whms-replicaset-pod]
whms-replicaset-xhzjc   map[app:whms-replicaset-pod]
[summit@gcp-minikube-vm template]$ 

3. 디플로이먼트

stateless 앱 배포 기능을 세분화

4. 데몬세트

클러스터 전체 노드를 대상으로 특정 목적(로깅, 모니터링 등)을 위한 파드를 실행할 때 사용

5. 스테이트풀세트

볼륨 등을 활용한 상태가 있는 파드를 관리

6. 잡

실행된 후 종료해야 하는 성격의 작업

7. 크론잡(cronjob)

  • 역할

시간을 기준으로 주기적으로 반복 실행

  • cronjob 예제 템플릿

일반적인 크론 스케쥴 규칙에 따라 스케쥴 시간을 설정하고 스케쥴에 따라 수행될 컨테이너 정의

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *" -------------> 스케쥴 시간 설정
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox ------------> 실행 이미지 지정
            args: ---------------------> 실행 쉘 스크립트
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
  • cronjob 실행
kubectl apply -f cronjob.yaml
  • cronjob 스케쥴 설정 확인
kubectl get cronjobs
  • Job 확인
kubectl get jobs
  • cronjob 삭제
kubectl delete cronjobs hello <-----크론잡이름
  • 추가 옵션

.spec.startingDeadlineSeconds

지정된 시간에 크론잡이 실행되지 못했을 때 설정된 시간까지 기다렸다가 시간이 지나면 크론잡이 실행되지 않음

.spec.concurrencyPolicy

크론잡이 실행하는 잡의 동시성을 관리하고 설정 값으로 Allow, Forbid, Replace 등 있음.

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello-concurrency
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 600
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster; sleep 6000
          restartPolicy: OnFailure
  • 크론잡 실행
kubectl apply -f cronjob-concurrency.yaml
  • 크론잡 수정

.spec.concurrencyPlicy를 Allow, Forbid, Replace 로 각각 수정

kubectl edit cronjob hello-concurrency
  • 크론잡 결과 확인
kubectl get pods

댓글남기기