ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes 특강 3회차 공부 내용 정리1 - Annotation, CronJob
    Kubernetes 2024. 5. 20. 22:52

     

     

     

    3회차는 분량이 많기도 하고, 내용이 많이 어렵게 느껴져서 공부하면서 조금씩 정리해 보려고 합니다. 🥲🥲🥲

     


     

    📚 Annotation

    k8s에서 Annotation은 Pod, Deployment, Service 등과 같은

    오브젝트에 대한 부가적인 정보를 추가로 제공하기 위한 메커니즘입니다.

     

     

    📖 Label vs Annotation

    개인적으로,
    강의 초반부터 언급되었던 레이블이 생각이 나면서 어노테이션의 개념과 약간 혼동이 되었으나,

    아래 문장을 보고 정리가 되었던 것 같습니다.

    Labels are for Kubernetes, while annotations are for humans.

     

    k8s에서 Label

    레이블은 관련 리소스 그룹을 필터링하여 식별하기 위해 Selector와 함께 사용됩니다.

    예를 들어, 특정 라벨을 기반으로 파드를 선택하거나 그룹화할 수 있습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod
      labels:
        app: nginx
        environment: production
    spec:
      containers:
      - name: nginx
        image: nginx:latest

     

    위와 같이 Pod를 생성할 때 레이블을 추가하는 예시를 보면

    nginx라는 애플리케이션을 production 환경에 배포할 때 사용한다라는 의미로 해석되게 됩니다.

     

    $ kubectl label pods nginx-pod version=v1

     

    이미 생성된 객체에 레이블을 추가하거나 수정하고 싶을 때, 명령어를 통해 해결할 수 있습니다!

    여기서는 nginx-pod라는 이름의 Pod에 version=v1이라는 레이블을 추가한다는 의미입니다.

     

    $ kubectl get pods -l app=nginx,environment=production

     

    또한 명령어를 통해 레이블 조건을 사용하여 객체를 조회할 수 있습니다. 

    위 내용은 app=nginx 그리고 environment=production 레이블이 있는 Pod를 조회한다는 의미입니다.

     

    k8s에서 Annotation

    주석은 "비식별 정보", 즉 Kubernetes가 신경 쓰지 않는 메타데이터에 사용됩니다. 

    따라서 주석 키와 값에는 제약 조건이 없습니다.

    또한 어노테이션의 메타데이터는 작거나 크고, 구조적이거나 구조적이지 않을 수 있으며, 레이블에서 허용되지 않는 문자를 포함할 수 있다고 합니다.

     

    아래와 같이 어노테이션은 레이블처럼 키/값 맵으로 구성되어있습니다.

    "metadata": {
      "annotations": {
        "key1" : "value1",
        "key2" : "value2"
      }
    }

     

    아래와 같이 metadata.annotations 필드를 사용하여 Annotation을 정의하게 됩니다.

     

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod
      labels:
        app: nginx
        environment: production
      annotations:
        imageregistry: "https://hub.docker.com/"
    spec:
      containers:
      - name: nginx
        image: nginx:latest

     

    그렇다면 Annotations 값을 조회하고 싶다면 어떻게 할까요??

     

    $ kubectl get pods {pod 명} -o jsonpath='{.metadata.annotations}'

     

    위와 같은 명령어를 사용하여 조회할 수 있습니다.

    -o jsonpath 옵션을 사용하면 출력은

    기본적으로 JSON 형식을 따르기 때문에 애노테이션도 JSON 형식으로 출력됩니다.

     

     

     

    끝으로 제가 이해한 바로 정리를 해보자면,

    레이블은 쿠버네티스 환경 내에서 관련된 리소스 그룹을 필터링하여 식별하기 위해 사용되고,

    어노테이션은 주어진 리소스에 대해서 설명또는 기록을하고자

    나 혹은 다른 사람을 위해 정보를 추가하려는 경우에 사용되는 것 같습니다.

     

     


     

    📚 CronJob

    스프링에서 @Scheduled(cron = "0 0 18 * * *")와 같이 일정한 시간 간격으로, 혹은 특정 시간에 코드가 실행되도록 설정하는 것처럼,

    쿠버네티스에서도 반복적인 일정에 따라 반복적으로 작업(Job)을 수행하는 경우, CronJob을 사용합니다.

     

     

    주요 사용 사례

    • 일정한 간격으로 작업 실행
      • cronjob을 사용하여 일정한 주기로 작업을 예약할 수 있습니다.
      • 예를 들어, 데이터베이스 백업, 로그 정리, 배치 작업등을 정기적으로 실행하고자 할 때 cronjob을 사용할 수 있습니다.

     

    • 스케줄에 따른 작업 예약
      • 분, 시간, 일, 월, 요일 등을 기반으로 작업을 실행하는 계획인 cron 표현식을 사용하여
      • "매주 월요일 오전 9시에 이메일 보내기"와 같은 작업을 스케줄링할 수 있습니다.

    • 오류 처리와 재시도
      • cronjob은 작업이 실패한 경우, 자동으로 재시도 할 수 있는 기능을 제공합니다.
      • 이를 통해 작업의 신뢰성을 높이고 오류를 처리할 수 있습니다.

     

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: hello
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: hello
                image: busybox
                imagePullPolicy: IfNotPresent
                command:
                - /bin/sh
                - -c
                - date; echo Hello from the Kubernetes cluster
              restartPolicy: OnFailure

     

    위 내용은  현재 시간과 hello 메시지를 1분마다 출력하는 yaml 파일입니다.

    해당 파일을 kubectl create -f cronjob.yaml 명령어를 이용하여 크론잡을 생성할 수 있습니다.

     

     

    get job을 통해 나온 hello-숫자는 Kubernetes에서 자동으로 생성된 일련번호를 나타내며,

    고유한 식별자로 사용됩니다.

     

    CronJob 삭제 방법

     

     

     

     

    📚 Job

    k8s에서 CronJob과 Job은 작업 스케줄링과 관련된 리소스입니다.

    그러나 Job은 일회성 작업을 실행하기 위해 사용되기 때문에, 한 번 실행된 후에는 작업이 완료되면 종료됩니다.

    또한 Job은 작업이 성공적으로 완료되었는지 여부를 추적하고, 작업 실행에 실패한 경우 재시도를 할 수 있다고 합니다.

     

    따라서 CronJob은 주기적인 반복 작업을 스케줄링하는 데 사용되고, Job은 한 번 실행되는 작업을 처리하는 데 사용됩니다.

     

    Job 정보 찾기

    $ kubectl get jobs

    3개의 job이 돌아간 것을 확인할 수 있습니다.

     

     

    해당 Job이 실행된 Pod 찾기

    $ kubectl get pods --selector=job-name={NAME}

     

     

    해당 Pod의 로그 읽어보기

    $ kubectl logs {NAME}

     

    위 예시 중에 Pod 찾기에서 status를 보면 Completed로 되어 있는 것을 보실 수 있습니다.

    Completed 상태에 있는 Pod 작업을 성공적으로 완료하고 종료된 상태입니다.

     

     

    Completed 상태에 있는 Pod는 작업을 성공적으로 완료하고 종료되었기 때문에 더 이상 실행할 필요가 없습니다.

    따라서, Kubernetes Completed 상태에 있는 Pod를 자동으로 정리하고 삭제합니다.

    이를 통해 클러스터의 자원을 효율적으로 관리하고,

    완료된 작업의 결과를 추적하기 위해 Pod에 불필요하게 남는 것을 방지합니다.

     

     

     

     

     

Designed by Tistory.