k8s 153

[작업 기록] 서비스 이전 (Docker -> EKS)

배경현재 운영 중인 서비스에는 Kafka 브로커의 메시지를 처리하는 ETL Handler(Consumer)가 존재한다. 초기에는 트래픽이 많지 않아 단일 EC2 인스턴스 위에 Docker 컨테이너를 띄워 운영하는 것만으로 충분했다.하지만 서비스 규모가 커지며 문제가 발생했다. 패키지 저장소와 취약점 DB가 확대되면서 핸들러 수가 증가했고, 결국 단일 호스트의 물리적 리소스 한계에 부딪혔다. 빈번한 CPU 사용량 과다로 인스턴스가 죽는 현상이 잦아졌고, 이는 곧 단일 장애점(SPOF)이 되어 서비스 전체의 안정성을 위협했다.간단한 해결 방법은 인스턴스 타입 변경이지만, 이는 근본적인 해결책이 되지 못했다. 때문에 보다 안정적인 운영 환경인 EKS로의 이전을 꾀하게 되었다. 목표업무를 진행하기 전에 목표..

기타 2026.01.28

[Airflow] git-sync - fatal: Unable to create '/git/.git/worktrees//index.lock': File exists.

개요출근하고 운영 중인 Airflow을 점검했더니 스케쥴러가 동작하지 않고 있었다. 이 Airflow는 AWS EKS 내에서 동작하고 있는데, 확인해 보니 스케쥴러 포드가 Init:CrashLoopBackOff 상태를 지속하고 있었다.원인을 확인하고 문제를 해결한 방법을 적어둔다. 원인 파악- Pods Event 확인먼저 포드의 이벤트를 확인하고자 describe를 했다.kubectl describe pods airflow-schedulergit-sync-init가 재시작한다는 정보를 얻을 수 있었다. git-sync-init 컨테이너가 원인일 가능성이 높아졌다. - 컨테이너 로그 확인git-sync-init의 동작 현황을 보고자 로그를 확인한다.kubectl logs airflow-scheduler..

Apache Airflow 2026.01.22

[Airflow] k8s Git-Sync란

개요여러 EC2 인스턴스에 걸쳐서 동작하던 Airflow 환경에서는 Dag 폴더를 EFS에 두는 방법으로 서버 간 Dag 정의 파일을 동기화했다. 그리고 최근 마주한 쿠버네티스 환경에서 동작하는 Airflow 환경에선 git-sync라는 프로세스로 포드 간 Dag 정의 파일을 동기화하고 있었는데, 관련해서 정리해보려고 한다. Git-Sync일반적으로 Airflow on Kubernetes에서 DAG 파일을 어떻게 배포하느냐는 사실상 아래 선택지 중 하나를 택하게 된다. 이미지에 DAG 포함 (immutable image)공유 스토리지 (NFS, PVC, S3/GCS + sync)Git 기반 pull 모델 (git-sync)CI/CD에서 kubectl apply로 ConfigMap 생성여기서 git-sy..

Apache Airflow 2025.12.24

[Karpenter] 스케쥴링과 노드 종료

개요2025.12.17-[Karpenter] 필요 구성 요소에서 Karpenter에서 관리할 노드와 관련된 구성 요소를 살펴보았다. 그리고 Karpenter는 구성 설정한 노드를 생성하고 삭제하며 포드를 배치하는 등의 작업을 통해 노드 관리 작업을 수행한다. 이번 글에서는 Kapenter가 노드와 포드를 스케쥴링하는 방식과 정리하는 방식에 대해서 간단히 정리해두려고 한다. 스케쥴링Karpenter는 어떤 노드에 어떤 포드를 배치할지 결정하는 쿠버네티스 스케쥴링을 확장해 필요한 노드를 자동으로 생성한다. 기존 노드에 스케쥴링을 수행하는 쿠버네티스와 달리 Karpenter는 필요하면 새 노드를 생성하여 배치한다.핵심포드 Status PendingKarpenter가 Pod 요구사항 분석NodePool 정책..

AWS 2025.12.23

[Karpenter] 필요 구성 요소

개요2025.12.12-[AWS/k8s] Karpenter란 에서 Karpenter의 역할과 동작 원리 등을 살펴봤다. 직접 해보지는 못 했지만…… 설치 방법까지 나름 정리를 했으니 이번에는 구성이 필요한 요소, 개념에 대해서 적어두려고 한다. NodeClassesAWS 전용 설정(이미지, IAM Role, 보안 그룹, 서브넷 등)을 구성할 수 있게 한다.Karpenter는 필요한 노드를 정의하는 Provisioner와 필요한 노드를 만드는 방식을 정의한 NodeClass를 사용해 노드를 생성한다.Provisioner : CPU 4개, 메모리 16GB짜리 노드 필요NodeClass : AWS에서 t3.large 타입으로, 이 서브넷에, 이 IAM Role을 사용한다. NodePoolsProvision..

AWS 2025.12.22

[AWS/k8s] Karpenter란

