Kubelet, Kube-proxy, Pod
·
K8s
KubeletKubelet은 클러스터의 각 워커 노드에서 실행되는 에이전트로, 해당 노드의 모든 작업을 총괄하는 '현장 감독관' 또는 '선장' 과 같은 역할을 한다.주요 역할노드 등록: apiserver와 통신하여 자신(노드)을 클러스터에 등록한다.파드 실행 지시: apiserver로부터 특정 파드를 실행하라는 명령을 받으면, 노드의 컨테이너 런타임(예: Docker)에게 해당 이미지를 가져와 컨테이너를 실행하도록 지시한다.상태 모니터링 및 보고: 노드 위에서 실행되는 파드와 컨테이너들의 상태를 지속적으로 감시하고, 그 결과를 주기적으로 apiserver에 보고한다.설치 및 확인Kubelet은 다른 컨트롤 플레인 컴포넌트와 달리, kubeadm으로도 자동 설치되지 않는다. 모든 워커 노드에 반드시 수동으..
Kube-scheduler
·
K8s
Kube-scheduler란?kube-scheduler는 쿠버네티스 컨트롤 플레인에서 새로 생성된 파드(Pod)를 어떤 노드(Node)에서 실행할지 결정하는 핵심 컴포넌트다.중요한 점은, 스케줄러는 결정만 할 뿐, 실제로 노드에 파드를 띄우지는 않는다. 파드를 최종적으로 실행하는 것은 해당 노드에 있는 Kubelet의 역할이다. 스케줄러는 마치 물류센터의 배차 전문가처럼, 어떤 화물(파드)을 어떤 트럭(노드)에 실어야 가장 효율적일지 분석하고 할당하는 역할만 수행한다.스케줄러의 작동 방식: 2단계 프로세스스케줄러는 최적의 노드를 찾기 위해 모든 노드를 대상으로 다음과 같은 2단계 과정을 거친다.1단계: 필터링 (Filtering)가장 먼저, 파드를 실행할 수 없는 노드를 모두 걸러내는 과정이다. 마치 조..
시그널
·
CS:APP
시그널(Signal)이란?시그널(Signal)은 프로세스에게 특정 사건이 시스템 내에서 발생했음을 알리는 작은 메시지. 시그널은 운영체제(OS)가 프로세스의 흐름을 예외적으로 중단하고, 특정 처리를 수행하도록 요청하는 방식입니다.시그널의 필요성외부에서 프로세스 강제 종료 요청프로세스 간 통신 및 동기화비정상적 사건 알림 (메모리 접근 위반 등)시그널의 종류 및 대표적 예시리눅스는 약 30여가지의 시그널을 지원, 대표적인 예시:시그널기본 동작설명SIGINT (2)종료키보드 인터럽트 (Ctrl+C)SIGKILL (9)종료강제 종료 (무조건 종료)SIGSEGV (11)종료 및 코어덤프잘못된 메모리 접근SIGALRM (14)종료타이머 알람SIGTERM (15)종료소프트웨어 종료 요청SIGCHLD (17)무시자식..
예외상황
·
CS:APP
예외(Exception)란?예외는 프로그램이 정상적으로 진행되던 도중, 특정 상황이 발생했을 때 운영체제(OS)가 프로그램 흐름을 강제로 바꾸는 사건. 이를 예외적 제어 흐름(Exceptional Control Flow)필요성:외부 장치 입력 (키보드 입력, 마우스 클릭, 네트워크 데이터 수신 등)프로그램의 예기치 않은 오류 (0으로 나누기, 메모리 접근 오류 등)OS의 서비스 요청(시스템 콜)정상적 함수 호출(call) 방식으로 대응 불가능하기 때문에 운영체제의 특수한 처리(예외 처리, Exception Handling)가 필요예외 처리 구조 (Exception Handling)예외 처리는 다음과 같은 방식으로 진행예외 발생 시 CPU가 이를 감지하고 `예외 번호를 찾음` (그림 1)CPU가 미리 설정..
실행 가능 목적파일의 로딩
·
CS:APP
1. 실행 파일 로딩이란?정의: 디스크에 저장된 실행 파일을 메모리에 복사하고, 그 프로그램의 첫 명령어로 점프(jump)하여 실행하는 과정.시작 방식: 리눅스 쉘에서 ./prog처럼 실행하면 loader가 호출되어 시작됨.2. 누가 실행하는가?loader (로더): 운영체제 안에 항상 상주하는 커널 코드.프로그램을 실행할 때 execve() 시스템 호출을 통해 로더가 프로그램을 메모리에 올림.3. 로더의 역할ELF 실행 파일을 열고, 내부의 program header table을 분석..text, .data, .rodata, .bss 등 각 섹션을 지정된 런타임 주소에 복사..bss는 0으로 초기화.entry point(첫 명령어 위치)로 점프하여 실행 시작.런타임 메모리 구조 (Figure 7.15 ..
Kube Controller Manager
·
K8s
쿠버네티스의 자동화된 운영팀, Kube-controller-managerkube-controller-manager는 쿠버네티스 컨트롤 플레인에서 다양한 컨트롤러들을 실행하고 관리하는 핵심 컴포넌트다. apiserver가 클러스터의 모든 요청을 받는 관문이라면, controller-manager는 클러스터의 상태가 항상 올바르게 유지되도록 끊임없이 감시하고 조치하는 자동화된 두뇌 역할을 한다.컨트롤러(Controller)란 무엇인가?컨트롤러를 이해하기 위해 회사의 여러 부서를 상상해 보자. 인사팀은 항상 직원 수를 모니터링하다가 퇴사자가 생기면 새로운 직원을 채용한다. 시설팀은 회사 건물의 온도를 감시하다가 너무 더워지면 에어컨을 켠다.쿠버네티스의 컨트롤러도 이와 같다. 각 컨트롤러는 특정 분야를 책임지는..
그리디(Greedy) 알고리즘
·
Algorithm
그리디(Greedy) 알고리즘매 순간 가장 좋아보이는 선택을 하는 알고리즘.구성 방식Optimal Substructure (최적 부분 구조) 확인전체 문제의 최적해가 부분 문제의 최적해로부터 만들어질 수 있어야 함.예: 활동 선택 문제에서 S_ij 같은 식으로 서브문제 설정.Recursive 구조 파악문제를 재귀적으로 쪼갤 수 있어야 함.예: OPT(i, j) = max(OPT(i, k) + OPT(k, j)) 같은 형식.Greedy Choice 후, 하나의 하위 문제만 남음중요한 포인트. 동적 계획법은 보통 하위 문제가 여러 개지만,그리디는 하나만 남기게 설계되어야 효율적임.Greedy Choice의 안전성 증명“언제나 지금 고르는 게 전체적으로도 최선”이라는 걸 보여야 함.귀류법으로 자주 증명함 (예..
Kube-apiserver
·
K8s
Kube-apiserver란?마스터 노드의 컨트롤 플레인에 위치하여, 쿠버네티스 클러스터의 유일한 관문(Gateway) 역할을 하는 핵심 컴포넌트이다. etcd가 클러스터의 상태를 저장하는 두뇌라면, apiserver는 그 두뇌와 소통하기 위한 입과 귀 역할을 한다.기존 시스템과의 차이전통적인 시스템에서는 각 관리 도구나 사용자가 시스템의 여러 구성 요소에 직접 접근하는 경우가 많았다. 만약 회사의 여러 부서(스케줄러, 컨트롤러, 노드)가 있다고 가정해 보자.외부 방문객(kubectl 사용자)이나 내부 직원(클러스터 컴포넌트)이 각 부서의 책임자에게 직접 찾아가 업무를 요청하고, 파일 보관실(etcd)의 문서를 마음대로 수정한다면 어떻게 될까?요청자대상 부서작업 내용결과사용자 A파일 보관실(etcd)파드..
AVL Tree
·
자료 구조
1. 정의AVL Tree는 모든 노드에 대해 왼쪽과 오른쪽 서브트리의 높이 차이(균형 인수, BF)가 1 이하가 되도록 유지하는 이진 탐색 트리(Binary Search Tree, BST)이다.1962년, Adelson-Velsky와 Landis가 고안하였다.2. 기본 속성(1) BST 규칙모든 노드는 왼쪽 자식 (2) 높이 균형 조건모든 노드에 대해 |높이(왼쪽) - 높이(오른쪽)| ≤ 1이 조건을 유지하면 트리의 높이 = O(log n) 으로 유지되어, 검색·삽입·삭제가 효율적3. 균형 인수 (Balance Factor)정의각 노드에 대해 균형 인수 BF는 다음과 같이 계산된다:BF = height(left subtree) - height(right subtree)BF의 값이 –1, 0, +1이면 균..
ETCD
·
K8s
ETCD란?마스터노드의 control plane에 위치해있는 key-value쌍의 저장소이다.기존 DB와의 차이전통적인 DB는 테이블형식이다. 이러한 DB는 행과 열로 데이터를 저장하고,만약 아래와 같은 직원 테이블이 있다고 보자이름나이장소홍길동45서울김철수33서울김영희21인천각 행은 한 사람을 나타내고, 각 열은 저장되는 정보의 유형을 나타낸다.만일 연봉, 사원평가에 따른 등급와 같은 정보를 추가하고 싶을 때, 테이블과 그 안에 있는 모든 정보에 아래와 같이 영향을 미치게 된다.이름나이장소연봉등급홍길동45서울5000 김철수33서울4000 김영희21인천 A새로운 정보를 추가 할 때 마다 표 전체가 영향을 받아 빈 셀이 많아진다.ETCD와 같은 key-value 쌍 저장소는 아래와 같이 정보를 문서 또는 ..
B-Tree
·
자료 구조
B-Tree (균형 트리)핵심 요약정의: B-Tree는 다진(m-way) 균형 탐색 트리이다.균형 유지: 모든 리프 노드가 같은 깊이에 위치하도록 강제하여 검색 성능의 일관성을 보장한다. 키가 노드 용량을 초과하면 분할(Split)하고, 최소치보다 부족해지면 병합(Merge) 또는 재분배(Borrow)한다.I/O 효율화: 하나의 노드에 여러 개의 키를 저장하여 디스크 접근 횟수를 최소화한다. 이는 트리의 전체 높이를 낮추는 효과로 이어진다.설계: 노드의 크기를 디스크 블록(페이지) 크기에 맞추는 것이 일반적이다. 이 특징 때문에 데이터베이스나 파일 시스템과 같이 디스크 기반의 대용량 데이터를 다루는 시스템에 매우 적합하다.B-Tree의 구조노드 구성내부 노드 (Internal Node): 여러 개의 정렬..
RB Tree
·
자료 구조
RB 트리란?기본적인 '이진 탐색 트리(BST)'는 평균적으로 O(log n)의 빠른 탐색, 삽입, 삭제 성능을 보여준다. 하지만 이는 트리가 균형 잡혀 있을 때의 이야기다. 만약 데이터가 정렬된 순서(예: 1, 2, 3, 4, 5)로 들어오면 트리는 다음과 같이 한쪽으로 치우친, '편향 트리(skewed tree)'가 된다.1 \ 2 \ 3 \ 4 \ 5이런 최악의 경우, 트리의 높이가 데이터의 수(n)와 같아져 탐색 성능이 'O(n)'으로 저하된다. 이는 연결 리스트(linked list)와 다를 바 없는 비효율적인 구조다.이 문제를 해결하기 위해 등장한 것이 '자가 균형 이진 탐색 트리(Self-Balancing BST)'다. 데이터의 삽입, 삭제가..
ELF, Executable and Linkable Format (재배치 가능 목적파일)
·
CS:APP
ELF란?ELF (Executable and Linkable Format)리눅스에서 사용되는 실행 파일, 목적 파일 (.o), 공유 라이브러리 (.so)의 표준 포맷목적: 프로그램을 효율적으로 연결(link), 실행(load) 하도록 정보 구조화사용처: 링커(ld), 로더(execve), 디버거(gdb)구체적 설명오브젝트 파일은 “반쪽짜리 실행파일”주소가 확정되지 않았기 때문에 재배치가 가능하고, 링크 과정을 통해 최종 주소가 정해짐.구조ELF HeaderELF 파일임을 알리는 시작 지점파일 전체의 구조를 정의어떤 CPU용인지, 32비트/64비트인지, 실행파일인지 목적파일인지 등을 기록| **섹션** | **설명** || --- | --- || .text | **기계어 코드**가 들어가는 곳 (함수 본체..
가상화
·
운영체제
1. 가상화(Virtualization)란?정의: 물리적인 하드웨어 리소스(CPU, 메모리, 스토리지 등)를 소프트웨어적으로 추상화하여, 하나의 물리적 시스템에서 여러 개의 논리적 자원(가상 머신, VM)이 동시에 실행될 수 있도록 분리하는 기술이다.요약: 물리적 컴퓨터 한 대를 여러 개의 가상 컴퓨터처럼 나눠서 사용하는 방법이다.2. 가상화의 목적목적설명자원 효율성 증대단일 물리 서버에서 활용되지 않는 유휴 자원을 여러 가상 머신에 할당하여 전체 사용률을 극대화함.비용 절감필요한 물리 장비의 수가 줄어들어 초기 도입 비용, 상면 비용, 전력 및 유지보수 비용을 절감할 수 있음.격리 및 보안 강화각 가상 머신은 논리적으로 완전히 격리되어, 하나의 VM에서 발생한 오류나 보안 문제가 다른 VM에 영향을 주..
컨테이너 런타임 인터페이스 (CRI)
·
K8s
CRI란?CRI(Container Runtime Interface)란, Kubelet이 코드를 변경하거나 재컴파일할 필요 없이, CRI 표준을 따르는 containerd, CRI-O 같은 다양한 컨테이너 런타임을 플러그인처럼 교체할 수 있도록 만든 gRPC 기반의 표준 통신 규약(API)다.배경: Docker의 시대와 CRI의 등장초기 컨테이너 시대에는 rkt와 같은 다른 기술도 있었지만, Docker가 사용자 친화적인 경험을 제공하며 컨테이너 작업을 매우 간편하게 만들어 시장을 지배했다.이러한 이유로, 초기 쿠버네티스는 Docker에 직접적으로 의존하여 개발되었다. 이는 Kubelet 코드가 Docker의 API를 직접 호출하는 긴밀한 결합 구조를 의미했다. 하지만 이 구조는 다음과 같은 문제점을 낳았..