지난 글에 이어서 일반 유저로 1024 미만의 포트(== privileged 포트)를 사용하는 것에 대해 정리해보려고 한다. 결과부터 얘기하면 커널 파라미터를 조정하는 방식으로 구성할 예정이다. 1. 기본 설정으로 일반 유저가 privileged 포트를 사용할 경우 먼저 nginx 컨테이너의 포트를 privileged 포트 중 하나에 바인딩하면 어떤 문제가 발생하는지 알아보자. 테스트 환경은 Ubuntu 22.04.4 LTS이다. 먼저 nginx 이미지를 받고 $ podman pull docker.io/ngin privileged 포트 중 하나인 443 포트에 컨테이너의 80번 포트를 바인딩하면 $ podman run --rm -d --name nginx -p 443:80 docker.io/library..
개인 서버라면 root 계정이나 sudo 커맨드를 고민 없이 사용하지만, 실무에서는 서버 관리자가 아니라면 그러기가 쉽지 않다. 그렇다고 매번 서버 관리자에게 작업을 요청할 수 없으니, 유저 권한으로 할 수 있는 것들은 최대한 해야하겠지…🙂↕️ 이번 포스팅에서는 유저 권한으로 서비스를 실행하는 방법과 계정 로그아웃 상황에서도 서비스를 유지하는 방법에 대해 정리해본다. 1. 테스트 스크립트 생성 유저 서비스로 등록할 테스트 스크립트(→ 1초 간격으로 현재 시간을 tmp 경로에 남김)는 다음과 같다. 해당 스크립트를 유저의 홈 경로(~/test.sh)에 저장하여 사용할 것이다. #!/bin/bash while true; do echo `date` >> /tmp/date.log sleep 1 done 스크립..
컨테이너 기반 서비스 운영 업무를 맡게 되면서 air gap 환경에 OCP와 OKD 설치를 진행하게 되었는데, 설치하는 과정 중에 yum repository를 구축하는 부분이 있어 연습 겸 포스팅을 해보려고 한다. 1. 테스트 개요 air gap 환경을 위해 다음와 같은 순서로 테스트 환경을 구축할 것이다. 테스트를 위해 aws를 사용했는데, aws를 사용하지 않을 경우 1, 3번은 다른 방식으로 구성해도 당연히 괜찮다. aws의 private subnet에 서버/클라이언트용 인스턴스 생성 NAT gateway를 통해 필요한 패키지를 yum repository가 될 인스턴스에 다운로드 NAT gateway를 제거하여 private subnet 내에 있는 인스턴스를 air gap 상태로 변경 이전 단계에서..
쿠버네티스 관련 공부를 하며 파드에 대한 기본 요소를 설명한 부분을 봤는데, 꽤나 흥미로운 주제라 이번 기회에 리눅스/컨테이너에 대해 공부하는 겸 리눅스 기능을 활용해 컨테이너를 만들어보려고 한다. 1. 개요 작업 순서 실습 환경 구축 root 디렉토리 변경 데이터 제공 및 컨테이너 데이터 영속화 프로세스 격리 네트워크 격리 리소스 제한 주사용 기능 chroot Change Root Directory 현재 실행 중인 프로세스와 차일드 프로세스 그룹에서 루트 디렉토리를 변경한다. 이렇게 수정된 환경에서 실행되는 프로그램은 지정된 디렉토리 트리 밖의 파일들에 일반적으로는 접근이 불가능한다. mount 파일 시스템을 지정된 위치(마운트 위치)에서 사용 가능하게 만든다. unshare 새로운 네임스페이스에서 프..
사내에서 어플리케이션 모니터링 관련하여 기존에 사용하던 상용 APM과 별개로, OpenTelemetry(OTel) 기반의 Observability 환경을 준비해보자라는 의견이 있어 개인 공부 겸 포스팅을 해보려고 한다. Baeldung 글을 참고하여, OTel과 Jaeger를 활용해 어플리케이션을 어떻게 분산 추적(distributed tracing)하는지 아주아주 간단한 예제로 살펴보자 😎 1. 기본 개념예제를 살펴보기 전에 주로 언급할 개념들에 대해 간단히 살펴보면 다음과 같다. → 각 잡고 보자면 개념만으로도 살펴봐야할 내용들이 많겠지만, 이번 포스팅의 목적은 어플리케이션을 OTel과 Jaeger로 살펴보기 위함이니 간략히 정리했다. OpenTelemetry(OTel)OTel은 API, SD..
지난 해를 돌이켜보며 회고를 해보자라는 계획은 예전부터 해왔지만, 조금 귀찮기도 했고 불편한 상황들은 외면하고 싶은 심정도 있어 각잡고 해본 적은 없었다. 그런데 요즘 가장 즐겨보는 유튜버의 영상을 보고 생각이 바뀌었다. 영상을 요약하자면 “중학교 때까지 성적이 좋지 않던 유도 선수 이원희가 성적을 높일 수 있었던 계기가 본인시합을 돌려보며 자신에 대해서 파악한 것”이라고 한다. 누군가는 회사에선 시키는 일만하고 돈만 벌면 된다고 하지만, 나는 회사에 있는 동안 즐거웠으면 좋겠고 그건 보통 맡은 일을 기술적으로 잘 해냈을 때 만족감이 높았다. 결국 내가 발전하고 행복하기 위해 번거롭더라도 2023년을 돌아보고, 2024년에는 뭘할지 정해보려고 한다. 회고와 목표 요약 2023년에는 2022년에 이어서 유..
최근에 클라이언트 요청이 처리되는 와중에 어플리케이션이 종료될 경우, 그 요청은 어떻게 되는지에 대한 문의가 와서 겸사겸사 graceful shutdown에 대해서 포스팅을 해보려고 한다. 0. graceful shutdown이란? 서론에서 graceful shutdown이라는 표현을 했는데, 이에 대해서 간략히 설명하자면 다음과 같다. graceful shutdown이란 질서정연한 방식으로 어플리케이션을 종료하는 절차를 뜻한다. 다시 말해 어플리케이션이 완전히 종료되기 전에 진행 중인 모든 작업을 완료하고, 리소스는 적절하게 해제하고, 데이터 무결성이 유지되도록 필요한 조치를 취하는 행위를 뜻한다. 즉, “클라이언트의 요청을 처리하는 와중에 어플리케이션을 종료시켰을 때 요청을 잘 처리하고 종료하는가?”..
최근에 사용자가 로그만 보고 어플리케이션이 언제 종료되었는지 알고 싶다는 요구사항이 있었다. 이처럼 어플리케이션이 시작할 때, 종료될 때, 실패했을 때 등과 같이 어떤 이벤트가 있을 때, 특정 작업을 수행하게 하는건 언제든지 필요할 수 있으므로, 이번 기회를 통해 종료 상황에 특정 작업을 수행하는 샘플 코드를 작성해보려고 한다. 1. 샘플 프로젝트 준비 어떤 이벤트가 발생했을 때 특정 작업을 수행하기 위해 ApplicationListener 인터페이스를 사용할 예정이고, 샘플 코드에서는 ShutdownEventListener가 구현체가 될 예정이다. 그리고 어플리케이션을 기동하고 바로 종료되지 않도록 spring-boot-starter-web을 의존성으로 추가했다. 아래에 링크로 달아둔 샘플 코드를 보면..
회사 동료 분이 스프링 테스트를 하며 오류가 난다고 도움을 요청하셨는데, 살펴보니 크게 두 가지 이슈가 있었고 주요 문제는 @SpringBootApplication 클래스를 포함하지 않는 프로젝트라 @SpringBootTest가 수행이 되지 상황이었다. 이와 관련해서 자료를 찾다보니 마음에 드는 답변은 스프링 테스트 전반에 걸친 내용을 작성한 글 중 일부로 있었고, 간단한 해결 방법들은 지금과 같은 상황에서 좋은 해결책은 아니었다. 그래서 샘플 코드와 함께 내 나름대로의 해결 방식을 정리를 해두려고 한다. 1. 프로젝트 준비 에러 재현을 위해 구성한 프로젝트는 다음과 같다. 특이 사항이라면, 어플리케이션을 기동하기 위한 엔트리 포인트가 없다는 것이고 다음으로 SampleService가 의존하고 있는 Sa..
쿠버네티스는 러닝커브가 가파르다고 느껴져 하나부터 열까지 알고 사용하기보다는 일단 실무에서 부딪혀보고 원리는 필요할 때 익히자라는 계획이었는데, 반복해서 접한 내용을 정리하는건 어느정도 쿠버네티스에 대한 찍먹해본 지금이 적기라고 생각해 조금씩 포스팅을 해보려고 한다. 아마 다뤄야 할 주제가 산더미겠지만, 그 중에서 먼저 서비스를 활용한 cluster 내부 파드 간 통신에 대해서 학습한 내용을 정리해보려고 한다 🔥 1. 서비스란? 내부 파드 간 통신의 원리를 알기 위해 먼저 서비스와 관련된 기본적인 정보에 대해서 먼저 가볍게 살펴보자. 처음에는 와닿지 않을 수 있지만, 몇번 접하다보면 어렵지 않게 이해할 수 있는 내용이다. 용도 파드 간 네트워크 연결 담당 필요한 이유 기존 가상 머신 환경처럼 파드 간 연..