728x90
반응형

젠킨스 자체를 쿠버네티스 환경에 helm을 이용하면 쉽게 구축할 수 있었다.

 

하지만 기존에 사용하던 플러그인들과 각종 환경들을 그대로 가져오는 것이 문제였다.

 

플러그인의 경우 사용 중인지 아닌지 판별이 어려웠다.

 

plugins.jenkins.io/{plugin-name}에 있는 플러인 이름을 확인한 다음 values.yaml에서 installPlugins에 작성하여 배포했다.

 

https://github.com/jenkinsci/helm-charts/blob/0572830631b4a8bef26cff0286a99b9747686be1/charts/jenkins/values.yaml#L241-L245

 

작업들의 경우 ThinBackup을 이용하여 백업한 뒤 tar로 묶어서 scp로 다운로드했다.

 

그리고 백업 파일을 젠킨스가 올라간 파드에 kubectl cp 라는 명령어로 업로드하여 쉽게 작업들을 이전할 수 있었다.

 

Go 언어를 사용하여 플러그인을 사용하면 go를 쉽게 설치하여 사용할 수 있었다.

 

하지만 ansible 같은 설치를 별도로 해주어야 하는 프로그램들이 있어 젠킨스에서 제공하는 도커 이미지로는 할 수 없었다.

 

그리고 젠킨스 파드 내에서 프로그램 설치를 시도했지만 권한을 막아두었기에 에이전트를 띄워서 작업할 수 있는지 해보았다.

 

테스트를 해보니 작업을 수행할 때마다 파드를 띄우고 끝나면 종료하는 형식이었다.

 

python이 설치된 이미지를 활용할 수는 있겠지만 매번 ansible을 설치하거나 ansible이 설치된 커스텀 이미지를 만들어야 했다.

 

이런 것들이 번거롭기에 커스텀 젠킨스 이미지를 생성하여 사용하였다.

FROM jenkins/jenkins:2.375.2-lts-jdk11

USER root

RUN apt-get update && apt-get install -y build-essential python3 python3-pip
RUN pip install ansible

USER jenkins

 

참고 문헌

https://github.com/jenkinsci/helm-charts/tree/main/charts/jenkins

https://plugins.jenkins.io/thinBackup/

https://hub.docker.com/r/jenkins/jenkins

반응형
728x90
반응형

배열에 넣은 로그를 개별 로그처럼 나누어서 볼 수 있도록 split 함수를 이용했었는데 메모리 문제(OOM)가 발생했었다.

 

그래서 해당 기능을 하는 것을 별도로 만들어서 사용하고 있었는데 다시 문제가 생겼다.

 

우선은 logstash.yml에서 pipeline.workers, pipeline.batch.size, pipeline.batch.delay 등을 조절하여 급한 불을 껐다.

 

그리고 GC도 CMS에서 G1으로 변경하여 어느 정도는 안정적으로 구동되는 걸 확인할 수 있었다.

 

그럼에도 메모리 사용량이 많아서 다시 검색해보니 split 함수 자체에 문제가 있었던 것을 알 수 있었다.

 

def register(params)
    @field = params['field']
    @target = params['target']
end

def filter(event)
    data = event.get(@field)
    event.remove(@field)
    a = []
    data.each { |x|
        e = event.clone
        e.set(@target, x)
        a << e
    }
    a
end

코드를 보면 배열에 해당하는 부분을 가져온 다음에 제거하지만 이를 JSON으로 파싱한 로그에 다시 할당하는데

 

이 로그에 최초 로그가 있어 이것이 배열의 수만큼 복사되어 발생한 문제였다.

 

JSON으로 파싱한 다음 원본 로그의 필드를 제거하고 split이 동작하도록 하여 메모리 이슈는 어느 정도 해소했다.

참고 문헌

https://discuss.elastic.co/t/how-to-split-into-multiple-events-dynamically-for-a-given-json-tried-from-various-question-in-forums/167745/9

https://github.com/logstash-plugins/logstash-filter-split/blob/main/lib/logstash/filters/split.rb#L89

