[쿠버네티스] PART1. 쿠버네티스 첫걸음
목차
1. 쿠버네티스의 등장
01. 컨테이너 환경으로의 진화
IT환경의 진화
- 1990년대 IT 시스템은 다른 프로그램에 서비스를 요청하는 클라이언트와 응답하는 서버로 구성된 클라이언트/서버 형태
- 이후 서버의 안정성을 위해 도입된 메인프레임은 중앙집중식으로 시스템을 운영
- 2000년대에 접어들며 가상화 환경 등장
- 가상화 환경은 인프라 확장할 때 스케일 아웃(scale out) 방식 사용하고, 메인프레임은 스케일 업(scale up)방식으로 확장
스케일 아웃 : 기존 서버와 같은 사양 또는 비슷한 사양의 '서버 대수'를 늘려서 처리 능력 향상
스케일 업 : '서버 자체 성능'을 향상시키는 것. CPU나 메모리를 추가하는 것
- 2010년대엔 퍼블릭 클라우드(public cloud)가 급부상. 내부에 자체적으로 시스템 도입하고 구축하기보다 이미 구축된 외부의 서버를 빌려서 필요할 때만 사용하는 클라우드가 주목받기 시작함
- 퍼블릭 클라우드는 제공 서비스에 따라 IaaS, PaaS, SaaS 모델로 나뉨
IaaS (Infrastructure as a Service) : 인프라만 클라우드 벤더의 장비를 빌려서 사용하는 모델
PaaS (Platform as a Service) : 개발 환경까지 클라우드 벤더가 책임지고 유지 관리
SaaS (Software as a Service) : 서비스 영역까지 클라우드 벤더가 책임지고 관리하는 모델
- 기업에서 서비스하려는 데이터와 애플리케이션의 성격에 따라 선택하는 모델은 각각 다름
- 지금처럼 경쟁이 치열한 비즈니스 환경에선 IT 부서에 더 빠르고 혁신적인 기술 요구함 → 컨테이너(container) 환경 등장
컨테이너 (container)
- 데스크톱, 기존의 IT 환경 또는 클라우드 등 어디서나 애플리케이션 및 서비스를 실행하는데 필요한 모든 요소를 포함하는 소프트웨어 패키지
- 운영 체제를 논리적인 구획(컨테이너)으로 나누고 애플리케이션을 격리된 환경에서 실행할 수 있음
- 일반적인 가상화 : 하이퍼바이저 위에 가상 머신(Virtual Machine)을 올려 사용, 컨테이너 환경에서는 하이퍼바이저 대신 도커 같은 컨테이너 런타임 위에 컨테이너를 올려 사용
- 가상화 환경과 컨테이너 환경 차이
- 일반적은 가상화 환경은 하드웨어 수준에서 가상화, 컨테이너는 운영 체제 수준에서 가상화
- 컨테이너는 운영 체제의 커널을 공유하기 때문에 상대적으로 가볍고 유연하게 운영할 수 있음
- 컨테이너화된 애플리케이션은 몇 초 내로 빠르게 실행, 가상 머신과 비교했을 때 자원을 더 적게 사용해서 하나의 시스템에서 더 많은 애플리케이션 구동
- 운영 체제를 공유해서 사용하기 때문에 패치, 업데이트 등 유지 관리와 관련한 오버헤드가 줄어든다는 장점 - 컨테이너 런타임 (container runtime)
- 컨테이너를 생성하고 실행할 수 있도록 도와주는 것
- 컨테이너 런타임으로 가장 많이 사용하는 것이 도커. 하지만 쿠버네티스에서 도커를 더 이상 지원하지 않겠다고 발표하면서 크라이오 런타임의 인기가 높아짐- 컨테이너 런타임 도구
- 컨테이너디(containerd) : 도커 사에서 개발한 오픈 소스 런타임. 컨테이너 이미지 내려받고 압축 푸는 과정부터 컨테이너 실행, 감독 과정까지 컨테이너의 전체 수명 주기를 관리하는 기능 제공
- 도커(docker) : 컨테이너디 위에 설치되는 데몬. 컨테이너를 생성하고 관리하는 데 필요한 모든 기능 제공
- 크라이오(CRI-O) : 레드햇(Redhat), 인텔(Intel), 수세(SUSE), Hyper, IBM 등의 관리자 및 커뮤니티를 중심으로 개발된 오픈 소스 런타임. 크라이오는 도커를 대체하기 위한 툴로 개발됨
- 컨테이너 런타임 도구
- 컨테이너 오케스트레이션 (container orchestration)
- 컨테이너를 효과적으로 관리하도록 도와주는 것
- 여러 시스템(노드)에 컨테이너를 분산해서 배치하거나 문제가 생긴 컨테이너를 교체하는 등 여러 역할을 맡고 있음
- 컨테이너 오케스트레이션의 대표적인 툴이 쿠버네티스(Kubernetes)
- 쿠버네티스가 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화하여 컨테이너 관리가 쉬워짐- 컨테이너 오케스트레이션 도구
- 쿠버네티스(Kubernetes) : 구글에서 개발한 오케스트레이션 툴. 기능이 가장 많고 가상화 및 퍼블릭 클라우드 등 다양한 환경에서 작동하기 때문에 널리 사용되고 있음
- 도커 스웜 (Docker Swarm) : 도커가 설치된 여러 대의 서버를 클러스터로 묶어 단일 환경으로 사용할 수 있는 툴. 설치 및 관리 쉬움
- 아파치 메소스 (Apache Mesos) : 수만 대의 시스템으로 확장할 수 있도록 설계된 오케스트레이션 툴
- 클러스터 환경에서 하둡(Hadoop), 스파크(Spark) 같은 응용 프로그램의 리소스 공유 및 분리를 유연하게 운영할 수 있음
- 컨테이너 오케스트레이션 도구
컨테이너, 도커, 쿠버네티스의 관계
- 도커는 컨테이너를 실행하는 런타임, 쿠버네티스는 다수의 컨테이너를 관리하는 툴
- 컨테이너를 실행할 때 도커는 꼭 있어야하지만, 쿠버네티스는 선택 사항
- 애플리케이션 규모가 커지고, 데이터베이스와 백엔드, 프론트엔드 등 다양한 유형의 컨테이너들이 늘어나면 관리 어려워짐
- 여러 컨테이너 애플리케이션을 다수의 시스템(노드)에 배포, 확장, 연결하는 작업을 자동화하는 등으로 관리 문제를 해결할 수 있는 것이 쿠버네티스
- 컨테이너 : 호스트 운영 체제 위에 논리적인 구획(컨테이너)을 만들고 애플리케이션을 작동시키는 데 필요한 라이브러리나 애플리케이션 등을 하나로 모아 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것, 애플리케이션을 구동하기 위한 환경
- 파드는 서로 유기적인 애플리케이션이 실행 중인 컨테이너의 집합
02. 쿠버네티스를 학습하기 전에 알아두면 좋은 개념
- 데브옵스의 성숙화, 마이크로서비스 아키텍처로의 변화가 이루어지며 쿠버네티스가 일반적으로 사용될 수 있었음
데브옵스
- 개발(development)과 운영(operation)을 결합해 탄생한 개발 방법론
- 시스템 개발자와 운영자의 소통, 협업, 통합 및 자동화를 강조하는 소프트웨어 개발 방법론 또는 문화
- 개발자와 운영자의 협업을 강조해 빠른 개발과 배포, 운영의 합의점을 찾아 비즈니스의 변화에 발맞춰 나아감
- 데브옵스와 CI/CD 방법론을 이용해 빠르게 애플리케이션을 개발하고 배포할 수 있도록 도와주는 것이 쿠버네티스
모놀리식 아키텍처와 마이크로서비스 아키텍처
- 아키텍처는 어떤 방식으로 개발해야 하는지에 대한 가이드라인과 같은 역할
- 컨테이너 기반의 애플리케이션으로 전환하고 싶다면 개발 아키텍처부터 변경해야 함
- 애플리케이션 개발 아키텍처로는 모놀리식 아키텍처와 마이크로서비스 아키텍처가 있음
- 모놀리식 아키텍처 (Monolithic Architecture)
- 전통적인 애플리케이션 아키텍처를 지칭하는 의미
- 모든 모듈이 하나의 덩어리로 구성된 서비스 또는 애플리케이션
- 모듈끼리 서로 의존하는 성질이 강해서 모듈의 작은 변화라도 전체 애플리케이션에 영향을 미칠 수 있음 - 마이크로서비스 아키텍처 (Microservice Architecture)
- 모듈들이 모두 분리되어 API로 통신하는 서비스 혹은 애플리케이션
- 각각의 모듈들이 개별적으로 분리되어 있어서 하나의 모듈을 변경한다고 해도 전체 애플리케이션에 영향을 주지 않는 장점
- 유지 보수가 편리하며 비즈니스 변화에 능동적으로 대처할 수 있음
- 이처럼 모듈별로 쪼개진 마이크로서비스 아키텍처에서는 더 이상 전통적 환경(서버/클라이언트)이나 가상화 환경에 애플리케이션을 구축할 필요가 없어짐
- 상대적으로 가벼워진 애플리케이션은 이제 컨테이너 환경에서 배포가 가능해짐
CI/CD
- 데브옵스를 가능하게 하는 개발 방법론
- CI (Continuos Intergration, 지속적 통합)는 데브옵스의 소프트웨어 개발 방식 중 하나, 지속적으로 통합하되 사람이 개입하는 것이 아니라 젠킨스 같은 툴을 사용해 자동으로 통합함
- CD (Continous Deployment 지속적 배포) 역시 지속적 통합과 마찬가지로 데브옵스의 소프트웨어 개발 방식, 애플리케이션(프로그램)에 변경 사항이 발생하면 이에 대한 오류가 있는지 테스트한 후 프로그램을 리포지터리에 업로드하고, 마지막으로 운영 환경에 자동으로 배포함, 이때 운영 환경에 자동으로 배포할 수 있는 ArgoCD 같은 자동화 툴 이용
03. 쿠버네티스 이해하기
쿠버네티스
- 컨테이너 기반의 애플리케이션을 개발하고 배포할 수 있도록 설계된 오픈 소스 플랫폼
- 하나의 애플리케이션을 생성하기 위해서는 하나 이상의 파드(pod)가 필요함
- 파드는 쿠버네티스에서 생성할 수 있는 가장 작은 배포 단위이면서 단일 혹은 다수의 컨테이너를 포함함
- 파드 외에 서비스(service), 볼륨(volume), 네임스페이스(namespace) 등을 묶어서 오브젝트(object)라고 부름
- 쿠버네티스에서 상태 관리가 필요한 대상이라고 이해하면 됨
- 쿠버네티스는 다음과 같은 대상들의 상태를 관리함
파드 : 쿠버네티스의 가장 기본적인 배포 단위
서비스 : 배포한 파드를 외부에서 접근할 수 있게 함
네임스페이스 : 쿠버네티스 클러스터의 논리적인 분리 단위
볼륨 : 컨테이너의 파일을 저장하고 컨테이너 간 파일을 공유할 수 있는 저장소
(그림)
- 파드는 쿠버네티스에서 가장 기본적인 배포 단위이면서 하나 이상의 컨테이너를 포함함
- 쿠버네티스의 특징 중 하나는 컨테이너를 개별적으로 하나씩 배포하는 것이 아니라 유사한 역할을 하는 컨테이너를 파드라는 단위로 묶어서 배포한다는 것
- 도커 런타임이 설치된 환경에서 컨테이너 혹은 도커를 실행, 유지 및 관리하는 것을 워커 노드라고 함
- 예를 들어 리눅스 위에 도커 엔진을 설치하고 그 위에 하나 이상의 컨테이너가 포함된 파드를 실행함. 이때 각 컨테이너에서는 그 목적에 맞는 서비스가 실행됨
- 쿠버네티스는 기본적으로 마스터 노드 1대와 워커 노드 1대로 구성됨
- 마스터 노드는 전체 쿠버네티스 환경을 관리하며, 워커 노드는 컨테이너를 실행하고 관리함
- 워커 노드의 자원(CPU, 메모리 등) 사용률이 높을 때에는 워커 노드의 개수를 늘릴 수도 있음
- 워커 노드의 개수와 상관없이 마스터 노드와 워커 노드로 구성된 쿠버네티스를 하나의 클러스터라고 부름
쿠버네티스의 특징
- 쿠버네티스를 사용하지 않고는 수많은 컨테이너를 관리하기 힘듦
- 쿠버네티스를 사용하면 다음의 효과를 얻을 수 있음
- 무중단 서비스
- 서비스 중단 없이 애플리케이션을 업그레이드할 수 있어서 안정적으로 서비스를 제공할 수 있음 - 클라우드 벤더 종속성 해결
- 특정 클라우드 벤더에 종속되어 있지 않기 때문에 제품의 호환성 문제인 락인 현상이 없음
- 다른 오픈 소스 제품 혹은 상용 제품과의 호환성도 뛰어남 - 효율적인 자원 사용
- 파드가 사용할 수 있는 자원(CPU, 메모리 등)을 사전에 지정할 수 있어서 시스템(노드)의 전체 자원을 관리 가능
- 따라서 자원을 효율적으로 사용할 수 있음 - 유연한 확장성
- 파드의 자원 사용률에 따라 파드의 개수를 늘리거나 줄일 수 있음 - 애플리케이션 개발의 단순화
- 컨테이너 환경에서는 오류 발생시 이전 환경으로 복구하거나 기존 환경은 그대로 두고 자바 버전을 업그레이드한 새로운 컨테이너를 띄우면 되므로 개발이 편리해짐 - 애플리케이션 배포의 가속화
- 인프라 구성에 대한 정보 없이도 컨테이너화된 애플리케이션을 손쉽게 배포할 수 있음
2. 쿠버네티스 기본 개념
01. 쿠버네티스 아키텍처
쿠버네티스 구조
- 쿠버네티스 클러스터
- 쿠버네티스의 여러 리소스를 관리하기 위한 집합체
- 마스터 노드와 워커 노드를 이용해 하나의 쿠버네티스 클러스터를 구성할 수 있음 - 마스터 노드
- 쿠버네티스 클러스터 전체를 관리하는 시스템
- 컨트롤 플레인(control plane)이라고도 함 - 워커 노드
- 마스터 노드에 의해 명령을 받아 파드를 생성하고 서비스한다고 해서 컴퓨팅 머신(computing machine)이라고도 함 - 컨테이너 런타임
- 파드를 실행하는 엔진
- 대표적으로 도커가 있으며, 그 밖에도 컨테이너디, 크라이오 등이 런타임 엔진으로 많이 사용되고 있음 - 영구 스토리지
- 파드는 기본적으로 휘발성
- 워커 노드에 떠 있는 파드가 삭제되면 파드 안의 모든 데이터도 즉시 삭제됨
- 데이터베이스 같은 중요한 데이터는 파드 외부에 있는 영구 스토리지 (워커 노드의 D 드라이브나 데이터 저장 용도의 전용 스토리지 등)에 저장해두어야함
- CSI (Container Storage Interface)로 외부 스토리지를 파드에 연결할 수 있음
쿠버네티스 컴포넌트
- 마스터 노드에는 클러스터를 유지하고 제어하기 위한 다양한 컴포넌트가 있음
- 워커 노드에는 애플리케이션을 실행하기 위한 컴포넌트들이 있음
- kubectl create -f deployment.yaml 명령어를 실행한 뒤 파드가 생성되는 과정에 따라 컴포넌트의 역할을 설명함
yaml 파일
- 쿠버네티스는 새로운 파드를 배포할 때 yaml 파일을 작성해 실행하고 관리함
- 이러한 yaml 파일들을 매니페스트(manifest)라고 함
- 쿠버네티스 오브젝트를 생성하는 데 필요한 메타 정보를 yaml(혹은 JSON형식도 가능) 파일로 만들어 관리함
1. API 서버
- API 서버(kube-apiserver)는 쿠버네티스 클러스터의 API를 사용할 수 있게 해주는 프로세스
- 클러스터로 요청이 들어왔을 때 그 요청이 유효한지 검증함
- 가장 먼저 사용자를 인증함. 클러스터에 접속할 권한이 있는 사용자인지를 검증함
- 사용자가 보낸 명령어를 검증함. 문법, 철자가 맞는지 등등
- 사용자의 요청에 따라 파드를 생성함. API 서버가 워커 노드에 파드를 생성하도록 요청했지만 아직 생성은 안됨
2. etcd
- API 서버는 파드를 만든다는 사실을 etcd에 알리고 사용자에게 파드가 생성되었음을 알림
- etcd는 클러스터의 상태를 저장함
- 클러스터에 필요한 정보, 파드와 같은 리소스들의 상태 정보가 담겨 있는 곳
- 이 정보들은 키-값(key-value) 형태로 저장됨
- 사용자에게 파드가 생성되었음을 알렸지만, 내부적으로는 파드가 생성되지 않음
3. 스케줄러
- 파드를 위치시킬 적당한 워커 노드를 확인하고 API 서버에 이 사실을 알림
- API 서버는 etcd에 해당 정보(어떤 워커 노드에 파드가 생성될지에 대한 정보)를 저장함
- 파드를 어떤 노드에 할당해야 할지를 결정, 워커 노드의 리소스 사용량(CPU나 메모리 등의 사용량)을 참조해 결정
4. kubelet
- API 서버는 파드가 생성될 워커 노드에 있는 kubelet에 파드의 생성 정보를 전달함
- kubelet은 해당 정보를 이용해 파드를 생성함
- kubelet은 클러스터의 각 노드에서 실행되는 에이전트, 파드에서 컨테이너의 동작(생성 및 운영)을 관리함
- 파드를 생성했다면 kubelet은 다시 API 서버에 생성된 파드의 정보를 전달하고 API 서버는 다시 etcd를 업데이트 함
- 최종적으로 어떤 워커 노드에 어떤 파드가 생성되었는지 etcd에 저장하게 됨
5. 컨트롤러 매니저
- kube-controller-manager와 cloud-controller-manager 두가지 유형이 있음
- kube-controller-manager
- 다양한 컴포넌트의 상태를 지속적으로 모니터링하는 동시에 실행 상태를 유지하는 역할을 함
- 컨트롤러 매니저가 특정 워커 노드와 통신이 불가능하다고 판단되면 해당 노드에 할당된 파드를 제거하고 다른 워커 노드에서 파드를 생성해 서비스가 계속되도록 함 - cloud-controller-manager
- EKS, AKS 같은 퍼블릭 클라우드에서 제공하는 쿠버네티스와 연동되는 서비스들을 관리함
6. 프록시 (kube-proxy)
- 클러스터의 모든 노드에서 실행되는 네트워크의 프록시
- 노드에 대한 네트워크의 규칙을 관리하기 때문에 클러스터 내부와 외부에 대한 통신을 담당함
7. 컨테이너 런타임
- 컨테이너 실행을 담당함
- 다양한 종류의 런타임을 지원
- 많이 사용하는 도커(쿠버네티스 1.20 버전부터 도커는 지원 중단)부터 컨테이너디, 크라이오 등이 있음
02. 쿠버네티스 컨트롤러
- 쿠버네티스 컨트롤러는 파드를 관리하는 역할을 함
- 쿠버네티스에서 제공하는 컨트롤러는 다음 그림과 같이 데몬셋, 디플로이먼트, 레플리카셋, 스테이트풀셋, 잡, 크론잡, 레플리케이션 컨트롤러가 있음
- 용도에 따라 선택적으로 컨트롤러 사용
디플로이먼트 (Deployment)
- 쿠버네티스에서 상태가 없는(stateless) 애플리케이션을 배포할 때 사용하는 가장 기본적인 컨트롤러
- 레플리카셋의 상위 개념이면서 파드를 배포할 때 사용
- 파드를 배포할 때 다양한 방법을 지원해서 배포할 때 세밀한 조작이 가능함
- 디플로이먼트는 다음과 같은 형식의 매니페스트 사용
apiVersion : apps/v1 # 쿠버네티스의 apps/v1 API를 사용
kind : Deployment # Deployment 작업으로 명시
metadata :
name : deploy-test # 디플로이먼트 이름 설정
labels :
app : deploy-test # 디플로이먼트 레이블 설정
spec :
replicas : 3 # 파드의 개수 설정으로 기본값은 1
selector : # 어떤 레이블의 파드를 선택해 관리할지 설정하는 부분, 여기서는 deploy-test라는 레이블의 파드를 관리하겠다는 의미
matchLabels :
app : deploy-test
template :
metadata : # 어떤 파드를 실행할지 설정하는 부분, 여기서는 deploy-test라는 레이블의 파드를 실행하겠다는 의미
labels :
app : deploy-test
spec : # 컨테이너에 대한 설정 (컨테이너 이름, 이미지, 포트 정보 등을 설정)
containers :
- name : deploy-test
image : nginx:latest
ports :
- containerPort : 80
레플리카셋 (ReplicaSet)
- 몇 개의 파드를 유지할지 결정하는 컨트롤러
- 예를 들어 5개의 파드를 유지하도록 설정했다면 1개의 파드가 삭제되었다 해도 5개의 파드를 유지하기 위해 또 다른 파드 1개를 생성함
apiVersion : apps/v1 # 쿠버네티스의 apps/v1 API를 사용
kind : ReplicaSet # ReplicaSet 작업으로 명시
metadata :
name : replica-test # 레플리카셋셋 이름 설정
spec :
template :
metadata : # 어떤 파드를 실행할지에 대한 정보
name : replica-test # 생성될 파드의 이름
labels :
app : replica-test
spec : # 컨테이너에 대한 설정
containers :
- name : replica-test
image : nginx
ports :
- containerPort : 80
replicas : 3 # 몇 개의 파드를 유지할지 설정, 기본값은 1
selector : # 어떤 레이블의 파드를 선택할지 설정, 여기서는 replica-test 레이블을 갖는 파드를 선택
matchLabels :
app : replica-test
- 레플리카셋과 유사한 기능을 가진 레플리케이션 컨트롤러 (Replication Controller)
- 특정 파드의 개수를 유지하는 기능은 같지만 다음과 같은 차이점이 있음(최근 레플리케이션 컨트롤러는 잘 사용하지 않는 추세)
구분 | 레플리카셋 | 레플리케이션 컨트롤러 |
셀렉터 (Selector) |
집합 기반으로 in, not in, exists 같은 연산자를 지원함 | 등호 기반으로 레이블을 선택할 때 =, !=와 같이 같은지, 다른지만 비교함 |
롤링 업데이트 (rolling-update) |
롤링 업데이트를 사용하려면 디플로이먼트를 이용해야 함 | 롤링 업데이트 옵션을 지원함 |
롤링 업데이트
- 기존에 배포된 애플리케이션(파드)을 수정해 재배포할 때, 새 버전의 애플리케이션이 포함된 파드는 하나씩 늘리고 이전 버전의 애플리케이션이 포함된 파드는 줄여가는 방식
잡 (Job)
- 하나 이상의 파드를 지정하고 지정된 수의 파드가 성공적으로 실행되도록 함
- 노드의 하드웨어 장애나 재부팅 등으로 파드가 비정상적으로 작동하면(혹은 실행되지 않으면) 다른 노드에서 파드를 시작해 서비스가 지속되도록 함
apiVersion : batch/v1 # 쿠버네티스의 batch/1 API를 사용
kind : Job # Job 작업으로 명시
metadata :
name : job-test # 잡 이름 설정
spec : # 실행할 컨테이너 설정
template :
metadata :
name : job-test
spec :
containers :
- name : job
image : busybox # 컨테이너 생성에 사용할 이미지
command : ["echo", "job-test"] # 컨테이너에서 실행할 명령어
restartPolicy : Never # 파드의 재시작 정책을 설정, Never는 재시작을 하지 않겠다는 의미
크론잡 (CronJob)
- 잡의 일종으로 특정 시간에 특정 파드를 실행시키는 것과 같이 지정한 일정에 따라서 잡을 실행시킬 때 사용
- 주로 애플리케이션 프로그램, 데이터베이스와 같이 중요한 데이터를 백업하는 데 사용
apiVersion : batch/v1 # 쿠버네티스의 batch/1 API를 사용
kind : CronJob # CronJob 작업으로 명시
metadata :
name : cron-test
spec :
schedule : "*/1****" # 잡이 실행될 주기, 여기서는 1분마다 실행되도록 설정
jobTemplate : # 실행될 크론잡의 설정
spec :
containers :
- name : cron-test
image : busybox
args :
- /bin/sh
- -c
- date; echo Hello this is Cron test
restartPolicy : Never
데몬셋 (DaemonSet)
- 디플로이먼트처럼 파드를 생성하고 관리
- 디플로이먼트가 실행해야 할 파드의 개수와 배포 전략을 세분화해 조작할 수 있다면, 데몬셋은 특정 노드 또는 모든 노드에 파드를 배포하고 관리
- 주로 노드마다 배치되어야 하는 성능 수집 및 로그 수집 같은 작업에 사용됨
apiVersion : apps/v1 # 쿠버네티스의 apps/1 API를 사용
kind : DaemonSet # DaemonSet 작업으로 명시시
metadata :
name : daemonset-test # 데몬셋 이름 설정
labels :
app : daemonset-test # 데몬셋을 식별할 수 있는 레이블을 지정
spec :
selector :
matchLabels : # 어떤 레이블의 파드를 선택할지 지정
app : daemonset-test
template :
metadata :
labels :
app : daemonset-test
spec :
tolerations :
- key : node-role/master
effect : NoSchedule
containers :
- name : busybox
image : busybox
args :
- sleep
- "10000"
03. 쿠버네티스 서비스
- 파드는 쿠버네티스 클러스터 안에서 옮겨 다니는 특성이 있음
- 파드가 실행 중인 워커 노드에 문제가 생기면 다른 워커 노드에서 파드가 다시 생성될 수 있고 그때마다 IP가 변경되는 특성이 있음
- 이 과정에서 워커 노드가 변경되기도 하고 파드 IP가 변경되기도 함
- 동적으로 변하는 파드에 고정된 방법으로 접근하기 위해 사용하는 것이 서비스
- 서비스를 사용하면 파드가 클러스터 내의 어디에 떠 있든지 고정된 주소를 이용해 접근할 수 있음
- 클러스터 외부에서 파드에 접근 가능
- 쿠버네티스 서비스는 다음과 같은 유형이 있음
- 클러스터IP (ClusterIP)
- 같은 클러스터 내부에서는 파드들이 통신할 방법을 제공
- 클러스터 내의 모든 파드가 해당 클러스터 IP 주소로 접근할 수 있음 - 노드포트 (NodePort)
- 서비스(홈페이지 등)를 외부로 노출 할 때 사용
- 노드포트로 서비스를 노출하기 위해 워커 노드의 IP와 포트를 이용함 - 로드밸런서 (LoadBalancer)
- 주로 퍼블릭 클라우드에 존재하는 로드밸런서에 연결하고자 할 때 사용
- 사용자는 로드밸런서의 외부 IP (external IP)를 통해 접근
04. 쿠버네티스 통신
- 쿠버네티스에서 통신할 때 나타나는 몇가지 특징
- 파드가 사용하는 네트워크와 호스트(노드)가 사용하는 네트워크는 다름
- 노드 내의 파드들은 가상의 네트워크(파드 및 컨테이너가 사용하는 네트워크)를 사용
- 호스트는 물리 네트워크(마스터 및 워커 노드가 사용하는 네트워크)를 사용 - 같은 노드에 떠 있는 파드끼리만 통신할 수 있음
- 같은 노드에 떠 있는 파드끼리는 통신이 가능하지만, 다른 노드의 파드 또는 외부와의 통신은 불가능 - 다른 노드의 파드와 통신하려면 CNI 플러그인이 필요함
- CNI(Container Network Interface) : 컨테이너 간의 통신을 위한 네트워크 인터페이스
- 플러그인(Plugin)은 컴퓨터에 추가 프로그램을 설치해 특정 기능을 수행할 수 있게 만드는 소프트웨어
- CNI 플러그인은 컨테이너들의 네트워크를 연결하거나 삭제하며, 특히 삭제할 땐 할당된 자원을 제거함
- 별도로 설치해야함
같은 파드에 포함된 컨테이너 간 통신
- 같은 파드 내에 있는 컨테이너 간의 통신은 직접 통신(로컬 호스트 통신)이 가능
- 파드내에 존재하는 컨테이너들은 같은 가상 네트워크를 사용하기 때문
- 하나의 파드 내에 존재하는 컨테이너들은 모두 동일한 IP를 사용함
- 포트번호로 컨테이너를 구분함
단일 노드에서 파드 간 통신
- 단일 노드에 떠 있는 파드들은 같은 대역을 사용하므로 브리지를 통해 서로 통신함
다수의 노드에서 파드 간 통신
- 다수 노드에 떠 있는 파드 간의 통신은 혼란스러운 상황 발생 가능 (두 파드의 IP가 같은 경우)
→ 오버레이 네트워크로 문제 해결
- 오버레이 네트워크 : 노드에서 사용하는 물리적인 네트워크 위에 가상의 네트워크를 구성하는 것
- 오버레이 네트워크를 사용하면 쿠버네티스 클러스터로 묶인 모든 노드에 떠 있는 파드 간의 통신이 가능해짐
- 쿠버네티스는 기본적으로 쿠버넷(kubenet)이라는 기본적이고 간단한 네트워크 플러그인을 제공하지만 다수의 노드에 떠 있는 파드 간의 통신이나 네트워크 정책 설정 같은 고급 기능은 CNI의 스펙을 준수하는 네트워크 플러그인을 사용해야 함
플라넬(Flannel)
- 쿠버네티스와 함께 사용할 수 있는 오버레이 네트워크 플러그인
파드와 서비스 간의 통신
- 서비스의 특성
- 서비스도 파드처럼 IP를 가짐
- 파드와 서비스에서 사용하는 IP 대역은 다름
- 서비스에서 사용하는 가상 네트워크는 ifconfig나 라우팅 테이블에서 확인할 수 없음
- 리눅스 커널에서 제공하는 netfilter와 iptables 덕분에 서비스IP로 Web Server 파드 찾아갈 수 있음
- netfilter : 규칙 기반의 패킷 처리 엔진. 서비스 IP를 특정 IP로 변경할 수 있는 규칙을 저장하고 변환하는 역할
외부와 서비스 간 통신
- 서비스는 기본적으로 클러스터 내부적으로만 통신할 수 있게끔 설계됨
- 외부와 통신할 수 있게 서비스 유형을 제공하고 있음
- 노드포트(NodePort)
- 노드 IP(eth)에 포트를 붙여서 외부에 노출시키는 것 - 로드밸런서(LoadBalancer)
- AWS, 애저, GCP와 같은 퍼블릭 클라우드에서 지원하는 쿠버네티스 로드밸런서 장비를 사용함
- 클라우드에서 제공하는 로드밸런서와 파드를 연결한 후 로드밸런서 IP를 이용해 클러스터 외부에서 파드에 접근할 수 있도록 해줌 - 인그레스(Ingress)
- 클러스터 외부에서 내부로 접근하는 요청들을 어떻게 처리할지에 관한 규칙 모음
- 인그레스 자체는 클러스터 외부에서 URL로 접근할 수 있도록 로드밸런싱, SSL 인증서 처리 등의 규칙을 정의한 것에 불과하며 실제로 동작시키는 것은 인그레스 컨트롤러(Ingress-Controller)