Unisquads
로그인
홈
이용약관·개인정보처리방침·콘텐츠정책·© 2026 Unisquads
이용약관·개인정보처리방침·콘텐츠정책
© 2026 Unisquads. All rights reserved.

Kubernetes 컨테이너 오케스트레이션 기초 (r1)

이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.13 22:20

Kubernetes 컨테이너 오케스트레이션 기초

이름

Kubernetes

개발자

구글

최초 릴리즈

2014년 6월 7일

최신 안정판

1.30 (2024년 10월)

프로그래밍 언어

Go

라이선스

Apache License 2.0

공식 웹사이트

https://kubernetes.io

주요 용도

컨테이너 오케스트레이션

상세 정보

원저작자

구글

저장소

github.com/kubernetes/kubernetes

운영 체제

리눅스, 윈도우

대체 가능 소프트웨어

도커 스웜, 아파치 메소스

주요 구성 요소

kube-apiserver, etcd, kube-scheduler, kube-controller-manager, kubelet, kube-proxy

핵심 개념

Pod, Service, Deployment, ConfigMap, Secret, Namespace

관리 도구

kubectl, kubeadm, minikube

클라우드 서비스

GKE, EKS, AKS

주요 특징

자동화된 배포, 스케일링, 로드 밸런싱, 롤링 업데이트, 셀프 힐링

컨테이너 런타임

containerd, CRI-O, 도커 엔진

1. 개요

Kubernetes는 컨테이너화된 애플리케이션의 배포, 스케일링, 관리를 자동화하기 위한 오픈 소스 컨테이너 오케스트레이션 플랫폼이다. 구글 내부 시스템인 Borg에서 파생된 기술을 기반으로 개발되었으며, 현재는 클라우드 네이티브 컴퓨팅 재단(CNCF)이 관리하는 가장 대표적인 프로젝트 중 하나이다. 컨테이너 기술의 보편화와 함께 복잡한 분산 시스템을 효율적으로 운영하기 위한 사실상의 표준(de facto standard)으로 자리 잡았다.

Kubernetes는 애플리케이션을 구성하는 다수의 컨테이너를 논리적인 단위로 묶어 관리한다. 이를 통해 개발자는 인프라의 세부 사항보다 애플리케이션 자체에 집중할 수 있으며, 운영자는 선언적인 방식으로 원하는 시스템 상태를 정의하고 Kubernetes가 그 상태를 유지하도록 할 수 있다. 주요 기능으로는 서비스 디스커버리, 로드 밸런싱, 자동 롤아웃 및 롤백, 자동화된 빈 패킹(bin packing), 자가 치유(self-healing), 시크릿 및 구성 관리 등이 포함된다.

Kubernetes는 클라우드 환경에 구애받지 않는 이식성을 핵심 가치로 삼는다. 퍼블릭 클라우드, 프라이빗 클라우드, 하이브리드 클라우드, 또는 온프레미스 데이터센터 등 다양한 인프라 위에서 동일한 방식으로 애플리케이션을 실행하고 관리할 수 있다. 이는 애플리케이션의 이식성과 벤더 종속성을 줄이는 데 기여한다.

2. Kubernetes 핵심 개념

Kubernetes는 컨테이너화된 애플리케이션을 배포, 확장 및 관리하기 위한 오픈소스 오케스트레이션 플랫폼이다. 복잡한 분산 시스템을 구성하는 여러 컨테이너들을 하나의 클러스터로 묶어 선언적인 방식으로 관리한다. 사용자는 애플리케이션이 어떤 상태여야 하는지만 정의하면, Kubernetes가 해당 상태를 유지하도록 자동으로 작업을 수행한다. 이는 수동으로 컨테이너를 관리하는 번거로움을 줄이고, 고가용성과 확장성을 제공한다.

가장 기본적인 배포 단위는 Pod이다. Pod는 하나 이상의 컨테이너 그룹으로, 동일한 호스트에서 공유된 스토리지와 네트워크 네임스페이스를 갖는다. 일반적으로 하나의 Pod는 하나의 애플리케이션 인스턴스를 실행한다. Pod는 직접 생성하기보다는 Deployment나 ReplicaSet 같은 상위 추상화 객체를 통해 관리된다. ReplicaSet은 지정된 수의 동일한 Pod 복제본(레플리카)이 항상 실행되도록 보장한다. Deployment는 ReplicaSet과 Pod에 대한 선언적 업데이트를 제공하여, 애플리케이션의 롤링 업데이트나 롤백 같은 배포 전략을 쉽게 구현할 수 있게 한다.

Pod는 일시적이며 생성되고 제거될 수 있다. 따라서 안정적인 네트워크 엔드포인트가 필요하다. Service는 논리적인 Pod 집합과 그 집합에 접근하기 위한 정책을 정의하는 추상화 계층이다. Service는 고정된 IP 주소와 DNS 이름을 제공하여, 뒷단의 Pod가 교체되더라도 클러스터 내부 또는 외부 클라이언트가 애플리케이션에 지속적으로 접근할 수 있게 한다. Ingress는 클러스터 내부의 Service들에 대한 외부 HTTP/HTTPS 접근을 관리하는 API 객체로, 호스트 기반 또는 경로 기반의 라우팅, SSL/TLS 종료 등을 제공한다.

애플리케이션 설정과 민감한 정보는 ConfigMap과 Secret 객체로 분리하여 관리한다. ConfigMap은 키-값 쌍 형태의 설정 데이터를 저장하는 데 사용된다. Secret은 비밀번호, OAuth 토큰, SSH 키 같은 민감한 정보를 저장하며, 기본적으로 Base64 인코딩 형태로 보관된다. 이 두 객체는 Pod에 환경 변수나 구성 파일 형태로 주입되어, 컨테이너 이미지와 설정을 분리함으로써 애플리케이션의 이식성을 높인다.

2.1. Pod와 컨테이너

Pod는 Kubernetes에서 배포하고 관리할 수 있는 가장 작은 배포 단위이다. 하나 이상의 컨테이너 그룹으로 구성되며, 이 컨테이너들은 스토리지와 네트워크를 공유하고 같은 생명 주기를 갖는다. Pod는 단일 호스트(노드)에 배치되며, Pod 내의 컨테이너들은 항상 함께 스케줄링, 실행, 중지된다.

Pod의 주요 목적은 긴밀하게 결합된 애플리케이션 컨테이너들을 하나의 단위로 지원하는 것이다. 예를 들어, 주 애플리케이션 컨테이너와 로그 수집기, 또는 데이터 싱크를 위한 사이드카 컨테이너를 함께 묶어 배포할 수 있다. Pod 내 컨테이너들은 localhost를 통해 서로 통신할 수 있으며, 볼륨이라는 공유 스토리지도 사용할 수 있다.

Pod는 기본적으로 일시적이고 교체 가능한 엔티티로 설계되었다. Pod는 직접 생성되기보다는 Deployment나 StatefulSet과 같은 상위 수준의 컨트롤러를 통해 관리되는 경우가 일반적이다. 이러한 컨트롤러는 지정된 수의 Pod 복제본을 유지하며, Pod가 실패하면 자동으로 새로운 Pod를 생성한다.

Pod의 상태와 사양은 다음과 같은 주요 필드로 정의된다.

필드

설명

metadata

Pod의 이름, 네임스페이스, 라벨 등의 정보를 포함한다.

spec

Pod의 원하는 상태를 정의한다. 여기에는 컨테이너 목록, 볼륨, 재시작 정책 등이 포함된다.

status

Pod의 실제 상태 정보(IP 주소, 컨테이너 상태, 조건 등)를 나타낸다. 이 필드는 시스템에 의해 채워진다.