반응형

'Log' 카테고리의 다른 글

[Log] 그라파나 설정 및 API  (0) 2023.05.04
[Log] Logstash k8s로 이전하기  (0) 2023.01.26
[Log] Apache Flume  (1) 2022.04.07
[Log] Grafana 이전 하기  (0) 2021.01.28
[Log] Kubernetes에 ElasticSearch 올리기  (0) 2021.01.14
728x90
반응형

기존에 사용 중이던 ElasticSearch 서버가 근래에 자주 다운됐었다.

 

그래서 새로운 방식으로 로그를 수집해보려고 했었다.

 

Hadoop에 JSON으로 저장해서 Zeppelin에서 보려고 하니 불편 사항이 많았다.

 

다른 것들이 더 있을까 하고 찾아봤지만 ElasticSearch와 Kibana 만큼 로그를 검색하고 조회하는 도구가 없었다.

 

결국 두 개를 사용하기로 하고 Logstash 만 다른 걸 이용해보려고 하다가 Apache Flume이 생각나서 적용해보려고 했다.

 

구조는 Source -> Channel -> Sink 로 돼있고 설정이 어려워 보이지 않아 시도해보았다.

 

하지만 java.lang.NoClassDefFoundError: org/elasticsearch/common/io/BytesStream

 

에러가 발생하면서 종료됐다.

 

찾아보니 ElasticSearch jar 파일을 별도로 추가해야한다고 해서 추가했는데도 되지 않았다.

 

무엇인가 이상하여 찾아보니 Flume에서 제공하는 라이브러리에서

 

org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder를 임포트하여 사용하는데

 

해당 패키지는 ElasticSearch 6.x 이상에서는 없어진 패키지였다.

 

Flume을 굳이 사용하고자 한다면 sink 를 직접 만들어서 사용해야 해서 Logstash로 선회했다.

 

(물론 fluentd를 사용해도 되지만 다른 곳에서 사용하여 다른 것을 써보고 싶었다)

참고 문헌

  1. https://github.com/apache/flume/blob/trunk/flume-ng-sinks/flume-ng-elasticsearch-sink/src/main/java/org/apache/flume/sink/elasticsearch/ElasticSearchLogStashEventSerializer.java
  2. https://github.com/elastic/elasticsearch/tree/5.6/core/src/main/java/org/elasticsearch/common/xcontent
반응형

'Log' 카테고리의 다른 글

[Log] Logstash k8s로 이전하기  (0) 2023.01.26
[Log] Logstash 메모리 문제  (0) 2022.08.25
[Log] Grafana 이전 하기  (0) 2021.01.28
[Log] Kubernetes에 ElasticSearch 올리기  (0) 2021.01.14
[Log] Logstash 메모리 누수?  (0) 2020.12.03
728x90
반응형

https://www.ciokorea.com/news/206529

 

도커 데스크톱, 대기업 사용자에게는 유료화된다

도커가 가격 정책을 변경했다. 대기업 고객용 무료 도커 데스크톱을 배포를 중단하고 회사의 무료 요금제를 개인 요금제로 대체한다.회사는 지난 8월 31일부터 도커 데스크톱 이용자를 대상으로

www.ciokorea.com

급작스럽게 Docker Desktop이 유료화된다는 기사를 보았다.

 

그래서 일단은 삭제하고 다른 방법으로 docker를 사용할 수 있는지를 찾아보았다.

 

개발 환경이 맥인 경우 여기에서 cli만 따로 설치는 가능하지만 docker 데몬은 불가하여 별도로 구축해야 한다.

 

별도 구축하는 것이 번거로워 podman이란 것을 사용해보기로 했다.

 

설치는 해당 홈페이지에 나온대로 따라하면 쉽게 설치 및 구동이 가능했다.

 

기존 docker의 경우 라이브러리 이름만 있으면 됐지만 podman의 경우 주소도 있어야 가져올 수 있었다.

podman pull docker.io/library/...

다른 부분이 더 있는지는 사용해보면서 알아봐야겠다.

반응형

+ Recent posts