Kafka를 다뤄본 사람이라면 Apache Flink라는 이름을 한 번쯤 들어봤을 것이다. 다만 막상 "Flink가 무엇인가?"라고 물으면 제대로 답하는 사람이 별로 없다. 공식 docs는 영어로 깔끔하게 정리되어 있으나 입문자에게는 다소 불친절하다. 한국어 블로그 글들도 대부분 "스트리밍 프레임워크다"라는 한 줄로 끝내고 넘어간다. 각설하고 이 글에서는 Apache Flink가 실제로 무엇을 하는 도구인지, 왜 만들어졌는지, Spark와 어떻게 다른지, 언제 써야 하고 언제 쓰면 안 되는지 정리한다. 2~7년차 백엔드 개발자가 실시간 데이터 처리 요구사항을 받았을 때 "이것을 Flink로 가야 하는가"를 판단할 수 있는 수준까지 다룬다. 코드 예제도 있고 국내 기업 도입 사례도 함께 살펴본다. 출처:..
RabbitMQ vs Kafka를 검색하면 비슷한 글이 200개쯤 쏟아지지만, 다 읽어봐도 결국 "둘 다 메시징 시스템인데 다르다"는 한 줄로 귀결된다. 그러나 현업에서 두 시스템을 모두 운영해본 입장에서는 그렇게 단순히 정리될 사안이 아니다. 같은 카테고리의 도구가 아닌데도 자꾸 비교 대상이 되는 이유, 그리고 진정 언제 무엇을 사용해야 하는지를 본 글에서 정리한다. 2025년 기준 최신 정보를 모두 반영했고, 옛 글에서 자주 언급되는 잘못된 통설도 함께 짚는다. RabbitMQ vs Kafka, 두 시스템은 같은 카테고리의 도구가 아니다 출처: slideshare.net 먼저 못 박고 시작하자. RabbitMQ는 메시지 큐(Message Queue)이고, Kafka는 분산 로그(Distributed..
출처: thenewstack.io 요즘 개발자 면접에 가서 "도커(Docker)는 써본 적이 없다"고 답하면 분위기가 어색해진다. 백엔드, 데브옵스를 가리지 않고 도커는 거의 기본 소양으로 취급되는 시대다. 다들 docker run은 매일 치면서, 정작 도커 개발자가 누구인지 아는 사람은 드물다. 이 점이 다소 의아하다. 리누스 토르발즈의 이름은 누구나 알면서, 도커를 만든 사람의 이름은 잘 떠올리지 못한다. 도커는 등장 1년 만에 깃허브 스타 1만 개를 찍고 인프라 시장의 표준이 된 도구임에도 그렇다. 면접 준비를 하다가 문득 궁금해져서 찾아봤다. 솔로몬 하익스(Solomon Hykes)가 누구인지, dotCloud라는 PaaS 스타트업에서 도커가 어떻게 튀어나왔는지, 2013년 PyCon에서 5분짜리..
면접관이 "웹서버와 WAS의 차이가 무엇인가"라고 물었을 때 버벅거린 경험이 있는가? 나 또한 그랬다. 더 골치 아픈 점은 여기에 CGI, WSGI 같은 단어까지 섞여 들어오면 머리가 아예 멈춰버린다는 것이다. 이름은 모두 "서버 비슷한 무언가"라서 유사해 보이지만, 실제로는 각자 다른 계층에서 다른 일을 수행하는 존재들이다. 이 글에서는 CGI, WSGI, WAS의 차이를 시간축과 역할축 두 가지로 정리한다. 역사적으로 어떻게 등장했으며, 현재 실전 배포에서 어떻게 엮이는지까지 다루면 면접에서도 밀리지 않고 실무에서도 용어가 꼬이지 않는다. 파이썬 사용자는 WSGI를 왜 쓰는지 이해하게 되고, 자바 사용자는 톰캣이 왜 WAS로 불리는지 감을 잡게 된다. 출처: YouTube > I.T 웹서버부터 짚고..
트래픽이 터진 후에 준비하면 이미 늦다. 그러나 현실에서는 대부분 터지고 나서야 허둥지둥 트래픽 폭주 대응에 들어간다. 대용량 트래픽 처리는 장비 스펙을 올린다고 해결되지 않는다. 스타트업에서 일하다 보면 "일단 서버를 2배로 키워봐"라는 말을 가장 많이 듣게 되는데, 이는 대부분 돈만 태우고 근본 해결이 되지 않는다. 각설하고, 이 글은 DAU 1만짜리 서비스가 갑자기 1000만을 찍어도 죽지 않는 구조를 어떻게 미리 설계하느냐를 정리한 것이다. 측정·수평 확장·캐시 레이어·비동기 처리·비용, 이렇게 다섯 축으로 끊어서 보면 된다. 대기업 기술 블로그들이 자랑하는 성공담이 아니라, 중소·스타트업에서 실제로 쓸 수 있는 대용량 트래픽 처리 체크리스트 중심으로 간다. 스케일 이전에 측정부터 수행해야 하는 ..
출처: Business Insider 쿠버네티스를 사용하면서 이것을 도대체 누가 왜 만들었는지 생각해본 적 있는가? 그저 구글이 만들었다는 정도만 알고 넘어가는 경우가 대부분이다. 다만 쿠버네티스 개발자가 정확히 누구인지, 왜 하필 2014년에 등장했는지 알고 나면 k8s가 왜 이렇게 복잡하고 추상적인지 납득이 된다. 결론부터 말하면 쿠버네티스는 구글이 10년 넘게 내부에서 운영해온 Borg(보그)라는 시스템의 오픈소스 버전이다. Docker 열풍이 터진 직후 구글 엔지니어 3명 — Joe Beda, Brendan Burns, Craig McLuckie — 이 회사를 설득하여 2014년 6월에 공개한 것이다. 이 글에서는 이 3인방이 누구이며 어떤 배경에서 k8s가 세상에 나왔는지 살펴본다. Borg 계..
IT 회사에 입사하면 기본적으로 맥북을 주는 회사들이 많아졌다. 물론 안 주는 회사도 있겠지만 개인용으로도 맥북을 사용하는 것이 많이 일반화되었을만큼 개발자들에게는 필수품이 아닌 필수품이 되었다. 하지만 로컬에서 맥북 M1 (ARM 기반 CPU)에서 개발해서 정상동작을 하였으나 개발 (AMD 기반 CPU) 서버에 배포하면 기능이 정상적으로 동작을 하지 않거나 호환성 오류가 발생하는 경우를 경험해 보았을 것이다. 여러가지 호환성 오류가 많은데 그 중 일부분인 Docker 환경에서의 호환성 해결을 위한 Multi Architechture 빌드 전략에 대해서 소개해보고자 한다. 🚀 개요 로컬 (ARM 기반 CPU) 개발해서 배포는 Ubuntu (AMD 기반 CPU)에 Docker로 배포하는 빌드 전략에 대해 ..
Prometheus (프로메테우스란)? 지표들을 시계열 데이터로 수집하고 측정하는 오픈 소스 모니터링 툴킷을 말한다. 여기서 지표라는 것은 예를 들어 웹 서버같은 경우 "요청수", "지연시간" 등이 될 수 있겠고 데이터 베이스 서버같은 경우에는 "커넥션 수", "쿼리 수" 등을 말할 수 있다. 이런 지표들을 통하여 서비스 부하, 통계등을 측정하는데 유용할 수 있다. 특징 측정항목 이름과 키/값 쌍으로 식별되는 다차원 데이터 모델 유연한 쿼리 언어인 PromQL 지원 분산 서버에 의존하지 않고 단일 서버 노드에 자율적 시계열 수집은 HTTP를 통한 풀 모델을 통해 발생 푸쉬 시계열은 중간 게이트웨이를 지원 다양한 그래프 및 대시보드 지원 언제 적합하고 적합하지 않은가? 프로메테우스는 빠르게 수집하고 모니터..
스위칭 (Switching) host system 의 interface 확인 $ ip link 1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback ... 2: enp0s3: mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether ... ... interface 의 IP Address 확인 $ ip addr 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback ... inet 127.0.0.1/8 scope..
Persistent Volumes POD에서 Volume의 한계는 무엇인가? 대규모 환경에서는 많은 사용자가 많은 POD를 배포하므로 사용자는 각 포드에 대해 매번 스토리지를 구성해야 한다. 어떤 스토리지 솔루션을 사용하든 POD를 배포하는 사용자는 자신의 환경에 있는 모든 포드 정의 파일에서 이를 구성해야 한다. 변경할 때마다 사용자는 자신의 모든 POD에서 변경해야 한다. Persistent Volumes은 무엇인가? Persistent Volumes은 클러스터에 애플리케이션을 배포하는 사용자가 사용하도록 관리자가 구성한 클러스터 전체 스토리지 볼륨 Pool이다. 사용자는 Persistent Volumes Claim을 사용하여 이 Pool에서 스토리지를 선택할 수 있다. 시나리오 Persistent ..
Cluster 업그레이드 방법 1. controlplane drain 걸기 (master node) drain은 지정된 노드에 있는 포드들을 다른곳으로 이동시키는 명령어이다. $ kubectl drain controlplane --ignore-daemonsets2. 패키지 목록 업데이트 (master node) $ apt update3. kubeadm 1.25 인스톨 (master node) $ apt-get install kubeadm=1.25.0-00 4. kubeadm 1.25 적용 (master node) $ kubeadm upgrade apply v1.25.05. kubelet 1.25 인스톨 (master node) $ apt-get install kubelet=1.25.0-006. 데몬 리로..
어플리케이션 내 ConfigMap 설정 (Configure ConfigMaps in Applications) ConfigMap 생성 명령어로 key-value 값을 인자 값으로 주어 생성하는 방법이다. $ kubectl create configmap app-config --from-literal=APP_COLOR=blue --from-literal=APP_MOD=prod properties 파일을 사용하여 생성하는 방법이다. ※ 파일을 사용하여 생성하게 되면 key 값이 파일 이름으로 설정되게 되니 주의하기 바란다. $ cat > app_config.properties APP_COLOR=blue APP_MODE=prod $ kubectl create configmap app-config --from-fi..
Metric Server 설치방법 $ git clone https://github.com/kodekloudhub/kubernetes-metrics-server.git $ cd kubernetes-metrics-server/ $ kubectl create -f . 사용방법 node 보기 $ kubectl top nodes kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% master.example.com 417m 13% 3706Mi 27% node1.example.com 44m 2% 485Mi 12% node2.example.com 59m 2% 613Mi 16% POD 보기 $ kubectl top pods kubectl top pods NAME ..
정적 파드 (Static Pods) 정적 파드는 특정 노드의 kubelet 데몬에서 직접 관리한다. kubelet은 각 정적 파드를 감시하고 실패하면 다시 시작한다. 정적 포드는 항상 하나의 특정 노드에서 바인딩된다. 파드 이름에는 앞에 하이픈이 있는 노드 호스트 이름이 접미사로 붙는다. 정적 파드 (Static Pods) 생성 방법 정적인 파드를 생성할 node에 접속 $ ssh node01 nginx 정적인 파드 node01에 생성 $ cat > /etc/kubernetes/manifests/static-web.yaml apiVersion: v1 kind: Pod metadata: name: static-web labels: role: myrole spec: containers: - name: web..
데몬셋 (Daemon Sets) 개요 클러스터 전체 노드에 특정 파드를 실행할 때 사용하는 컨트롤러이다. 간략히 말해 각 노드에 항상 떠있는 데몬을 이야기한다. DaemonSet는 모든(또는 일부) 노드가 Pod의 복사본을 실행하도록 한다. 노드가 클러스터에 추가되면 Pod가 여기에 추가된다. 클러스터에서 노드가 제거되면 해당 포드는 가비지 수집된다. DaemonSet를 삭제하면 생성된 Pod가 자동적으로 삭제된다. 용도 다음과 같은 용도로 사용할 수 있다. 모든 노드에서 클러스터 저장소 데몬 실행 모든 노드에서 로그 수집 데몬 실행 모든 노드에서 노드 모니터링 데몬 실행 시나리오 Deamonset 생성 $ cat > daemonset.yaml apiVersion: apps/v1 kind: DaemonS..
Resource Limit 노드에서 사용할 수 있는 리소스가 충분하지 않은 경우 kubernetes는 pod 예약을 유지하고 Pending 상태가 된다. Describe로 조회를 해보면 어떤 리소스가 부족한지 이유를 알 수 있다. Resource Requirements 파드 내의 컨테이너에 0.5 CPU 및 256Mi 메모리가 필요하다고 가정하자. 이를 컨테이너에 대한 리소스 요청이라고 한다. 파드 내의 애플리케이션에 기본 리소스보다 더 많은 리소스가 필요한 경우 파드 정의 파일에서 설정해야 한다. apiVersion: v1 kind: Pod metadata: name: simple-webapp-color labels: name: simple-webapp-color spec: containers: - n..
Node Affinity Node Affinity란? 쿠버네티스 클러스터의 특정 노드에 노드 어피니티를 사용해 쿠버네티스 파드를 할당하는 방법을 말한다. 노드에 레이블 추가 클러스터의 노드를 레이블과 함께 나열하자. $ kubectl get nodes --show-labels NAME STATUS ROLES AGE VERSION LABELS master.example.com Ready control-plane,master 347d v1.22.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master.example.com,kubernetes.io/os=linux..
수동 스케쥴링 (Manual Scheduling) 클러스터에 스케줄러가 없을 때 수동으로 처리하는 방법이다. POD에는 기본적으로 설정되지 않은 NodeName이라는 필드가 있는데 이 필드를 설정하여 수동으로 스케쥴링 하는 방법이다. apiVersion: v1 kind: Pod metadata: name: nginx labels: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 8080 nodeName: node02 또 다른 방법 apiVersion: v1 kind: Binding metadata: name: nginx target: apiVersion: v1 kind: Node name: node02 api..
핵심 개념 (Core Concepts) Kubernetes Architecture (쿠버네티스 아키텍처) Master Node 구성 설명 API Server ㆍ쿠버네티스 클러스터의 모든 작업을 제어하는 REST API Controller ㆍ클러스터를 설계한 상태로 유지 (파드 개수 유지) ㆍ백그라운드에서 클러스터 컨트롤러를 관리 ㆍAPI 서버를 이용하여 클러스터 상태를 모니터링 Scheduler ㆍ노드가 배정되지 않은 새로 생성된 Pod를 감지하고 그것을 어느 Node에서 실행될지를 선택 ㆍPod를 어떻게 Node에 배치할지를 예약 ETCD ㆍ클러스터의 모든 정보를 저장하는 데이터 저장소 ㆍ고가용성을 가진 Key-Value 저장소 구조 Worker Node 구성 설명 kubelet ㆍ노드에서 실행되는 에..
GitLib 업데이트 GitLab 업데이트시 다른 패키지들처럼 14.xxx → 16.xxx 이런식으로 2단계를 건너 띄우고 업데이트를 하지못하고 순차적으로 진행해야한다. GitLib 업데이트 예시 여기 공식 사이트 CHANGELOG.md를 보고 최초, 최종 버전을 검색할 수 있다. https://gitlab.com/gitlab-org/gitlab/blob/master/CHANGELOG.md CHANGELOG.md · master · GitLab.org / GitLab · GitLab GitLab is an open source end-to-end software development platform with built-in version control, issue tracking, code review,..
Certbot란?Certbot은 수동으로 관리되는 웹사이트에서 Let's Encrypt 인증서를 자동으로 사용하여 HTTPS를 활성화하는 무료 오픈 소스 소프트웨어 도구이다. Certbot은 전자 프론티어 재단(Electronic Frontier Foundation, EFF) 에 의해 만들어졌다. 간단히 말해서 HTTPS 인증서를 커멘드 명령어만으로 Nginx등에 설정할 수 있는 도구라고 보면된다. Let's Encrypt 인증서는 신뢰할 수 있는 인증기관인가?Let's Encrypt는 무료로 SSL/TLS 인증서를 발급하는 오픈 소스 인증 기관 중 하나로 신뢰할 수 있는 인증기관이다. 설치방법Ubuntu 22.04 공식문서를 참조하면 좋을 것이다. 설치방법은 Snap 패키지 관리자를 통한 설치를 권장하..
개요 Container는 Host의 리소스 사용 제한을 받지 않는다. 그러므로 사용 제한이 없으면 호스트 리소스를 마음대로 갖다 쓸 수 있다는 이야기이다. 제한 방법 RAM 옵션 설명 --memory, -m 컨테이너 사용할 최대 메모리 양을 지정한다. 512m 이런식으로 할당이 가능하다. --memory-swap 컨테이너가 swap할 사용 메모리 영역에 대한 설정이다. memory + swap으로 반드시 메모리가 포함된 값으로 설정해야한다. (예) memory가 200m, swap이 100m이라면 300m으로 설정해야한다.) 생략시는 memory의 2배로 설정된다. --memory-reservation --memory 작은 값으로 구성해야되며 이 값까지는 soft 제한을 하겠다는 뜻 --oom-kill-..
Elasticsearch 공식 문서를 참조하였습니다. 설정 방법 1. repository-s3 플러그인 설치 설치 완료 후 클러스터 재기동 필요합니다. $ bin/elasticsearch-plugin install repository-s3 2. aws 키 설정 testuser 라는 AWS S3 client name 으로 설정해보자. $ bin/elasticsearch-keystore add s3.client.testuser.access_key Enter value for s3.client.testuser.access_key: $ bin/elasticsearch-keystore add s3.client.testuser.secret_key Enter value for s3.client.testuser.sec..
포트 포워딩 (Port Forwarding) WSL2에서 포트를 오픈해도 Windows 호스트 또는 외부에서 접근이 불가하여 Port를 포워딩해주어야 한다. 1. PS1 스크립트 작성 forwarding.ps1 적당한 이름으로 스크립트를 작성한다. 오픈할 포트를 $ports에 넣어주면 된다. 예) $ports=@(8000, 8888); If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { $arguments = "& '" + $myinvocation.mycomm..
SSH 설정 및 접속 1. 호스트 키 설정 ssh-keygen -A 명령으로 호스트 키가 /etc/ssh 경로에 생성되도록 한다. admin@LAPTOP-O7OIHPIJ:~$ sudo /etc/init.d/ssh stop * Stopping OpenBSD Secure Shell server sshd [ OK ] admin@LAPTOP-O7OIHPIJ:~$ sudo ssh-keygen -A 2. ssh-config 설정 admin@LAPTOP-O7OIHPIJ:~$ sudo vi /etc/ssh/sshd_config … # To disable tunneled clear text passwords, change to no here! PasswordAuthentication yes … admin@LAPTOP-O..
설치 환경ubuntu 20.04.1 설치 방법1. 리포지토리 등록amd64, arm, arm64 아키텍처가 있는 amd64로 한다.root@master:~# curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb" % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 414M 100 414M 0 0 1909k 0 0:03:42 0:03:42 --:--:-- 1029k2. 패키지 설치root@master:~# dpkg -i gitlab-runner_amd64.de..
Credential 정보 저장 credential 정보를 저장하여 반영구적으로 인증 절차가 생략된다. git config credential.helper store --global 옵션을 설정하여 모든 프로젝트에 적용할 수 있다. git config --global credential.helper store Cache 저장 임시로 저장할때 사용한다. 기본적으로 15분 동안 인증 절차를 요구하지 않는다. git config credential.helper cache timeout 옵션으로 지정이 가능하다. (초 단위) git config credential.helper 'cache --timeout=3600' 참고 https://git-scm.com/docs/git-credential-cache
구성 환경 CentOS 7 (Minimal Version) Image VirtualBox 구성 방법 1. 이미지 다운로드 http://isoredirect.centos.org/centos/7/isos/x86_64/ 첫번째 링크를 클릭한다. CentOS-7-x86_64-Minimal-2009.iso를 선택한다. 2. 가상 머신 만들기 새로 만들기를 클릭한다. 하기와 같이 머신 폴더 및 Linux 종류를 설정한다. 여유롭게 공간을 사용하기 위하여 50GB를 지정하였다. 3. 가상 머신 환경 구성 부팅 순서에서 불필요한 플로피 제거한다. 4. CentOS 설치 4. 포트 포워딩 [root@localhost ~]# yum install -y net-tools ... [root@localhost ~]# ifcon..
Window 10 Home Hyper-V Windows 10 Pro, Enterprise 및 Education 64비트 버전에서만 사용할 수 있고 Home 버전에서는 사용할 수 없다. Docker Desktop for Windows 설치를 위해서는 반드시 Hyper-V를 지원하는 OS가 필요하지만 Home 버전에서는 Hyper-V 기능을 사용할 수 없는 탓에 Docker Toolbox(Virtual Box)를 이용한 가상화를 통해서만 Docker를 설치할 수 있다. 무작정 블로그나 여러 사이트를 가서 Window 10 Home에 Hyper-V 설치를 하려고 하면 아래와 같은 문구가 표시되는 것을 볼 수 있을 것이다. microsoft-hyper-v은 는 알 수 없는 기능 이름입니다. Hyper-V 설치 ..