Pod 내 각 컨테이너는 도커 또는 containerd와 같은 컨테이너 런타임에 의해 실행된다. 컨테이너는 애플리케이션 프로세스 자체를 캡슐화하며, Pod는 이 컨테이너들을 실행하기 위한 공유 환경(네트워크 네임스페이스, IPC 네임스페이스 등)을 제공한다.

2.2. Deployment와 ReplicaSet

Deployment는 쿠버네티스에서 스테이트리스 애플리케이션을 배포하고 관리하기 위한 핵심 객체이다. 주된 목적은 애플리케이션의 원하는 상태를 선언하고, 해당 상태를 유지하도록 Pod 집합의 라이프사이클을 관리하는 것이다. 사용자는 YAML 매니페스트 파일에 원하는 Pod 템플릿, 복제본 수, 업데이트 정책 등을 정의한다. Deployment는 이 선언된 명세를 바탕으로 실제 상태를 조정하며, 롤링 업데이트나 롤백과 같은 무중단 배포 전략을 쉽게 구현할 수 있게 해준다.

Deployment는 내부적으로 ReplicaSet을 생성하고 관리함으로써 이러한 기능을 수행한다. ReplicaSet의 핵심 목표는 지정된 수의 동일한 Pod 복제본이 항상 실행되도록 보장하는 것이다. Pod 템플릿과 원하는 복제본 수를 정의하면, ReplicaSet은 해당 Pod를 생성하고 모니터링한다. 만약 Pod가 실패하거나 삭제되면, ReplicaSet은 새로운 Pod를 자동으로 생성하여 원하는 복제본 수를 유지한다.

Deployment와 ReplicaSet의 관계는 다음과 같이 요약할 수 있다.

객체

주요 책임

관리 대상

Deployment

애플리케이션 배포, 업데이트 전략, 롤백 관리

ReplicaSet

ReplicaSet

지정된 수의 동일한 Pod 복제본 유지

Pod

예를 들어, 사용자가 nginx 이미지를 사용하는 Deployment를 생성하고 복제본을 3개로 지정하면, 쿠버네티스는 먼저 해당 명세를 가진 ReplicaSet을 생성한다. 그 후 ReplicaSet이 3개의 nginx Pod를 실행한다. 사용자가 컨테이너 이미지를 업데이트하는 새로운 Deployment 명세를 적용하면, Deployment는 새로운 Pod 템플릿을 가진 새로운 ReplicaSet을 생성하고, 이전 ReplicaSet의 Pod를 점진적으로 줄이면서 새로운 ReplicaSet의 Pod를 점진적으로 증가시킨다[1]. 이로써 서비스 중단 없이 배포가 이루어진다.

2.3. Service와 Ingress

서비스는 파드 집합에 대한 안정적인 네트워크 엔드포인트를 제공하는 추상화 계층이다. 파드는 일시적이며 IP 주소가 변경될 수 있기 때문에, 클라이언트 애플리케이션이 특정 파드의 IP에 직접 의존하는 것은 신뢰할 수 없다. 서비스는 고정된 IP 주소와 DNS 이름을 부여하여, 해당 서비스를 구성하는 파드들에 대한 로드 밸런싱된 트래픽을 전달한다. 서비스의 주요 유형으로는 클러스터 내부에서만 접근 가능한 ClusterIP, 단일 노드의 포트를 노출하는 NodePort, 그리고 클라우드 공급자의 로드 밸런서를 생성하는 LoadBalancer가 있다.

인그레스는 클러스터 외부의 HTTP/HTTPS 트래픽을 내부 서비스로 라우팅하는 API 오브젝트이다. 서비스의 LoadBalancer 타입은 각 서비스마다 외부 로드 밸런서를 필요로 하는 반면, 인그레스는 하나의 진입점을 통해 여러 서비스에 대한 라우팅 규칙을 중앙에서 관리할 수 있다. 인그레스는 호스트 이름, URL 경로 등을 기반으로 트래픽을 적절한 백엔드 서비스로 전달한다. 인그레스 자체는 트래픽을 처리하지 않으며, 규칙을 구현하는 인그레스 컨트롤러가 필요하다. 대표적인 인그레스 컨트롤러로는 NGINX Ingress Controller, Traefik 등이 있다.

서비스와 인그레스의 관계는 다음과 같이 정리할 수 있다.

구성 요소

주된 목적

네트워크 계층

필수 여부

서비스

파드 집합에 대한 내부 로드 밸런싱과 서비스 디스커버리

L4 (TCP/UDP)

필수 (파드 간 통신에)

인그레스

외부 트래픽을 서비스로 라우팅 (호스트/경로 기반)

L7 (HTTP/HTTPS)

선택 (외부 웹 접근이 필요할 때)

간단한 웹 애플리케이션의 경우, 애플리케이션 파드들을 위한 ClusterIP 타입의 서비스를 생성하고, 외부 사용자를 위한 인그레스 리소스를 추가하여 example.com/app 경로의 트래픽을 해당 서비스로 전달하도록 구성한다. 이렇게 함으로써 내부 네트워크 토폴로지와 외부 접근 방식을 독립적으로 관리하고 유연성을 확보할 수 있다.

2.4. ConfigMap과 Secret

ConfigMap은 키-값 쌍 형태로 구성 데이터를 저장하는 쿠버네티스 오브젝트이다. 애플리케이션의 설정 파일, 환경 변수, 명령줄 인수와 같은 비기밀성 데이터를 컨테이너화된 애플리케이션과 분리하는 데 사용된다. 이를 통해 동일한 애플리케이션 이미지를 다양한 환경(개발, 스테이징, 프로덕션)에 배포할 때 설정만 변경하여 재사용성을 높일 수 있다. ConfigMap은 Pod에 마운트된 볼륨으로 제공되거나, 컨테이너의 환경 변수로 주입될 수 있다.

Secret은 암호, OAuth 토큰, SSH 키와 같은 민감한 정보를 저장하기 위해 설계된 오브젝트이다. Secret은 데이터를 Base64로 인코딩하여 평문 저장을 피하며, etcd 저장소에서 암호화된 상태로 보관될 수 있다[2]. ConfigMap과 유사하게 Pod에 볼륨으로 마운트하거나 환경 변수로 참조할 수 있지만, 접근 권한을 더 엄격하게 관리해야 한다.

두 리소스 모두 YAML 매니페스트를 통해 선언적으로 생성하고 관리한다. 주요 차이점과 사용 예시는 다음 표와 같다.

특성

ConfigMap

Secret

데이터 유형

비기밀 설정 (설정 파일, 속성)

민감 정보 (비밀번호, API 키)

저장 방식

평문 (일반 텍스트)

Base64 인코딩 (기본)

보안

기본 암호화 없음

etcd 암호화 지원

사용 예시

application.properties, nginx.conf

docker-registry 인증, TLS 인증서

ConfigMap과 Secret을 사용할 때는 데이터 크기 제한(약 1MB)을 고려해야 하며, Secret의 Base64 인코딩은 보안 기능이 아닌 바이너리 데이터 호환을 위한 것임을 인지해야 한다. 민감도가 높은 데이터는 외부 시크릿 관리 시스템과 연동하는 것이 더 안전할 수 있다.

3. Kubernetes 아키텍처

Kubernetes 클러스터는 하나 이상의 마스터 노드와 다수의 워커 노드로 구성됩니다. 이들 노드는 함께 작동하여 컨테이너화된 애플리케이션의 배포, 스케일링, 관리를 담당합니다. 클러스터의 아키텍처는 크게 전반적인 상태를 관리하고 제어 명령을 내리는 컨트롤 플레인과 실제 컨테이너 워크로드를 실행하는 데이터 플레인으로 구분됩니다.

