반응형

전체 글 111

[k8s] Kubernetes Canary 사용시 주의사항

이번에 Kubernetes Canary 배포를 하면서 제일 크게 배운 내용 중 하나가 바로 이거였다."카나리 파드만 있고, 스테이블 파드가 하나도 없으면 왜 API 호출이 안되는가?"처음에 진짜 의문이었다. 헤더에 X-Canary: true 붙이면 Canary Ingress로 가니까 Stable 파드 없어도 되는거 아닌가? 이렇게 생각했는데... 현실은 전혀 아니었다.결론부터 말하면NGINX Ingress 구조 상 Canary Ingress는 "보조"일 뿐이고 "메인"은 항상 Stable Ingress다.Stable Ingress → 기본 처리 대상Canary Ingress → 조건 맞을 때 일부 트래픽만 처리 (override)Stable Ingress가 없는 상태에서는 Canary Ingress만 있..

[k8s] Kubernetes Canary 배포 삽질기

최근에 Kubernetes에서 새로운 버전을 배포하면서 canary 트래픽 테스트를 해봤다.기존 파드를 유지한 채로, 새로운 버전의 파드를 하나만 띄우고 인그레스에서 일부 트래픽만 넘기는 구조를 목표로 했는데, 생각보다 시행착오가 많았다. 아래는 그 과정에서 겪었던 실수들과 해결했던 방법들을 정리한 내용이다.1. Deployment의 selector와 labels가 안 맞을 때처음엔 아래와 같이 새로운 Deployment를 구성했다.spec: selector: matchLabels: app: example-app-v2 version: canary template: metadata: labels: app: example-app version..

[k8s] Kubernetes canary 사용기

이번에 Kubernetes에서 Canary 배포를 적용하면서 여러 가지 개념과 동작 원리에 대해 스스로 정리할 수 있는 기회가 있었다. 처음엔 단순히 Ingress에 canary-weight만 붙이면 되는 줄 알았는데, 막상 해보니까 생각보다 훨씬 깊은 구조와 동작 흐름이 숨어 있었다.1. Ingress는 어떻게 트래픽을 나누는가?처음엔 궁금했다. Ingress 리소스에 연결된 Service는 하나인데, 어떻게 요청이 Canary와 Stable로 나뉘지? 알고 보니 Ingress 리소스는 여러 개를 만들 수 있고, 동일한 host와 path를 가진 Ingress가 두 개 있을 때, 그중 하나에 nginx.ingress.kubernetes.io/canary: "true"와 같은 annotation을 붙이면..

[k8s] 쿠버네티스 환경에서 k6로 부하 테스트 해보기 + 리소스 사용량 확인까지

회사에서 서비스를 쿠버네티스에 띄워두고 있다 보니, 간단한 부하 테스트를 해보고 싶었다. 마침 팀원한테 이런 조언을 들었다.“E2E 테스트의 request body 참고해서 부하 테스트 해보시면 좋을 것 같아요. 매트릭스 APM 연동도 하시고, 기존 운세DA랑 같은 리소스를 할당한 파드에서 시스템 리소스 사용률도 같이 확인해보시면 좋을 것 같습니다.”처음 들으면 뭔가 말이 어려운데, 하나씩 정리해보면 생각보다 단순하다.💡 요약E2E 테스트에서 쓰는 request body를 부하 테스트에도 활용하자.APM 연동해서 시스템 내부에서 뭐가 느려지는지도 같이 보자.실제 서비스랑 동일한 리소스가 설정된 파드에서 테스트를 돌려서, CPU나 메모리 사용량 변화를 보자.k6로 부하 테스트 하기부하 테스트 도구는 여러..

[Gradle] Gradle 라이브러리 참조 문제 정리

Gradle에서 자주 발생하는 라이브러리 참조 문제를 정리합니다.라이브러리 프로젝트(예: A)에서 다른 라이브러리(B, C 등)를 의존성으로 추가하고 이를 Maven에 배포했을 때,해당 라이브러리를 참조하는 외부 프로젝트(예: X)에서 의존성이 전파되지 않아 클래스가 보이지 않는 문제가 생길 수 있습니다.이러한 문제를 직면하고, 해결한 내용을 정리하였습니다.api vs implementation 차이점Gradle의 dependencies 블록에서 자주 사용하는 두 선언 방식의 차이:선언 방식 외부 프로젝트에서 접근 가능 여부 전이성apiO (전파됨)전이됨implementationX (내부에서만 사용 가능)전이되지 않음implementation: 현재 모듈 내부에서만 사용하는 라이브러리. 다른 프로젝트에서..