개요언젠가 운영하던 Airflow을 EKS 환경으로 이전하는 것을 검토한 적이 있었다. 당시 CeleryExecutor를 사용해 worker의 ec2 인스턴스 타입을 다양하게 사용하고 있어 요구 사항에 맞는 솔루션을 찾다가 Karpenter의 존재에 대해 알게되었다.다만, 실제로 도입하지는 않아 따로 공부한 적은 없었는데 새로 운영하게된 Airflow에서 사용하고 있어 공부해두려고 한다. Karpenter란?AWS로 구축된 유연한 오픈 소스 고성능 Kubernetes 클러스터 오토스케일러.Apache License 2.0 라이선스인 오픈 소스 프로젝트다.애플리케이션 로드 변화에 대응해 적절한 크기의 컴퓨팅 리소스를 신속하게 실행함으로써 애플리케이션의 가용성과 클러스터 효율성을 개선한다. 애플리케이션 요..

AWS 2025.12.17

[k8s] ingress-nginx canary 배포 설정

개요현재 EKS에서 서비스를 운영하고 있는데, 서비스에 변경이 필요할 때마다 서비스 중단이 발생하는 상태이다. 이를 조금 완화하고자 카나리(canary) 배포를 구성해보려고 한다. 카나리 배포는 2022.01.15-Canary Updates에서 살펴보았던 것처럼 k8s의 service와 deployment로도 구성할 수 있지만, 이번 글에선 ingress로 구성하는 방법을 적어두려고 한다. 카나리 배포Canary Deployment란 소프트웨어 업데이트를 점진적으로 적용하여 전체 시스템에 미치는 영향을 최소화하고 새 버전의 안정성을 확인하는 배포 전략이다. 대규모 애플리케이션이나 서비스에서 새로운 기능이나 변경 사항이 문제를 일으키는 경우 빠르게 대응할 수 있도록 한다.기존 글에서 작성했던 카나리 ..

Kubernetes 2025.12.16

[k8s] MetalLB - 베어 메탈 쿠버네티스 로드 밸런서

개요예전에 kubeadm으로 구성되어 있던 쿠버네티스 클러스터에는 MetalLB라는 서비스로 로드 밸런서 유형의 서비스를 사용하고 있었다. 최근 로컬 컴퓨터에서 테스트용 쿠버네티스 클러스터를 구축하면서 ingress를 어떻게 처리할지에 대한 고민을 가지고 있었는데, 마침 해당 서버스가 생각났다. 늦게나마 이번 기회에 해당 서비스가 어떤 역할을 담당하는지 살펴보려고 한다. MetalLBMetalLB는 표준 라우팅 프로토콜을 사용하는 베어 메탈 쿠버네티스 클러스터 용 로드밸런서 구현체이다.🤔 베어 메탈(Bare Metal)가상화나 클라우드 계층 없이 물리적인 서버에서 직접 운영하는 환경을 의미한다.베어 메탈 쿠버네티스 클러스터란 온프레미스 환경에서 운영하는 쿠버네티스 클러스터라고 이해하면 될 것 같다.쿠..

Kubernetes 2025.12.12

[k8s] kind 설치 및 사용법

kindkind는 Kubernetes in Docker의 줄임말로, 컨테이너 ‘노드’를 사용하는 로컬 쿠버네티스 클러스터를 실행하기 위한 도구이다. 다시 말하면 컨테이너 기반의 쿠버네티스 클러스터이다.다중 노드 클러스터, Linux, macOS, Windows를 지원하며 CNCF 인증을 준수하는 k8s 설치 프로그램이다. 쿠버네티스 자체를 테스트하기 위해 설계되었으나, 로컬 개발이나 CI에도 사용할 수 있다. 평소 쿠버네티스 관련 테스트를 수행하면 Killercoda를 사용했는데, Killercoda의 경우에는 무료 사용자는 세션이 1시간까지만 유지된다는 번거로움이 있다. 반면 kind는 사용자가 직접 구성하는 클러스터이기 때문에 장시간 테스트를 수행하는 경우에는 보다 적절할 수 있을 것 같다. 설치..

Kubernetes 2025.12.11

[k8s] ConfigMap - pod에서 파일처럼 취급하기

개요쿠버네티스를 한참 배울 시점 ConfigMap은 주로 환경 변수 등으로 여러 Pod에서 공유하며 사용하기 위한 리소스라고 이해했었다. 하지만 최근 ConfigMap으로 볼륨을 만들어 Pod에 마운트하는 방식을 보게 되어 기록한다. ConfigMapConfigMap은 키-값 쌍으로 기밀이 아닌 데이터를 저장하는 데 사용하는 리소스다. ConfigMap은 크게 아래와 같은 용도로 활용된다.- 컨테이너 명령어의 인수- 컨테이너 환경 변수- 애플리케이션에서 읽기 전용 볼륨으로 추가- 쿠버네티스 API를 사용하여 ConfigMap을 읽는 Pod 내 실행 코드 작성이번 글애서 확인할 부분은 바로 애플리케이션에서 읽기 전용 볼륨으로 추가하는 방법이다. 방법구성 방법을 적어둔다. 1. ConfigMap 생성c..

Kubernetes 2025.11.28