Kubernetes: 로그 데이터 수집을 위한 CronJob 정의

이것은 내 Kube Log Exporter 시리즈에 대한 마지막 기사입니다. 첫 번째 기사에서는 기본 설계와 kubectl 명령을 실행하는 시스템에서 로그 내보내기를 실행하는 방법을 소개했습니다. 두 번째 기사에서는 클러스터 내에서 로그 내보내기를 실행하는 데 필요한 ServiceAccounts, ClusterRole 및 ClusterRoleBinding 리소스에 대해 설명했습니다. 이제 이 기사에서는 Kube Log Exporter를 자동으로 정기적으로 실행하는 cron 작업을 정의하는 방법을 설명합니다.

이 기사는 원래 my blog 에 게재되었습니다.

쿠버네티스 크론잡



A CronJobDeployment 또는 ReplicaSet와 유사한 기본 사양에 있습니다. 실행되는 컨테이너 집합을 정의하고 실행 조건을 정의합니다. 이러한 조건은 CronJob를 고유한 Kubernetes 리소스로 만드는 것입니다. 가장 중요한 것에 대해 간략히 논의해 보겠습니다.
  • scheduleTime - Linux crontab syntax을 사용하여 작업을 실행해야 하는 정확한 날짜, 시간, 분, 초를 정확하게 정의합니다.
  • completions - 이 cron 작업이 성공한 것으로 간주되기 전에 달성해야 하는 성공적인 완료 수입니다. 잠재적인 사용 사례는 데이터베이스의 저장소를 최적화하거나 파일을 정리하고 다른 성공 기준 세트를 가질 수 있는 작업입니다.
  • parallelism - cron 작업이 여러 병렬 작업에서 실행될 수 있는지 아니면 순차적으로만 실행될 수 있는지 제어합니다
  • .
  • activeDeadlineSeconds - 일괄 작업을 완료해야 하는 최대 시간 범위입니다. 이 제한에 도달하면 Kublet 스케줄러가 cron 작업을 중지하고 실패한 것으로 간주합니다
  • .

    더 많은 옵션을 사용할 수 있으므로 공식Kubernetes documentation도 살펴보세요.

    KubeLogExporter CronJob



    내가 사용하는 KubeLogExporter 크론 작업은 다음 요구 사항을 충족해야 합니다.
  • 매시간 실행해야 함
  • 성공해야 합니다. 예: 로그를 읽거나 저장할 때 오류가 발생하지 않음
  • 네임스페이스, 포드 및 로그에 대한 적절한 액세스 권한을 가지려면 지난 기사에서 논의한 서비스 계정을 사용해야 합니다.
  • 로그 파일을 저장하기 위해 영구 볼륨을 사용해야 하므로 작업이 실행되는 실제 노드와 무관하게 동일한 로그 파일이 수정됩니다.
  • CronJob 리소스 정의를 조금씩 발전시켜 봅시다. 첫 번째 부분은 일정 요구 사항을 충족합니다. 일정은 spec.schedule에 정의되어 매시간 실행됩니다. 작업은 정확히 한 번 완료되어야 하며( spec.jobTemplate.spec.completions ) 오류가 발생하면 다시 시작됩니다( spec.jobTemplate.spec.restartPolicy ).

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: kube-log-exporter-cron
    spec:
      schedule: "0 * * * *"
      jobTemplate:
        spec:
          completions: 1
          template:
            spec:
              restartPolicy: OnError
              ...
    
    ServiceAccount 선언은 매우 간단합니다. spec.jobTemplate.spec.serviceAccountName 를 추가합니다.

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: kube-log-exporter-cron
    spec:
      schedule: "0 * * * *"
      jobTemplate:
        spec:
          completions: 1
          template:
            spec:
              restartPolicy: OnError
              serviceAccountName: log-exporter-sa
              ...
    

    이제 영구 볼륨 선언을 추가해야 합니다. 볼륨은 하나의 프로세스에서만 마운트하면 되며 1Gi 크기를 예약합니다.

    kind: PersistentVolumeClaim
    metadata:
      name: log-exporter-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    

    내가 선택한 Kubernetes 배포판K3S에서 PersistentVolumeClaim가 정의되면 영구 볼륨이 자동으로 생성됩니다. 다른 배포판에서는 설정PersistentVolume도 필요하지만 이 기사의 초점은 아닙니다.

    이제 PersistentVolumeClaim 를 사용하여 spec.jobTemplate.spec.volumes 의 볼륨을 정의한 다음 이 볼륨을 spec.jobTemplate.spec.containers.volumeMounts 의 컨테이너에 탑재된 볼륨으로 참조합니다.

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: kube-log-exporter-cron
    spec:
      schedule: '0 * * * *'
      jobTemplate:
        spec:
          completions: 1
          template:
            spec:
              serviceAccountName: log-exporter-sa
              containers:
                - name: kube-log-exporter
                  image: docker.admantium.com/kube-log-exporter:0.1.9.12
                  volumeMounts:
                    - name: log-exporter-volume
                      mountPath: /etc/kube-log-exporter/logs
              restartPolicy: Never
              volumes:
                - name: log-exporter-volume
                  persistentVolumeClaim:
                    claimName: log-exporter-pvc
    

    CronJob 실행



    이제 kubectl create -f kube-log-exporter-cron-job.yaml 를 사용하여 cron 작업을 생성합니다. 작업이 실행되면(테스트 목적으로 schedule: /1 ** **를 사용하여 매분 작업을 실행할 수도 있음) 작업 기록을 볼 수 있습니다.

    kb describe cronjob kube-log-exporter   130 ↵
    Name:                          kube-log-exporter-cron
    Namespace:                     default
    Labels:                        <none>
    Annotations:                   Schedule:  0 * * * *
    
    ...
    
    Last Schedule Time:  Mon, 25 Aug 2020 19:00:00 +0200
    Active Jobs:         <none>
    Events:
      Type    Reason            Age   From                Message
      ----    ------            ----  ----                -------
      Normal  SuccessfulCreate  12m   cronjob-controller  Created job kube-log-exporter-cron-1590426000
      Normal  SawCompletedJob   12m   cronjob-controller  Saw completed job: kube-log-exporter-cron-1590426000, status: Complete
      Normal  SuccessfulDelete  12m   cronjob-controller  Deleted job kube-log-exporter-cron-1590415200
    

    그리고 다음은 생성된 로그 파일의 예입니다.

    > ls -la /etc/kube-log-exporter/logs
    
    -rw-r--r-- 1 root root    4515 Aug 25 19:00 lighthouse-78cc7475c7-74ctt_lighthouse.log
    -rw-r--r-- 1 root root    6012 Aug 25 19:00 lighthouse-78cc7475c7-gcl94_lighthouse.log
    -rw-r--r-- 1 root root    6873 Aug 25 19:00 lighthouse-78cc7475c7-k2cv7_lighthouse.log
    -rw-r--r-- 1 root root    7634 Aug 25 19:00 lighthouse-78cc7475c7-l7zpv_lighthouse.log
    -rw-r--r-- 1 root root    4636 Aug 25 19:00 lighthouse-78cc7475c7-wh2gk_lighthouse.log
    -rw-r--r-- 1 root root   25741 Aug 25 19:00 redis-6b746f4d9b-8tjds_redis.log
    ....
    



    > cat /etc/kube-log-exporter/logs/redis-6b746f4d9b-8tjds_redis.log
    
    1:C 25 Aug 2020 16:21:04.675 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    1:C 25 Aug 2020 16:21:04.675 # Redis version=6.0.1, bits=64, commit=00000000, modified=0, pid=1, just started
    1:C 25 Aug 2020 16:21:04.675 # Configuration loaded
                    _._
               _.-``__ ''-._
          _.-``    `.  `_.  ''-._           Redis 6.0.1 (00000000/0) 64 bit
      .-`` .-```
    {% endraw %}
    .
    {% raw %}
      ```\/    _.,_ ''-._
     (    '      ,       .-`  | `,    )     Running in standalone mode
     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 7139
     |    `-._   `._    /     _.-'    |     PID: 1
      `-._    `-._  `-./  _.-'    _.-'
     |`-._`-._    `-.__.-'    _.-'_.-'|
     |    `-._`-._        _.-'_.-'    |           http://redis.io
      `-._    `-._`-.__.-'_.-'    _.-'
     |    `-._`-._        _.-'_.-'    |
          `-._    `-.__.-'    _.-'
              `-._        _.-'
                  `-.__.-'
    
    1:M 25 Aug 2020 16:21:04.678 # Server initialized
    

    Cron 작업: 리소스 정의 완료



    여기 다시 전체 버전이 있습니다.

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: kube-log-exporter-cron
    spec:
      schedule: '0 * * * *'
      jobTemplate:
        spec:
          completions: 1
          template:
            spec:
              serviceAccountName: log-exporter-sa
              containers:
                - name: kube-log-exporter
                  image: docker.admantium.com/kube-log-exporter:0.1.9.12
                  args: ['node', 'cluster.js']
                  volumeMounts:
                    - name: log-exporter-volume
                      mountPath: /etc/kube-log-exporter/logs
              restartPolicy: Never
              volumes:
                - name: log-exporter-volume
                  persistentVolumeClaim:
                    claimName: log-exporter-pvc
              imagePullSecrets:
                - name: registry-secret
    

    결론



    KubernetesCronJob는 클러스터에서 정기적으로 예약된 작업을 정의합니다. 일반적인 사용 사례는 파일 기울이기, 인덱스 업데이트 또는 데이터 수집과 같은 유지 관리 작업입니다. 로그 데이터를 일반 파일에 저장하려면 cron 작업을 사용하는 것이 간단한 솔루션입니다. 이 기사에서는 KubeLogExplorer를 사용하여 파일의 Pod 로그 데이터를 영구 볼륨으로 유지하는 cron 작업을 정의하는 방법을 보여주었습니다.

    좋은 웹페이지 즐겨찾기