728x90

Base 58

Jenkins 에서 갑자기 Job 생성이 안될 때

잘 사용하던 Jenkins 에서 위와 같은 메시지를 출력하며 신규 잡 생성이 안된다. 기존 잡 동작은 정상이다. Jenkins 관리 > System Log 로 이동해서 로그 화면을 열어 위에 명시된 Logging ID 로 조회해보니 아래와 같은 에러가 확인됐다. job 관련 디렉토리가 생성되었는데 이게 read-only 라는 거 같다. 응? 기존에는 잘 생성되었는데 왜 갑자기? 더 신기한 것은 젠킨스는 이외에도 많이 있고 모두 k8s 환경에 helm 으로 구축했다. 관련 yaml 파일을 확인해보니 딱히 다른 게 발견되지 않았다.. 그런데 실제 위 Jenkins 컨테이너에 접속해서 /var/jenkins_home/jobs 디렉토리에 mkdir 로 아무 디렉토리나 생성해보려고 했는데 진짜 아래와 같은 에러를..

Base/CI, CD 2022.01.10

URI, URL

일단 URI가 URL 보다 상위 개념이다. URI 는 특정 http 서버에서 원하는 자원을 얻거나 특정 처리를 위해 서버에 보내는 식별자이고 그 중 URL은 서버에 실제하는 자원의 위치를 정확하게 명시하는 방법이다. 이에 http://localhost:8080/index.html 처럼 특정 자원의 위치를 나타낸다면 URL 이고 http://localhost:8080/user/123 처럼 실제 있는 자원은 아닌데 사전에 협의된 식별자를 호출하는 것이므로 URI 이다. URI는 특정 자원을 직접 호출하는 것이 아니기 때문에 일반적으로 서버에서 요청을 받아서 별도의 추가작업을 수행한다. 간단하게 말해 URL 외에는 모두 URI라고 보면 된다. RestApi Endpoint 는 일반적으로 URI 라고 생각하면 ..

Base/개념정리 2021.12.16

Jenkins Maven 기반 빌드잡 만들기

Maven 이든 Gradle 이든 최근에 Wrapper 만 사용하다보니 별도 구축된 빌드툴을 활용한 젠킨스 잡 구성이 잘 기억나지 않아 작업내역을 기록해 놓는다. Wrapper 를 사용하는 것과 일부 겹치기도 한다. 여기에서는 Jenkins Pipeline 를 이용해서 잡을 만들 예정이며 Scripted Pipeline 를 사용할 예정이다. 그리고 젠킨스 내 잡에 스크립트를 포함하지 않고 각 프로젝트에 Jenkinsfile 이라는 파일에 포함하는 방식을 사용한다. 참고로 Pipeline 작성방법은 Scripted Pipeline, Declarative Pipeline 두가지가 존재하는데 Declarative Pipeline 이 더 나중에 도입되었고 Jenkins Community 에서도 지향하는 방식이라..

Base/CI, CD 2021.12.01

커맨드 패턴

커맨드는 "명령"이라는 뜻으로 커맨드 패턴은 명령을 클래스화 하는 것을 의미한다. 왜 이런게 필요한가? 결국 확장성을 고려한 것인데 예를들어 로그를 기록하는 기능을 구현한다고 가정하면 일반적으로 Log 클래스를 만들어서 그 안에 fileWrite, DbWrite, ConsoleWrite 메소드를 만들 것이다. 그런데 로그를 엘라스틱 서치에 적재하는 기능이 추가로 필요하게 되었다면 어떨까? Log 클래스에 esWrite 메소드를 만들어도 되지만 이렇게 되면 객체지향 설계원칙 중 개방 폐쇄 원칙 에 위배된다. 확장을 위해 Log 클래스를 변경해야 하기 때문이다. 기존 Log 클래스를 변경하지 않고 확장하려면 어떻게 해야 할까? 여기에서 필요한 것이 단일 책임 원칙 이다. 에초에 단일 책임만 가지도록 클래스를..

SpringBoot에 Sentry 적용 팁