마스터 노드는 컨트롤 플레인의 핵심 구성 요소들을 호스팅합니다. 주요 구성 요소로는 클러스터의 상태를 저장하는 분산 키-값 저장소인 etcd, API 요청을 처리하는 진입점인 kube-apiserver, 노드 관리와 파드 할당을 담당하는 kube-scheduler, 그리고 실제 상태를 의도한 상태로 조정하는 컨트롤러 매니저가 있습니다. 이들 구성 요소는 고가용성을 위해 여러 마스터 노드에 분산 배치될 수 있습니다.

워커 노드는 애플리케이션 컨테이너를 Pod 단위로 실행하는 역할을 합니다. 각 워커 노드에는 kubelet과 kube-proxy가 필수적으로 동작합니다. kubelet은 마스터 노드와 통신하며 해당 노드에 할당된 파드의 생명주기를 관리하는 에이전트입니다. kube-proxy는 파드 간의 네트워크 통신과 로드 밸런싱을 담당하는 네트워크 프록시입니다. 또한, 컨테이너 런타임 (예: containerd, CRI-O)이 설치되어 컨테이너를 실제로 실행합니다.

컨트롤 플레인과 데이터 플레인의 상호작용은 다음과 같이 요약됩니다.

구성

주요 구성 요소

역할

컨트롤 플레인

kube-apiserver, etcd, kube-scheduler, 컨트롤러 매니저

클러스터의 전반적인 상태 관리, 스케줄링, 조정

데이터 플레인

kubelet, kube-proxy, 컨테이너 런타임

워커 노드에서 파드와 컨테이너의 실행 및 네트워킹 관리

사용자는 kubectl 명령줄 도구나 API를 통해 kube-apiserver에 명령을 전달합니다. apiserver는 명령을 검증하고 etcd에 상태를 저장하며, 스케줄러는 파드를 적합한 워커 노드에 할당합니다. 이후 해당 노드의 kubelet은 할당 명령을 받아 컨테이너 런타임을 통해 파드를 생성하고, kube-proxy는 필요한 네트워크 규칙을 설정합니다. 컨트롤러 매니저는 지속적으로 실제 상태를 모니터링하며, 의도한 상태(예: 복제본 수)를 유지하도록 조정 작업을 수행합니다.

3.1. 마스터 노드 구성 요소

마스터 노드는 쿠버네티스 클러스터의 두뇌 역할을 하며, 클러스터의 상태를 관리하고 제어하는 핵심 구성 요소들을 실행하는 서버 또는 서버 그룹이다. 이 노드는 일반적으로 애플리케이션 워크로드를 직접 실행하지 않으며, 클러스터의 관리와 조정에 전념한다. 주요 구성 요소로는 kube-apiserver, etcd, kube-scheduler, kube-controller-manager가 있다.

구성 요소

주요 역할

kube-apiserver

클러스터의 프론트엔드 API 서버로, 모든 내부 구성 요소 및 외부 사용자(예: kubectl)의 요청을 처리한다.

etcd

클러스터의 모든 구성 데이터(예: Pod, Service, ConfigMap 정보)를 저장하는 고가용성 키-값 저장소이다.

kube-scheduler

새로 생성된 Pod를 실행할 적합한 워커 노드를 선택하고 할당하는 책임을 진다.

kube-controller-manager

ReplicaSet, 노드, Service 계정 등 다양한 컨트롤러를 실행하여 클러스터의 실제 상태를 원하는 상태로 조정하는 루프를 관리한다.

kube-apiserver는 유일하게 etcd와 직접 통신하는 구성 요소이며, 클러스터 상태에 대한 모든 변경은 반드시 이를 통해 이루어진다. kube-controller-manager는 단일 바이너리로 실행되지만, 내부적으로 노드 컨트롤러, 레플리케이션 컨트롤러, 엔드포인트 컨트롤러 등 여러 컨트롤러 프로세스를 포함한다. 고가용성 클러스터를 구성할 경우, 이러한 마스터 구성 요소들은 여러 서버에 걸쳐 중복 실행되어 단일 장애 지점을 제거한다.

3.2. 워커 노드 구성 요소

워커 노드는 Kubernetes 클러스터에서 실제 컨테이너 워크로드를 실행하는 머신(가상 또는 물리적)이다. 이 노드는 파드를 호스팅하고, 컨테이너 런타임을 제공하며, 네트워크 및 스토리지 리소스를 관리하는 여러 핵심 구성 요소를 포함한다. 각 워커 노드는 컨트롤 플레인의 지시를 받아 애플리케이션을 구동하는 책임을 진다.

워커 노드의 핵심 구성 요소는 다음과 같다.

구성 요소

주요 역할

kubelet

노드에 할당된 파드의 생명주기를 관리한다. 파드 스펙에 정의된 컨테이너가 정상적으로 실행되도록 컨테이너 런타임과 협력한다.

kube-proxy

노드의 네트워크 규칙을 유지 관리하여 파드에 대한 네트워크 통신을 가능하게 한다. 서비스의 가상 IP 주소를 실제 파드 IP로 트래픽을 전달하는 네트워크 프록시 역할을 한다.

컨테이너 런타임

파드 내 컨테이너를 실행하는 소프트웨어이다. 도커, containerd, CRI-O 등이 널리 사용된다.

kubelet은 노드의 상태와 리소스 사용량을 컨트롤 플레인에 지속적으로 보고한다. kube-proxy는 운영 체제의 패킷 필터링 계층(예: iptables 또는 IPVS)을 사용하여 트래픽 라우팅을 처리한다. 또한, 워커 노드는 애플리케이션 데이터를 영구적으로 저장하기 위해 로컬 스토리지나 네트워크 스토리지 볼륨을 마운트할 수 있다.

3.3. 컨트롤 플레인과 데이터 플레인

Kubernetes 클러스터의 아키텍처는 크게 컨트롤 플레인과 데이터 플레인이라는 두 개의 논리적 영역으로 구분된다. 이 구분은 시스템의 책임과 기능을 명확히 분리한다. 컨트롤 플레인은 클러스터의 두뇌 역할을 하며, 전체 상태를 관리하고 의사 결정을 내린다. 반면 데이터 플레인은 실제 컨테이너 워크로드를 실행하고 네트워크 트래픽을 처리하는 실행부 역할을 담당한다.

컨트롤 플레인은 주로 마스터 노드에 위치하는 구성 요소들로 이루어진다. 핵심 구성 요소로는 클러스터 상태를 저장하는 etcd, API 요청을 처리하는 kube-apiserver, 스케줄링 결정을 내리는 kube-scheduler, 그리고 의도한 상태를 유지하기 위해 컨트롤러를 운영하는 kube-controller-manager가 있다. 이들은 사용자가 정의한 YAML 매니페스트를 바탕으로 '의도한 상태'를 설정하고, 실제 상태가 이와 일치하도록 지속적으로 조정하는 작업을 수행한다. 컨트롤 플레인의 모든 통신은 kube-apiserver를 중심으로 이루어진다.

데이터 플레인은 워커 노드(또는 노드)에서 실행되는 구성 요소들로 구성된다. 각 노드에는 kubelet과 컨테이너 런타임(예: containerd, CRI-O), 그리고 kube-proxy가 필수적으로 설치되어 있다. kubelet은 해당 노드에서 Pod의 생명주기를 관리하는 에이전트이다. 컨테이너 런타임은 컨테이너를 실제로 실행하는 소프트웨어이다. kube-proxy는 Pod 간의 네트워크 통신을 가능하게 하는 네트워크 프록시 역할을 하며, Service 규칙을 관리한다.

이 두 플레인의 상호작용은 다음과 같이 요약할 수 있다.

플레인

주요 책임

구성 요소 예시

위치

컨트롤 플레인

클러스터 관리, 상태 저장, 의사 결정

kube-apiserver, etcd, kube-scheduler

마스터 노드

데이터 플레인

워크로드 실행, 네트워킹, 스토리지 접근