ETC 2025.03.28

[Gradle] Gradle 캐시와 사용자 홈(GRADLE_USER_HOME)

Gradle을 사용하다 보면, 거의 모든 복잡한 지시서 다국적인 사용성을 위해 캐시 구조를 재정리합니다.하지만 또한 유연하게 발생할 수 있는 문제가, “같은 버전의 라이브러리를 다시 배포했을 때 변경사항이 반영되지 않는다”는 것입니다.Gradle 캐시를 지워야 하는 이유라이브러리를 같은 버전으로 다시 배포하거나 수정했을 경우, Gradle은 기존에 남아있는 캐시를 계속 사용Maven 저장소에서 삭제한 라이브러리를 IntelliJ 또는 Gradle에서 계속 찾을 수 있음잘못된 라이브러리 .jar 파일 때문에 예기치 못한 오류 발생Gradle 캐시가 저장되는 위치~/.gradle/caches/modules-2/files-2.1/구조 설명:~/.gradle/ └ caches/ └ modules-2/..

ETC 2025.03.27

[IDE] intellij 외부 라이브러리 검색

기본적으로 외부 라이브러리의 경우 class 명을 검색하는 것이 아니면, 내부 텍스트로는 검색이 불가능함da common 라이브러리를 사용중인데, 정작 DA에서는 전체 검색으로는 commons 텍스트를 검색할 수 없다 1.1.  외부 라이브러리 다운로드 받기외부 라이브러리 class 파일을 확인하면, 이미지와 같이 다운로드 버튼이 노출된다.검색하고자 하는 라이브러리를 다운로드단, 본인이 직접 .jar파일로 import한 라이브러리는 다운로드가 불가능하다.따라서 텍스트 검색 또한 불가능 1.2. 전체 검색 범위 설정전체 검색 범위를 프로젝트 & 라이브러리로 설정한다 1.3.  완료해당 설정을 완료하면, 외부 라이브러리 또한 Java파일로 인식하여 텍스트 검색이 가능하다...!되게 쉽지만,,, 방법찾기까지 ..

ETC 2025.03.26

[GIT] remote: Invalid username or password. Authentication failed for "GIT URL"

에러 발생회사에서 사용하는 모든 계정은 비밀번호를 자주 바꿔줘야 합니다깃 계정도 그중 하나이고, 깃의 경우 비밀번호를 바꾸면.... local에서 push, pull 할 때 오류가 발생합니다.remote: Invalid username or password.Authentication failed for "GIT URL"그럴 때마다 새롭게 깃 인증을 해야하는데... 여러가지 방법이 있어서 정리해보았습니다0. 기존 깃 정보 삭제git credential reject https://github.kakaocorp.com- 다시 git push를 시도하면 새 비밀번호를 입력하라는 메시지가 나타납니다.1. Personal Access Token (PAT) 사용- GitHub (사내 깃허브) 웹사이트에서 Settin..

개발 Error 2025.03.20

[spring webFlux] reactor.netty.http.client.PrematureCloseException: Connection prematurely closed BEFORE response