Sentry 는 에러수집과 모니터링을 지원하는 툴이다. 온프레미스와 클라우드 버전이 존재하는데 사내 기 구축된 것을 사용했기 때문에 구축 부분은 생략하고 SpringBoot 연동하는 과정의 팁만 간단하게 정리해둔다. Gradle 기준 아래와 같은 의존성이 필요하다. 이렇게 되면 Exception 발생시 Sentry에 수집되어 확인할 수 있다. 물론 Exception 을 catch 로 잡았다면 당연히 수집되지 않는다. dependencies { compile 'io.sentry:sentry-spring-boot-starter:1.7.30' } 그리고 application.yml 파일에도 아래와 같은 구성이 필요하다. sentry: dsn: {client-key} # enable-tracing: false ..

Base/Monitering 2021.10.16

Kibana 사용법 간단 정리

조회는 Discover 메뉴에서 하면 된다. Discover 페이지는 아래와 같을텐데 기본적으로 아래영역에서 인덱스 패턴을 지정해서 조회를 수행한다. 조회할 필드 기본적으로 _source 인데 이는 ElasticSearch 에서 수집되는 모든 데이터를 기준으로 하기 때문에 우리가 우리가 원하는 필드를 지정해서 조회할 필요가 있다. 일반적으로 우리가 소스상에서 logger 로 출력하는 로그들은 log 필드로 조회하면 되고 그 외 k8s 환경이라면 kubernetes.pod_name 등을 추가로 지정하면 되겠다. 물론 kubernetes.pod_name 등의 필드는 아래에서 했던 것처럼 Fluent-bit 구축시 적절한 플러그인을 사용해야 한다. https://findmypiece.tistory.com/96..

Base/Logging 2021.08.25

Linux 시스템 데몬 사용 상태 확인

보통 회사에서는 인프라팀에서 주기적으로 서버 보안점검을 하는데 시스템 운영과 관련이 없는 서비스나 취약 서비스는 중지 하거나 제거하도록 권고한다. 이 경우 해당 서비스의 사용여부를 체크해서 필요없다면 데몬을 중지하거나 비활성화 해야 한다. 여기에서는 rpcbind 를 예로 들어 설명한다. rpcbind 는 일반적으로 nfs 를 설치하면 함께 설치되는 의존성 패키지이기 때문에 nfs가 사용중인지 확인한다. sudo systemctl status nfs 만약 nfs 가 구동중이 아니라면 결과가 아래와 같을 것이다. ● nfs.service Loaded: not-found (Reason: No such file or directory) Active: inactive (dead) 그런데 혹시 rpcbind 를 ..

Base/OS, Network 2021.08.12

Proxy Server

프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다. 프록시 서버는 일반적으로 보안이 중요한 망분리 환경이나 로드벨런싱이 필요한 분산처리 환경에서 필수로 사용되는데 들어오고 나가는 트래픽에 대해 프록시 서버에서 공통으로 관리할 수 있기 때문이다. Forward Proxy, Reverse Proxy 이처럼 중간에서 대리로 통신을 수행하는 것을 가리켜 '프록시' 라고 하는데 프록시는 네트워크의 출발지가 어디냐에 따라 포워드 프록시, 리버스 프록시로 구분된다. 별거 없다. 출발지가 내부망이라면 포워드 프록시 외부망이라면 리버스 프록시가 된다.

Base/OS, Network 2021.08.06

슬라이딩 윈도

슬라이딩 윈도(Sliding window)는 두 개의 네트워크 호스트간의 패킷의 흐름을 제어하기 위한 방법이다. TCP와 같이 데이터의 전달을 보증하는 프로토콜에서는 패킷 하나 하나가 정상적으로 전달되었음을 알리는 확인 신호(acknowledgement, 이하 ACK)를 받아야하며, 만약 패킷이 중도에 잘못되었거나 분실되어 확인받지 못하는 경우, 해당 패킷을 재전송해야하는 필요가 있다. 슬라이딩 윈도는 일단 '윈도(메모리 버퍼의 일정 영역)'에 포함되는 모든 패킷을 전송하고, 그 패킷들의 전달이 확인되는대로 이 윈도를 옆으로 옮김(slide)으로서 그 다음 패킷들을 전송하는 방식이다. 슬라이딩 윈도는 아직 확인을 받지 않고도 여러 패킷을 보내는 것을 가능케 하기 때문에, 매번 전송한 패킷에 대해 확인을 ..

Base/개념정리 2021.07.09
728x90