kubelet, 컨테이너 런타임, kube-proxy

모든 워커 노드

사용자는 kubectl 명령어나 API를 통해 컨트롤 플레인에 명령을 전달한다. 컨트롤 플레인은 이 명령을 처리하고, 데이터 플레인의 구성 요소들에게 작업을 지시하여 최종적으로 애플리케이션이 원하는 상태로 배포되고 유지되도록 한다. 이 분리된 구조는 Kubernetes가 확장성과 견고성을 갖추는 데 기여한다.

4. 애플리케이션 배포 및 관리

애플리케이션을 Kubernetes에 배포하고 관리하는 기본 단위는 YAML 또는 JSON 형식으로 작성된 매니페스트 파일이다. 이 파일은 애플리케이션의 원하는 상태(Desired State)를 선언적으로 정의한다. 일반적으로 Pod, Deployment, Service 등의 리소스 종류(apiVersion, kind), 메타데이터(name, labels), 그리고 스펙(spec)을 포함한다. 스펙에는 컨테이너 이미지, 포트, 환경 변수, 리소스 요청 및 제한 등을 명시한다. 이러한 매니페스트 파일은 kubectl apply -f [파일명] 명령어를 통해 클러스터에 적용되어 실제 상태를 원하는 상태에 맞추기 위한 작업이 시작된다.

애플리케이션의 규모 조정은 주로 Deployment 리소스를 통해 관리된다. kubectl scale deployment/[디플로이먼트명] --replicas=[개수] 명령어를 사용하거나 매니페스트 파일의 replicas 값을 수정 후 재적용하여 Pod의 개수를 동적으로 늘리거나 줄일 수 있다. 애플리케이션 업데이트는 롤링 업데이트 방식이 기본 전략으로, 새 버전의 Pod를 점진적으로 생성하고 오래된 버전의 Pod를 종료하여 다운타임 없이 배포를 수행한다. kubectl set image deployment/[디플로이먼트명] [컨테이너명]=[새이미지:태그] 명령어로 이미지를 업데이트하거나, 매니페스트 파일의 이미지 태그를 변경 후 재적용하여 업데이트를 트리거할 수 있다.

Kubernetes는 애플리케이션의 건강 상태를 지속적으로 모니터링하고 관리하기 위해 다양한 프로브를 제공한다. 이 프로브들은 kubelet에 의해 주기적으로 실행된다.

프로브 종류

목적

성공 조건

Startup Probe

컨테이너 내 애플리케이션의 완전한 시작을 확인.

지정된 성공 조건을 만족.

Liveness Probe

컨테이너가 정상적으로 동작 중인지 확인. 실패 시 컨테이너를 재시작.

지정된 성공 조건을 만족.

Readiness Probe

컨테이너가 트래픽을 수신할 준비가 되었는지 확인. 실패 시 Service의 엔드포인트에서 제외.

지정된 성공 조건을 만족.

프로브는 HTTP GET 요청, TCP 소켓 연결, 또는 컨테이너 내부에서 명령어 실행 방식으로 구성할 수 있다. 이를 통해 정상적인 서비스가 불가능한 Pod에 트래픽이 전달되는 것을 방지하고, 장애가 발생한 컨테이너를 자동으로 복구하는 데 기여한다.

4.1. YAML 매니페스트 작성

쿠버네티스에서 애플리케이션과 리소스를 정의하는 가장 기본적인 방법은 YAML 형식의 매니페스트 파일을 사용하는 것이다. 이 파일은 선언적 방식으로 원하는 시스템 상태를 기술하며, 쿠버네티스 API 서버에 제출되어 실행된다. 모든 매니페스트는 몇 가지 필수 필드를 포함해야 한다. apiVersion은 사용하는 쿠버네티스 API의 버전을, kind는 생성하려는 리소스의 종류(예: Pod, Deployment, Service)를 지정한다. metadata는 이름, 네임스페이스, 라벨과 같은 리소스의 식별 정보를 담고 있으며, spec 섹션은 해당 리소스가 가져야 할 구체적인 상태와 설정을 정의한다.

일반적인 Deployment 매니페스트의 구조는 다음과 같다. spec 내부에는 replicas로 실행할 Pod의 복제본 수, selector로 이 Deployment가 관리할 Pod를 선택하는 기준, 그리고 template으로 생성될 Pod의 명세를 정의한다. template.spec 아래에는 Pod 안에서 실행될 하나 이상의 컨테이너 정보를 containers 배열로 나열한다. 각 컨테이너는 name과 image(도커 이미지)를 필수로 지정해야 한다.

필드

설명

예시

apiVersion

리소스의 API 버전

apps/v1

kind

리소스 종류

Deployment

metadata.name

리소스의 이름

my-app

spec.replicas

원하는 Pod 복제본 수

3

spec.template.spec.containers

실행할 컨테이너 목록

- name: nginx

image: nginx:1.21

작성 시 유의할 점은 들여쓰기에 민감한 YAML 문법을 정확히 지키고, 라벨(labels)과 셀렉터(selector)가 일치하도록 구성해야 한다는 것이다. 또한, 컨테이너의 환경 변수, 포트 설정, 리소스 요청 및 제한(resources.requests/limits) 등을 spec.containers 하위에 상세히 정의할 수 있다. 매니페스트 파일은 kubectl apply -f <파일명.yaml> 명령어를 통해 클러스터에 적용된다.

4.2. 스케일링과 업데이트

애플리케이션의 인스턴스 수를 조정하는 스케일링은 Deployment나 ReplicaSet의 replicas 필드 값을 변경하여 수행한다. 명령어 kubectl scale deployment/<배포명> --replicas=<숫자>로 즉시 적용하거나, 매니페스트 파일을 수정한 후 kubectl apply 명령어로 적용할 수 있다. Horizontal Pod Autoscaler를 구성하면 CPU 사용률이나 사용자 지정 메트릭에 따라 자동으로 Pod 수를 조정할 수 있다.

애플리케이션 업데이트는 주로 롤링 업데이트 전략을 통해 이루어진다. Deployment는 새 ReplicaSet을 생성하고, 새 Pod를 하나씩 생성하면서 기존 Pod를 순차적으로 제거한다. 이 방식은 다운타임 없이 서비스를 지속할 수 있게 한다. 업데이트 진행 상황은 kubectl rollout status deployment/<배포명> 명령으로 확인할 수 있다.

업데이트 중 문제가 발생하면 kubectl rollout undo deployment/<배포명> 명령을 실행하여 이전 정상 ReplicaSet 버전으로 빠르게 롤백할 수 있다. Deployment 기록을 통해 특정 리비전으로의 롤백도 가능하다. 업데이트 전략과 속도는 maxSurge(한 번에 추가 생성할 Pod 수)와 maxUnavailable(업데이트 중 사용 불가능하게 허용할 Pod 수) 매개변수로 세밀하게 제어할 수 있다.

업데이트 전략

설명

주요 특징

롤링 업데이트 (기본)

새 Pod를 점진적으로 생성하고 기존 Pod를 삭제

무중단 업데이트, 버전 롤백 지원

재생성

기존 모든 Pod를 한 번에 삭제 후 새 Pod 생성

빠른 배포, 짧은 다운타임 발생

블루-그린 배포

새 버전(그린)을 완전히 배포 후 트래픽 전환

빠른 롤백, 리소스가 두 배로 필요

4.3. 헬스 체크와 프로브

헬스 체크는 Kubernetes가 Pod 내 컨테이너의 상태를 지속적으로 모니터링하고, 비정상적인 컨테이너를 자동으로 복구하거나 트래픽에서 제외하는 핵심 메커니즘이다. 이를 통해 애플리케이션의 가용성과 신뢰성을 높일 수 있다. Kubernetes는 주기적으로 컨테이너 상태를 진단하는 라이브니스 프로브와 서비스 요청을 보낼 준비가 되었는지 확인하는 레디니스 프로브, 그리고 애플리케이션의 초기 시작이 완료되었는지를 점검하는 스타트업 프로브를 제공한다.