프로젝트 구조Java 21gradleSpring boot 3.XSpring Webfluxkotlin에러발생java, spring boot, gradle 등 프로젝트 주요 라이브러리의 버전업 후, 프로젝트 boot시에 에러가 발생하는 것을 발견reactor.netty.http.client.PrematureCloseException: Connection prematurely closed BEFORE responsejava.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonTypeInfo$Value ...ETC```e2e 테스트를 통해서 request를 보냈을 떄,,, controller로 인입되지 않는 것을 확인오류를 구글링 해봤을 때, M1 ..

개발 Error 2025.03.20

[SLF4J] LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation() 에러 해결

프로젝트 구조Java 21gradleSpring boot 3.XSpring Webfluxkotlin에러 발생- java, spring boot, gradle 등 프로젝트 주요 라이브러리의 버전업 후, 프로젝트 boot시에 에러가 발생하는 것을 발견Exception in thread "main" java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.helpers.NOPLoggerFactory loaded from file:/Users..

개발 Error 2025.03.20

[SLF4J] Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier. 에러 해결

프로젝트 구조Java 21gradleSpring boot 3.XSpring Webfluxkotlin에러 발생java, spring boot, gradle 등 프로젝트 주요 라이브러리의 버전업 후, 프로젝트 boot시에 에러가 발생하는 것을 발견SLF4J(W): No SLF4J providers were found.SLF4J(W): Defaulting to no-operation (NOP) logger implementationSLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details.SLF4J(W): Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x..

개발 Error 2025.03.20

[Spring Webflux] Unable to load io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS. 에러 처리

프로젝트 구조Java 21gradleSpring boot 3.XSpring Webfluxkotlin에러 발생java, spring boot, gradle 등 프로젝트 주요 라이브러리의 버전업 후, 프로젝트 boot시에 에러가 발생하는 것을 발견2025-03-20 08:53:13.537 ERROR [ main] i.n.resolver.dns.DnsServerAddressStreamProviders io.netty.resolver.dns.DnsServerAddressStreamProviders.(DnsServerAddressStreamProviders.java:79) : Unable to load io.netty.resolver.dns.macos.MacOSDnsServerAddressS..

개발 Error 2025.03.20

리액티브 프로그래밍 > RxJava와 Spring WebFlux 비교

리액티브 프로그래밍은 비동기 데이터 스트림과 이벤트 흐름을 처리하는 새로운 패러다임입니다.Java 환경에서 사용되는 RxJava와, Spring 생태계에서 제공하는 Spring WebFlux의 리액티브 기능에 대해 알아보고,각 기술의 예제 코드를 통해 설명해보겠습니다.1. 리액티브 프로그래밍 개념리액티브 프로그래밍은 다음과 같은 특징을 가지고 있습니다.비동기 처리: 데이터가 도착하는 대로 즉시 처리할 수 있음논블로킹 I/O: 요청이 끝날 때까지 기다리지 않고 다른 작업을 수행 가능데이터 스트림: 연속적으로 발생하는 데이터를 스트림으로 다룸백프레셔(Backpressure): 소비자가 데이터를 처리하지 못할 경우, 생산자가 데이터를 조절하는 메커니즘 제공이러한 개념은 고성능 서버, 실시간 애플리케이션, 그리..

Spring 2025.02.06

날씨 알림 서비스 프로젝트 소개 2탄 - docker-compose , ansible 활용 서버 배포

Docker와 Ansible을 활용한 날씨 알림 서비스 실행과 배포Python으로 개발한 날씨 알림 서비스를 실행하고 배포하는 과정에서 Docker와 Ansible을 활용하여 효율성을 극대화했습니다. 이 글에서는 프로젝트 실행을 위한 Docker 환경 구성과 Ansible을 통한 서버 배포 과정, 그리고 실제 테스트 결과에 대해 정리하겠습니다.Docker를 활용한 서비스 실행프로젝트 구조를 보면 Dockerfile, docker-compose.yml 파일이 포함되어 있어 Docker를 사용한 흔적을 확인할 수 있습니다. 프로젝트의 실행과 관리를 쉽게 하기 위해 Docker를 선택했습니다. 특히 Synology NAS를 사용 중인데, 해당 NAS에서도 Docker를 지원하기 때문에 내 프로젝트와의 호환성이..

Vault? Google Vault와의 차이점

"Vault"라는 이름은 다양한 서비스에서 사용되며, 각각 다른 목적과 기능을 제공합니다. 이번 글에서는 암호 저장소로서의 Vault와 Google Vault를 비교하여 어떤 차이가 있는지 정리해보겠습니다.Vault란 무엇인가?Vault는 개인이나 조직의 비밀번호와 중요한 정보를 안전하게 보관하는 무료 저장소 도구입니다. 이를 통해 데이터를 암호화하고 접근 권한을 세밀하게 제어할 수 있어 보안이 중요한 환경에서 활용됩니다.주요 특징데이터 보안: 비밀번호, API 키, 인증서 등의 민감한 정보를 암호화하여 안전하게 보호합니다.접근 제어: 사용자 인증 및 권한 부여를 통해 특정 사용자나 애플리케이션만 데이터에 접근할 수 있습니다.동적 비밀 생성: 특정 상황에 맞는 동적 비밀 생성 기능을 제공합니다.자동화 및..

ETC 2025.01.17

Gradle과 Maven Publish 플러그인

소프트웨어 개발에서 프로젝트 관리와 배포는 중요한 과정입니다.특히, 대규모 프로젝트에서는 빌드와 배포를 자동화하는 도구가 필수적입니다.여기에서는 Gradle의 기본 개념과 함께 Maven Publish 플러그인을 활용한 배포 과정을 살펴보겠습니다.Gradle이란?Gradle은 빌드 자동화 도구로, 소스 코드 컴파일, 테스트 실행, 배포 등의 작업을 효율적으로 관리합니다.작업을 유향 비순환 그래프(DAG)로 모델링하여 작업 간 의존성을 효율적으로 관리하며, 다양한 유형의 소프트웨어 프로젝트를 지원하는 유연성을 제공합니다.Ant와 Maven의 장점을 결합하여 탄생한 도구로, 다양한 언어와 플랫폼에서 사용할 수 있습니다.주요 역할프로젝트 관리:의존성(dependencies) 추가 및 관리.멀티 프로젝트 구성 ..

ETC 2025.01.17

파이썬 스케쥴링: 외부 도구 크론탭 vs. 파이썬 내부 스케줄링

특정 작업을 주기적으로 실행해야 할 때, 파이썬에서는 내부 스케줄링 라이브러리(schedule, APScheduler)를 사용할 수 있고, 외부 도구(예: 크론탭)를 활용할 수도 있습니다.이 글에서는 두 방식의 장단점과 적합한 사용 사례를 비교하고, CPU 및 메모리 사용량 테스트 방법까지 정리하였습니다.1. 방법 소개1.1 크론탭 (Cron)크론탭은 리눅스/유닉스 기반 시스템에서 작업을 주기적으로 실행하기 위한 스케줄링 도구입니다.설정 방법터미널에서 크론탭 편집:crontab -e실행 주기를 설정:0 22 * * * python3 /path/to/weather_bot.py위 예시는 매일 저녁 10시에 weather_bot.py를 실행.1.2 파이썬 내부 스케줄링파이썬에서는 schedule이나 APSch..

2024년 회고: 성장의 발판을 마련한 한 해

2024년은 감사한 마음으로 새로운 여정을 시작한 해였습니다. 운 좋게 더 좋은 회사로 이직하게 되었고, 새로운 환경에서 새로운 팀원들과 함께 일하기 시작했습니다. 하지만 상반기는 결코 쉽지 않았습니다. 업무의 규모는 이전보다 훨씬 커졌고, 일하는 방식 역시 많이 달라져 적응이 필요했죠.성장의 기회로 다가온 실수상반기 중 기억에 남는 일이 하나 있었습니다. 한 번은 지시받은 업무를 진행하던 중 업무의 규모를 잘못 이해한 적이 있었습니다. 제가 이해한 내용을 바탕으로 상급자에게 피드백을 드렸고, 별다른 추가 언급이 없어서 그대로 진행했죠. 하지만 이후 업무의 범위가 훨씬 크다는 사실을 알게 되었고, 그때는 상급자에게 아쉬운 마음을 가지기도 했습니다.그런데 알고 보니, 이 업무는 우리 팀으로 이관된 지 얼마..

ETC 2025.01.02

날씨 알림 서비스 프로젝트 소개 1탄 - python3 , openai ai 활용기

날씨 알림 서비스는 python3을 활용하여 기상 데이터를 수집하고, openai ai 통해 날씨 정보를 간단히 요약하여 사용자에게 전달하는 자동화 시스템입니다.이 서비스는 특히 카카오톡 메시지 전송을 통해 사용자에게 매일 간편하게 날씨 정보를 제공하는 것을 목표로 하고 있습니다. openai ai와 python3를 사용해보고는 싶은데... 어떻게 써봐야할까 고민을 많이 하였고, 가장 내가 필요하다고 생각했던 서비스에서 가장먼저 적용해보자! 라는 생각이 들어 시작된 서비스개발입니다.Git 주소 : https://github.com/curiousKidd/sendWeather주요 기능날씨 데이터 수집기상청의 단기예보 API를 사용하여 한국의 상세하고 신뢰할 수 있는 날씨 데이터를 가져옵니다.사용자는 지역, ..

IntelliJ IDEA 플러그인 개발을 위한 핵심 용어와 개념 정리

IntelliJ IDEA는 플러그인 개발을 위한 강력한 SDK를 제공합니다.플러그인을 개발하려면 IntelliJ 플랫폼에서 사용하는 주요 클래스와 인터페이스, 그리고 그 사용 방법을 이해해야 합니다.이 글에서는 IntelliJ 플러그인 개발에서 사용되는 주요 용어와 개념을 정리하고, 예제 코드와 함께 설명하겠습니다.1. DataKeyDataKey는 IntelliJ 플랫폼에서 데이터 전달에 사용되는 키입니다. 플러그인이나 액션(Action)에서는 이 키를 사용해 컨텍스트에서 특정 데이터를 가져오거나 설정합니다.예제 코드public static final DataKey PSI_ELEMENT = DataKey.create("psi.Element");public void actionPerformed(@NotNu..

ETC 2024.12.28
반응형