쿠버네티스 Pod, 그 존재의 근본적인 이유: ‘팀’을 이루는 추상화의 비밀
·
k8s
쿠버네티스를 깊이 있게 학습하려면 Pod가 단순히 컨테이너의 껍데기가 아니라는 점을 이해해야 합니다. Pod는 쿠버네티스 생태계 전체의 안정성과 운영 효율성을 책임지는 가장 근본적인 추상화 단위입니다.이 글에서는 Pod가 필요한 근본적인 이유와 컨테이너 격리를 의도적으로 해제하는 기술적 원리를 탐구합니다.1. Pod는 왜 ‘최소 배포 단위’인가?컨테이너는 리눅스 기술을 기반으로 격리에 중점을 둔 단일 프로세스 실행 환경입니다. 하지만 실제 애플리케이션은 종종 여러 개의 프로세스나 보조 기능이 긴밀히 협력해야 합니다.Pod는 이러한 컨테이너들을 논리적으로 묶어 단일 애플리케이션 단위로 정의하며, 쿠버네티스가 다룰 수 있는 최소 단위의 표준 규격을 제공합니다.추상화의 힘: Pod 내부에 컨테이너가 1개든 5..
grep 'fail|error' 했는데 왜 검색이 안 될까? 파이프 기호의 비밀
·
리눅스
🔍 이 글을 읽어야 하는 분: sudo dmesg | grep 'fail|error'를 실행했는데 원하는 결과가 안 나오는 분, grep에서 OR 검색할 때 언제 역슬래시()를 붙여야 하는지 헷갈리는 분문제 상황: 왜 내 grep이 작동 안 할까?리눅스에서 시스템 로그를 확인하다가 다음과 같은 명령어를 실행했습니다:sudo dmesg | grep 'fail|error'하지만 예상과 달리 아무것도 출력되지 않거나 엉뚱한 결과만 나왔다면? 이 글이 정확히 여러분을 위한 글입니다.실제로 발생하는 문제# ❌ 이렇게 하면 안 됩니다sudo dmesg | grep 'fail|error'# 결과: 'fail|error' 문자열 그대로만 검색 (OR 연산 아님!)# ❌ 이것도 문제sudo dmesg | grep 'f..
start_date와 end_date가 같을 때, 왜 데이터가 비어 있을까?
·
라이브러리 & 프레임워크/FastAPI
프로젝트를 진행하면서 단일 날짜(start_date == end_date)로 시뮬레이션 데이터를 조회할 때, 해당 날짜의 레코드가 전혀 조회되지 않는 문제가 있었다. 처음엔 쿼리 조건이 단순해서 금방 해결될 줄 알았는데, 생각보다 꽤 깊은 이슈였다. --- 문제 상황start_date 와 end_date 를 동일하게 입력했을 때 하루 전체 레코드가 조회되지 않았다.query = query.where(Simulation.created_at >= start_date)query = query.where(Simulation.created_at 즉, created_at이 datetime 컬럼일 경우 00:00:00 시점에 정확히 일치하는 데이터만 포함되고,그 날짜의 나머지 레코드는 모두 누락되었다.원인 ..
FastAPI와 SQLAlchemy에서 이해하는 낙관적 락과 비관적 락
·
컴퓨터 과학/데이터베이스
웹 개발이나 API 설계에서 동시성 문제는 피할 수 없는 주제입니다. 특히 시뮬레이션 실행이나 계좌 잔액 수정처럼 동시에 여러 요청이 들어오는 상황에서는 데이터 정합성을 유지하는 것이 중요합니다. 이를 위해 흔히 사용하는 방법이 락(Lock) 전략입니다. 이번 글에서는 **낙관적 락(Optimistic Lock)**과 비관적 락(Pessimistic Lock), 그리고 분산 락(Redis 락) 개념을 정리합니다.1. 비관적 락(Pessimistic Lock)원리:데이터를 조회하거나 수정할 때 즉시 잠금다른 트랜잭션이 해당 데이터를 수정하지 못하도록 차단장점:동시성 충돌 방지데이터 정합성 강력 보장단점:락이 유지되는 동안 다른 트랜잭션은 대기 → 성능 저하데드락 가능DB 적용 예 (PostgreSQL + ..
map 함수를 사용 후 중괄호([])로 접근할 때
·
프로그래밍 언어/Python
map 을 사용해 여러 개의 값을 입력받아 바로 리스트에 저장하는 코드를 작성했다. 코드는 다음과 같았다. fish_price = map(int, input("가격: 2000 2500 3000").split()) 하지만 이것을 사용해서 fish_price의 원소에 [] 인덱스로 접근했을 때 fish_price = map(int, input("가격: 2000 2500 3000").split()) print(fish_price[1]) 위 코드를 실행하면 아래와 같은 에러가 발생한다. fish_price의 타입을 체크해보면 다음과 같다. fish_price의 타입은 바로 map 이다. map은 iterable을 반환합니다. 간단히 말하면 한 번에 하나씩 원소를 차례대로 내뱉은 존재이기 때문에 중괄호([])와 ..
얕은 복사와 깊은 복사
·
프로그래밍 언어/Python
얕은 복사와 깊은 복사는 프로그래밍에서 객체를 복사하는 두 가지 방법입니다. 얕은 복사(shallow copy) 얕은 복사란 원본 객체의 주소를 복사하여 새로운 객체를 생성하는 방식입니다. 원본 객체와 복사된 객체가 같은 메모리를 참조하므로 한쪽의 객체를 변경하면 다른 쪽의 객체도 함께 변경됩니다. old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 'a']] new_list = old_list.copy() new_list[2][2] = 9 print(f"{old_list=}, {new_list=}") print(f"{id(old_list)=}, {id(new_list)=}") print(f"{id(old_list[0])=}, {id(new_list[0])=}") old_list를 ..