각 프로브는 HTTP GET 요청, TCP 소켓 연결, 또는 컨테이너 내에서 명령어 실행 등 세 가지 핸들러 방식 중 하나로 정의된다. 프로브의 동작은 initialDelaySeconds, periodSeconds, timeoutSeconds, failureThreshold 등의 매개변수를 통해 세밀하게 조정할 수 있다. 예를 들어, 애플리케이션 시작에 시간이 오래 걸린다면 initialDelaySeconds 값을 늘려 초기 진단을 지연시킬 수 있다.

프로브 종류

목적

실패 시 동작

라이브니스 프로브

컨테이너가 정상적으로 실행 중인지 확인

컨테이너를 재시작

레디니스 프로브

컨테이너가 트래픽을 수신할 준비가 되었는지 확인

Service의 엔드포인트 목록에서 해당 Pod를 일시 제외

스타트업 프로브

느리게 시작하는 애플리케이션의 초기화 완료 여부 확인

성공할 때까지 다른 프로브 비활성화

적절한 헬스 체크 구성은 시스템 안정성에 매우 중요하다. 라이브니스 프로브가 너무 민감하게 설정되면 불필요한 컨테이너 재시작이 빈번히 발생할 수 있으며, 반대로 둔감하면 장애 상태의 컨테이너가 계속 서비스될 위험이 있다. 레디니스 프로브는 데이터베이스 연결이나 외부 의존성 초기화가 완료되기 전까지 트래픽을 받지 않도록 하여 사용자 요청 실패를 방지한다.

5. 스토리지 관리

쿠버네티스에서 애플리케이션은 일반적으로 스테이트리스하게 설계되지만, 데이터베이스나 파일 저장소와 같은 스테이트풀 애플리케이션은 지속적인 데이터 저장이 필요합니다. 컨테이너의 파일 시스템은 일시적이기 때문에, 파드가 재시작되거나 다른 노드로 이동하면 데이터가 손실됩니다. 이를 해결하기 위해 쿠버네티스는 볼륨과 퍼시스턴트볼륨이라는 추상화된 스토리지 계층을 제공합니다.

볼륨은 파드의 일부로 정의되며, 파드 내의 하나 이상의 컨테이너가 마운트하여 사용할 수 있는 디렉터리입니다. 볼륨의 수명은 이를 사용하는 파드에 묶여 있어, 파드가 삭제되면 볼륨의 데이터도 일반적으로 사라집니다. 다양한 유형의 볼륨이 지원되며, 대표적인 예는 다음과 같습니다.

볼륨 유형

설명

emptyDir

파드가 노드에 할당될 때 생성되는 빈 디렉터리로, 파드의 생명주기 동안만 존재합니다.

hostPath

워커 노드의 파일 시스템 경로를 파드에 마운트합니다. 단일 노드 테스트에 주로 사용됩니다.

configMap, Secret

ConfigMap이나 Secret 객체의 데이터를 파일 형태로 마운트합니다.

데이터를 영구적으로 보존하려면 퍼시스턴트볼륨과 퍼시스턴트볼륨클레임을 사용합니다. PV는 클러스터 관리자가 프로비저닝한 네트워크 스토리지(NFS, 클라우드 디스크 등)를 나타내는 클러스터 리소스입니다. 반면 PVC는 사용자(또는 파드)가 PV에 대한 스토리지 요청을 나타냅니다. 사용자는 PVC를 생성하여 필요한 스토리지 크기와 접근 모드(예: ReadWriteOnce, ReadOnlyMany)를 지정하면, 쿠버네티스가 적합한 PV를 PVC에 자동으로 바인딩합니다. 이 방식을 통해 애플리케이션 개발자는 구체적인 스토리지 인프라 세부 사항을 알 필요 없이 스토리지를 요청할 수 있습니다.

스토리지클래스는 동적 프로비저닝을 가능하게 하는 핵심 요소입니다. 관리자는 스토리지클래스를 정의하여 프로비저너, 파라미터, 리클레임 정책 등을 설정합니다. 사용자가 PVC를 생성할 때 원하는 스토리지클래스를 지정하면, 쿠버네티스는 해당 스토리지클래스에 정의된 방식에 따라 자동으로 새로운 PV를 생성하고 PVC에 바인딩합니다. 이는 수동으로 PV를 생성하고 관리하는 번거로움을 크게 줄여줍니다.

5.1. 볼륨과 PersistentVolume

컨테이너는 기본적으로 스테이트리스이며, 컨테이너가 재시작되면 디스크에 기록된 파일이 사라진다. 쿠버네티스는 컨테이너에 지속적인 데이터를 저장하고 공유할 수 있도록 볼륨 추상화를 제공한다. 볼륨은 Pod에 정의되며, Pod 내의 하나 이상의 컨테이너가 마운트하여 사용할 수 있다. 볼륨의 수명은 Pod와 연결되어 있어, Pod가 삭제되면 해당 볼륨의 데이터도 일반적으로 사라진다.

데이터를 영구적으로 보존하기 위해서는 PersistentVolume과 PersistentVolumeClaim 오브젝트를 사용한다. PersistentVolume은 관리자가 프로비저닝하거나 스토리지 클래스를 통해 동적으로 제공되는 클러스터의 스토리지 자원이다. 반면, PersistentVolumeClaim은 사용자가 특정 크기 및 접근 모드의 스토리지를 요청하는 선언문이다. 쿠버네티스 시스템은 Claim을 만족하는 PersistentVolume을 찾아 바인딩한다.

주요 볼륨 타입과 PersistentVolume의 접근 모드는 다음과 같다.

볼륨 타입 / PV 접근 모드

설명

emptyDir

Pod가 노드에 할당될 때 생성되는 임시 볼륨. Pod 삭제 시 데이터 사라짐.

hostPath

노드의 파일시스템 경로를 마운트. 단일 노드 테스트용으로 적합[3].

nfs

NFS(네트워크 파일 시스템) 공유를 마운트.

cloud

AWS EBS, GCP Persistent Disk 등 클라우드 공급자의 블록 스토리지.

ReadWriteOnce

단일 노드에서 읽기/쓰기 가능.

ReadOnlyMany

여러 노드에서 읽기 전용으로 마운트 가능.

ReadWriteMany

여러 노드에서 읽기/쓰기 가능.

Pod는 PersistentVolume을 직접 참조하지 않으며, 항상 PersistentVolumeClaim을 통해 스토리지를 요청한다. 이 분리는 스토리지 제공 방식과 사용 방식을 분리하여 관리의 유연성을 제공한다. 관리자는 다양한 스토리지 백엔드를 PersistentVolume으로 제공하고, 개발자는 필요한 스토리지 용량과 성능만을 Claim으로 정의하여 애플리케이션에 사용한다.

5.2. 스토리지 클래스

스토리지 클래스는 쿠버네티스 클러스터에서 퍼시스턴트볼륨의 동적 프로비저닝을 가능하게 하는 리소스입니다. 사용자가 퍼시스턴트볼륨클레임을 생성하면, 스토리지 클래스는 지정된 프로비저너와 파라미터를 기반으로 자동으로 적절한 스토리지를 생성하고 바인딩합니다. 이는 관리자가 수동으로 퍼시스턴트볼륨을 미리 생성하고 관리해야 하는 번거로움을 크게 줄여줍니다.

각 스토리지 클래스는 provisioner, parameters, reclaimPolicy 등의 필드를 정의합니다. provisioner는 사용할 스토리지 백엔드(예: kubernetes.io/aws-ebs, kubernetes.io/gce-pd)를 결정합니다. parameters는 프로비저너에 따라 다른 설정값을 제공하며, 예를 들어 볼륨 유형, IOPS, 암호화 여부 등을 지정할 수 있습니다. reclaimPolicy는 PVC가 삭제된 후 PV를 어떻게 처리할지(Retain, Delete, Recycle) 정의합니다.

다음은 주요 클라우드 공급자별 일반적인 스토리지 클래스 프로비저너의 예시입니다.

프로비저너

설명

일반적인 사용 사례

kubernetes.io/aws-ebs

AWS의 EBS 볼륨을 프로비저닝합니다.

AWS 환경에서 상태 유지가 필요한 애플리케이션.

kubernetes.io/gce-pd

GCP의 퍼시스턴트 디스크를 프로비저닝합니다.

GCP 환경의 데이터베이스나 파일 스토리지.

kubernetes.io/azure-disk

Azure의 Managed Disks를 프로비저닝합니다.

Azure에서 실행되는 엔터프라이즈 애플리케이션.

kubernetes.io/vsphere-volume

VMware vSphere의 볼륨을 프로비저닝합니다.

온프레미스 vSphere 환경.

kubernetes.io/no-provisioner

동적 프로비저닝을 사용하지 않습니다. 로컬 볼륨에 주로 사용됩니다.

개발 테스트 환경이나 특정 로컬 스토리지 필요 시.

클러스터 관리자는 애플리케이션의 성능, 가용성, 비용 요구사항에 맞게 다양한 스토리지 클래스를 정의할 수 있습니다. 예를 들어, fast 클래스는 SSD를 사용하고 slow 클래스는 표준 HDD를 사용하도록 설정할 수 있습니다. 개발자는 PVC 매니페스트에서 storageClassName 필드를 지정함으로써 원하는 스토리지 클래스를 간단히 선택하여 사용합니다. 이를 통해 스토리지 인프라의 세부 사항을 추상화하고, 애플리케이션 코드 변경 없이 유연하게 스토리지 백엔드를 교체하거나 업그레이드할 수 있습니다.

6. 네트워킹

Kubernetes 클러스터 내부의 Pod들은 고유한 IP 주소를 할당받습니다. 이 IP는 클러스터 내부에서만 통용되는 가상 네트워크 상에 존재하며, Pod가 재시작되거나 다른 노드로 이동하면 변경될 수 있습니다. 이러한 특성으로 인해, 안정적인 통신을 위해 Service 객체가 사용됩니다. Service는 일련의 Pod에 대한 논리적인 엔드포인트와 고정된 DNS 이름을 제공하여, 클라이언트가 변하는 Pod IP를 직접 관리하지 않고도 서비스에 접근할 수 있게 합니다.

클러스터 내부 통신은 주로 다음과 같은 Service 타입을 통해 이루어집니다.

Service 타입

용도

접근 범위

ClusterIP

기본 타입. 내부 통신 전용

클러스터 내부에서만 접근 가능

NodePort

ClusterIP에 더해 각 노드의 특정 포트를 통해 외부 접근 가능

클러스터 외부에서 노드IP:포트로 접근

LoadBalancer

클라우드 공급자의 로드 밸런서를 자동으로 프로비저닝하여 외부 트래픽을 서비스로 분산

인터넷 등 외부 네트워크에서 접근

보다 복잡한 HTTP/HTTPS 기반의 외부 접근과 라우팅 규칙(예: 호스트 기반 또는 경로 기반 라우팅)을 관리하기 위해 Ingress 리소스가 사용됩니다. Ingress는 클러스터 내부 서비스에 대한 외부 접근을 관리하는 API 객체로, Ingress Controller가 이 규칙을 해석하고 실제 트래픽을 처리합니다. 일반적으로 단일 LoadBalancer 타입의 Service로 Ingress Controller를 노출시킨 후, 다양한 내부 서비스에 대한 라우팅을 Ingress 규칙으로 정의합니다.

네트워크 정책(NetworkPolicy)은 Pod 간의 통신을 제어하는 필수적인 보안 메커니즘입니다. 기본적으로 클러스터 내 모든 Pod는 서로 통신할 수 있지만, NetworkPolicy를 정의하면 특정 Pod 그룹이 어떤 프로토콜과 포트를 통해 다른 그룹과 통신할 수 있는지를 세밀하게 규정할 수 있습니다. 이는 마이크로서비스 아키텍처에서 서비스 간의 불필요한 통신을 차단하는 데 유용합니다[4].

6.1. 클러스터 내부 통신

쿠버네티스 클러스터 내부 통신은 파드와 서비스를 중심으로 이루어집니다. 각 파드는 고유한 IP 주소를 할당받지만, 파드는 일시적이므로 직접 IP 주소로 통신하는 것은 권장되지 않습니다. 대신, 고정된 DNS 이름을 제공하는 서비스 객체가 파드 집합에 대한 안정적인 네트워크 엔드포인트 역할을 합니다. 서비스는 선택기(Selector)를 통해 특정 레이블을 가진 파드들을 타겟으로 지정하며, 클러스터 내부의 DNS 서버(CoreDNS)는 서비스 이름을 해당 클러스터 IP로 자동으로 변환해줍니다.

클러스터 네트워킹 모델은 몇 가지 기본 요구사항을 충족시킵니다. 모든 파드는 IP 주소를 가지며 다른 모든 파드와 NAT 없이 통신할 수 있어야 합니다(IP-per-Pod 모델). 모든 노드도 모든 파드와 통신할 수 있어야 합니다. 이러한 모델을 구현하기 위해 CNI 플러그인(Calico, Flannel, Cilium 등)이 사용됩니다. 이 플러그인들은 파드 IP 할당, 노드 간 네트워크 라우팅 구성을 담당하여 복잡한 네트워크 인프라를 추상화합니다.

서비스의 주요 타입과 내부 통신 방식을 비교하면 다음과 같습니다.

서비스 타입

클러스터 내부 DNS 이름

주요 용도

ClusterIP

<서비스명>.<네임스페이스>.svc.cluster.local

클러스터 내부에서 파드 집합에 접근 (기본 타입)

Headless (ClusterIP=None)

<파드명>.<서비스명>.<네임스페이스>.svc.cluster.local

스테이트풀셋과 같이 개별 파드에 직접 접근이 필요할 때

예를 들어, my-app이라는 서비스가 default 네임스페이스에 있다면, 동일한 클러스터 내의 다른 파드는 my-app.default.svc.cluster.local 이라는 도메인 이름으로 이 서비스에 연결할 수 있습니다. Headless 서비스는 클러스터 IP가 없으며, DNS 쿼리를 수행하면 해당 서비스에 속한 파드들의 IP 주소 목록이 반환되어, 스테이트풀셋과 같은 워크로드에서 피어 디스커버리에 활용됩니다.

6.2. 외부 접근 구성

서비스 오브젝트는 파드 집합에 대한 안정적인 네트워크 엔드포인트를 제공하는 주요 방법이다. 특히 LoadBalancer 타입의 서비스를 생성하면, 대부분의 클라우드 공급자는 자동으로 외부 로드 밸런서를 프로비저닝하고 해당 서비스에 공인 IP를 할당한다. 이 IP를 통해 클러스터 외부에서 애플리케이션에 접근할 수 있다. NodePort 타입은 각 워커 노드의 특정 포트를 열어, 해당 노드의 IP와 포트로의 접근을 허용한다.

보다 복잡한 HTTP/HTTPS 라우팅 요구사항을 처리하기 위해 인그레스 리소스를 사용한다. 인그레스는 클러스터 내부 서비스에 대한 외부 접근을 관리하는 API 오브젝트로, 호스트 기반 또는 경로 기반 라우팅 규칙을 정의할 수 있다. 인그레스 규칙을 실제로 구현하려면 인그레스 컨트롤러가 필요하다. 널리 사용되는 인그레스 컨트롤러로는 NGINX, Traefik, HAProxy 등이 있다.

접근 방식

리소스 타입

주요 용도

특징

단일 서비스 노출

Service (LoadBalancer/NodePort)

간단한 외부 노출

클라우드 LB 자동 생성(LoadBalancer) 또는 노드 포트 직접 지정(NodePort)

HTTP 라우팅

Ingress

호스트/경로 기반 라우팅, TLS 종료

하나의 로드 밸런서 IP로 여러 서비스 노출 가능, SSL 인증서 관리 지원

외부 IP 직접 지정

Service (ExternalIPs)

특정 IP로의 서비스 바인딩

클러스터 외부의 특정 IP 주소를 서비스에 매핑

인그레스를 구성할 때는 TLS 보안 연결을 설정하는 것이 일반적이다. 이는 인그레스 매니페스트에 시크릿 오브젝트로 저장된 TLS 인증서와 키를 참조하여 이루어진다. 인그레스 컨트롤러는 이를 통해 들어오는 HTTPS 트래픽의 TLS 연결을 종료한다. 또한, 특정 애플리케이션은 NodePort 서비스와 외부 로드 밸런서를 조합하거나, 서비스 메시 솔루션의 게이트웨이를 활용하는 등 하이브리드 방식으로 외부 접근을 구성하기도 한다.

7. 보안 기초

Kubernetes 클러스터의 보안은 여러 계층에서 구성된다. 주요 보안 메커니즘으로는 RBAC과 네트워크 정책이 있으며, 이들은 각각 인가(Authorization)와 네트워크 트래픽 제어를 담당한다.

RBAC은 사용자나 서비스 계정과 같은 주체(Subject)가 클러스터 리소스에 대해 수행할 수 있는 작업을 세부적으로 제어하는 인가 시스템이다. RBAC은 역할(Role)과 역할 바인딩(RoleBinding) 또는 클러스터 역할(ClusterRole)과 클러스터 역할 바인딩(ClusterRoleBinding)을 통해 권한을 정의하고 할당한다. 예를 들어, 특정 네임스페이스 내의 Pod 목록만 조회할 수 있는 역할을 생성하고, 이를 특정 사용자에게 바인딩하여 최소 권한 원칙을 적용할 수 있다. 서비스 계정에 대한 권한 관리도 RBAC을 통해 이루어진다.

네트워크 정책은 Pod 간의 네트워크 통신을 제어하는 가상 방화벽 역할을 한다. 기본적으로 대부분의 CNI 플러그인은 모든 Pod 간의 통신을 허용하지만, 네트워크 정책을 정의하면 특정 트래픽만을 허용하거나 차단할 수 있다. 정책은 인그레스(Ingress, 수신)와 이그레스(Egress, 송신) 규칙을 별도로 지정할 수 있으며, 규칙은 출발지/목적지 Pod 셀렉터, 네임스페이스 셀렉터, 특정 포트 또는 CIDR 블록을 기준으로 정의된다. 예를 들어, 데이터베이스 Pod로의 트래픽을 특정 애플리케이션 Pod에서만 오도록 제한하는 정책을 구성할 수 있다.

보안 구성은 YAML 매니페스트로 정의되며, 아래는 간단한 예시이다.

리소스 종류

목적

주요 필드 예시

Role

특정 네임스페이스 내 권한 정의

rules.apiGroups, rules.resources, rules.verbs

RoleBinding

역할을 주체(사용자/그룹/서비스계정)에 연결

roleRef, subjects

NetworkPolicy

Pod 간 네트워크 트래픽 제어

podSelector, policyTypes, ingress.from, egress.to

이러한 보안 메커니즘을 효과적으로 조합하면, 애플리케이션의 공격 표면을 줄이고 다중 테넌트 환경에서의 격리를 강화할 수 있다.

7.1. RBAC (역할 기반 접근 제어)

RBAC은 쿠버네티스 클러스터 내에서 사용자, 파드, 서비스 계정 등이 가진 권한을 세밀하게 관리하기 위한 접근 제어 메커니즘이다. 이는 "누가(Who) 어떤 자원(What)에 대해 어떤 행동(How)을 할 수 있는지"를 정의하는 규칙을 기반으로 한다. RBAC를 사용하면 관리자는 특정 네임스페이스나 클러스터 전체에 대해 역할을 생성하고, 그 역할에 권한을 부여한 후, 사용자나 그룹에게 역할을 할당하는 방식으로 권한을 제어한다. 이는 모든 사용자에게 동일한 관리자 권한을 부여하는 방식보다 훨씬 안전한 보안 모델을 제공한다.

RBAC의 주요 구성 요소는 Role, ClusterRole, RoleBinding, ClusterRoleBinding이다. Role과 ClusterRole은 실제 수행할 수 있는 권한(예: 파드 생성, 조회, 삭제)의 집합을 정의한다. Role은 특정 네임스페이스 내에서만 유효한 반면, ClusterRole은 클러스터 전체에 걸쳐 적용된다. RoleBinding과 ClusterRoleBinding은 정의된 Role 또는 ClusterRole을 특정 사용자, 그룹, 또는 서비스 어카운트에 연결(bind)하는 역할을 한다. RoleBinding은 네임스페이스 범위의 Role이나 ClusterRole을 바인딩할 수 있으며, ClusterRoleBinding은 클러스터 전체 범위의 ClusterRole을 바인딩한다.

권한 설정은 YAML 매니페스트를 통해 이루어진다. 아래는 monitoring 네임스페이스에서 파드와 ConfigMap을 조회할 수 있는 Role과, 이를 특정 서비스 계정에 바인딩하는 RoleBinding의 예시이다.

구성 요소

YAML 예시 (간략화)

Role

apiVersion: rbac.authorization.k8s.io/v1

kind: Role

metadata:

namespace: monitoring

name: pod-reader

rules:

- apiGroups: [""]

resources: ["pods", "configmaps"]

verbs: ["get", "list", "watch"]

RoleBinding

apiVersion: rbac.authorization.k8s.io/v1

kind: RoleBinding

metadata:

name: read-pods

namespace: monitoring

subjects:

- kind: ServiceAccount

name: monitoring-agent

roleRef:

kind: Role

name: pod-reader

apiGroup: rbac.authorization.k8s.io

RBAC를 효과적으로 운영하기 위해서는 최소 권한의 원칙을 따르는 것이 중요하다. 즉, 각 사용자나 애플리케이션에게 작업을 수행하는 데 필요한 최소한의 권한만 부여해야 한다. 또한, 사전 정의된 cluster-admin, edit, view와 같은 클러스터롤을 상황에 맞게 활용할 수 있다. 정기적으로 역할과 바인딩을 감사(audit)하여 불필요하거나 과도한 권한이 부여되지 않았는지 확인하는 것도 좋은 보안 관행이다.

7.2. 네트워크 정책

네트워크 정책은 Kubernetes 클러스터 내 Pod 간의 네트워크 트래픽을 제어하는 규칙 집합이다. 파이어월과 유사한 기능을 제공하여, 특정 Pod 그룹이 서로 통신할 수 있는 방법을 정의한다. 기본적으로 대부분의 Kubernetes 클러스터는 모든 Pod 간의 통신을 허용하지만, 네트워크 정책을 적용하면 "기본 거부" 모델로 전환하여 명시적으로 허용된 트래픽만 흐르도록 할 수 있다. 이는 마이크로서비스 아키텍처에서 애플리케이션 계층을 분리하거나, 민감한 구성 요소를 격리하는 데 필수적인 보안 도구이다.

네트워크 정책은 YAML 매니페스트로 정의하며, 주요 규칙은 Ingress(수신)와 Egress(송신) 방향으로 구성된다. 각 규칙은 트래픽을 허용할 소스(PodSelector, NamespaceSelector, IPBlock)와 대상 포트를 지정한다. 예를 들어, 특정 레이블을 가진 Pod들만 데이터베이스 Pod의 3306 포트로의 트래픽을 허용하는 정책을 작성할 수 있다. 네트워크 정책의 동작은 CNI 플러그인에 의해 구현되므로, 클러스터의 네트워크 솔루션(예: Calico, Cilium, Weave Net)이 네트워크 정책을 지원해야 한다.

다음은 기본적인 네트워크 정책의 예시이다. 이 정책은 role: db 레이블을 가진 모든 Pod에 적용되어, role: api 레이블을 가진 Pod로부터의 6379 포트 TCP 트래픽만 허용한다.

```yaml

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

name: allow-api-to-db

spec:

podSelector:

matchLabels:

role: db

policyTypes:

  • Ingress

ingress:

  • from:

  • podSelector:

matchLabels:

role: api

ports:

  • protocol: TCP

port: 6379

```

네트워크 정책은 기본적으로 네임스페이스 범위에서 작동하지만, 다른 네임스페이스의 Pod를 선택하는 규칙도 작성할 수 있다. 여러 정책이 하나의 Pod에 적용될 경우, 규칙은 추가적(누적적)으로 적용된다. 즉, 한 정책에서 허용한 트래픽은 다른 정책에 의해 거부되지 않는다. 효과적인 Zero Trust 보안 모델을 구축하려면, 애플리케이션의 각 구성 요소에 대해 필요한 최소한의 통신 경로만 허용하는 세분화된 네트워크 정책을 설계하는 것이 좋다.

8. 모니터링과 로깅

애플리케이션과 Kubernetes 클러스터의 상태를 지속적으로 관찰하고 문제를 진단하기 위해 체계적인 모니터링과 로깅 전략이 필수적이다. 모니터링은 메트릭 수집과 시각화를 통해 시스템의 성능과 건강 상태를 실시간으로 파악하는 것을 목표로 한다. 일반적으로 프로메테우스와 같은 시계열 데이터베이스가 메트릭을 수집하고, 그라파나를 통해 대시보드로 시각화하는 조합이 널리 사용된다. Kubernetes는 kube-state-metrics를 통해 파드, 노드, 디플로이먼트 등의 객체 상태를 메트릭으로 노출하며, 각 노드의 cAdvisor는 컨테이너 수준의 리소스 사용량(CPU, 메모리, 네트워크) 데이터를 제공한다.

로깅은 애플리케이션과 시스템 구성 요소가 생성하는 텍스트 로그를 중앙에서 수집, 저장, 검색 및 분석하는 과정이다. Kubernetes 환경에서는 각 파드의 컨테이너가 표준 출력(stdout)과 표준 오류(stderr)로 로그를 기록하며, kubelet이 이를 수집한다. 효과적인 로깅을 위해 엘라스틱서치, 플루언트비트, 키바나로 구성된 EFK 스택이나, 로키와 그라파나 로키 조합이 인기 있는 솔루션으로 자리 잡았다. 이러한 도구들은 로그를 중앙 집중화하고 강력한 검색 기능을 제공하여 문제 해결 시간을 단축시킨다.

모니터링과 로깅을 구성할 때 고려해야 할 주요 요소는 다음과 같다.

구성 요소

주요 도구 예시

목적

메트릭 수집

프로메테우스, 데이터독, 뉴렐릭

리소스 사용률, 애플리케이션 성능 지표 수집

로그 수집 에이전트

플루언트비트, 파일비트, 벡터

노드 또는 파드에서 로그를 수집하여 중앙 저장소로 전송

로그/메트릭 저장소

엘라스틱서치, 로키, 인플럭스DB

수집된 데이터를 장기간 저장하고 인덱싱

시각화 및 알림

그라파나, 키바나

대시보드 구축 및 임계값 기반 알림 설정

이러한 도구들을 활용하면 애플리케이션의 성능 저하, 장애 발생 시점, 리소스 부족 현상 등을 사전에 감지하거나 신속하게 원인을 분석할 수 있다. 특히 Kubernetes의 동적인 특성상 파드가 자주 생성되고 소멸되므로, 로그와 메트릭에 반드시 레이블과 어노테이션 정보를 포함시켜 특정 서비스나 버전의 데이터를 쉽게 필터링할 수 있도록 구성하는 것이 중요하다.

9. 클러스터 운영 팁

Kubernetes 클러스터를 안정적으로 운영하기 위해서는 몇 가지 모범 사례를 따르는 것이 중요하다. 클러스터를 구성한 후에도 지속적인 관리와 모니터링이 필요하다.

클러스터의 상태를 효과적으로 관리하려면 kubectl 명령어와 대시보드를 능숙하게 활용해야 한다. kubectl get nodes 명령어로 모든 노드의 상태를 정기적으로 점검하고, kubectl describe node <노드명>을 통해 자원 사용량(CPU, 메모리)과 포드 스케줄링 상태를 확인한다. 리소스 요청(request)과 제한(limit)을 포드의 매니페스트에 명시적으로 정의하는 것은 과도한 자원 소비로 인한 노드 장애를 방지하는 핵심 방법이다. 또한, 사용하지 않는 포드, 서비스, ConfigMap 등을 정리하여 클러스터를 깨끗하게 유지한다.

버전 관리와 업그레이드 전략도 운영의 중요한 부분이다. 프로덕션 환경에서는 롤링 업데이트 전략을 사용하여 애플리케이션의 무중단 업데이트를 보장해야 한다. Kubernetes 클러스터 자체의 마이너 버전 업그레이드는 공식 문서의 권장 절차를 따르며, 특히 컨트롤 플레인 구성 요소의 업그레이드 순서를 준수한다. 모든 중요한 변경 사항(예: 매니페스트 파일, 헬름 차트 값)은 Git과 같은 버전 관리 시스템에 저장하여 변경 이력을 추적하고 필요 시 롤백할 수 있도록 한다.

운영 영역

주요 팁

관련 리소스/명령어

상태 모니터링

노드, 포드 상태 정기 점검, 리소스 요청/제한 설정

kubectl get nodes, kubectl top node/pod, 메트릭 서버

자원 관리

사용하지 않는 리소스 정리, 네임스페이스 활용

kubectl delete, 네임스페이스, 리소스 쿼터

업데이트 관리

롤링 업데이트 활용, 클러스터 버전 업그레이드 계획 수립

Deployment 전략, kubectl drain, kubectl upgrade

구성 관리

매니페스트 파일의 버전 관리, 백업 정책 수립

Git, etcd 백업

마지막으로, 재해 복구를 위한 계획을 수립하는 것이 좋다. etcd 클러스터의 정기적인 백업은 클러스터 상태를 복원하는 데 필수적이다. 중요한 애플리케이션의 매니페스트와 퍼시스턴트볼륨 데이터도 별도로 백업한다. 테스트 환경을 운영 환경과 최대한 유사하게 구성하여 변경 사항을 먼저 적용해 보는 것이 안전한 운영에 도움이 된다.

10. 관련 문서

  • Kubernetes 공식 문서 - 한국어

  • 위키백과 - 쿠버네티스

  • Google Cloud - 쿠버네티스 엔진이란?

  • Red Hat - 쿠버네티스란?

  • Microsoft Learn - Kubernetes 기본 사항

  • IBM - 쿠버네티스 튜토리얼

  • AWS - Amazon EKS란?

  • 네이버 클라우드 플랫폼 - Container Registry & Kubernetes Service 소개

  • NHN Cloud - Kubernetes Service 소개

리비전 정보

버전r1
수정일2026.02.13 22:20
편집자unisquads
편집 요약AI 자동 생성
히스토리로 돌아가기