이 내용은 책 <15단계로 배우는 도커와 쿠버네티스> 중
약 ~77p까지를 요약한 것이다.
쿠버네티스: 컨테이너화 된 애플리케이션을 효율적으로 배포하고 운영하기 위해 설계된 오픈소스 플랫폼
컨테이너를 쓰는 이유1: 애플리케이션 실행에 필요한 라이브러리나 운영체제 패키지등을 모두 담아서 불변의 실행환경을 만듬. 이렇게 하면 개발자든간, 테스트와 운영 환경 간의 차이를 없앨 수 있음.
컨테이너를 쓰는 이유2
1. 인프라의 사용률 향상
2. 빠른 기동 시간
3. 불변 실행 환경
쿠버네티스는 크게 4가지의 기능 제공
쿠버네티스의 아키텍처: 클러스터 관리를 담당하는 마스터와 컨테이너화된 애플리케이션을 실제로 실행하는 노드 단 두 종류의 서버로 구성
가상 서버(ex VMWare)와 비교했을때 컨테이너는 경량, 빠른 기동, 이식성의 장점을 가진다.
도커는 도커 데몬 서버와 클라이언트인 도커 커맨드, 그리고 이미지의 보관소인 레지스트리로 구성된다.
(1) 도커 데몬: 클라이언트인 도커 커맨드의 명령을 받아들여서 도커 오브젝트인 이미지, 컨테이너, 볼륨, 네트워크등을 관리
(2) 도커 클라이언트: 컨테이너를 조작하는 커맨드라인유저 인터페이스로 도커 데몬의 클라이언트다. 도커 api를 사용하여 도커 데몬의 요청을 보낸다.
(3) 이미지: 읽기 전용인 컨테이너의 템플릿, 컨테이너를 기동하기 위한 실행 파일과 설정 파일의 묶음,컨테이너를 실행하면 이미지에 담긴 미들웨어나 애플리케이션이 설정에 따라 기동.
(4) 컨테이너: 하나의 프로세스, 정확히는 '실행 가능한 이미지의 인스턴스'
(5) 도커 레지스트리: 컨테이너의 이미지가 보관되는 곳
레지스트리와 리포지터리의 차이
레지스티리: 리포지터리를 여러개 가지는 보관 서비스
리포지터리: 하나의 이미지에 대해 태그를 사요하여 다양한 출시 버전을 함께 보관
퍼블릭 레지스트리: 누구나 이용할 수 있도록 공개된 레지스트리
클라우드 레지스트리: 퍼블릭 클라우드가 제공하는 레지스트리 서비스
비공개 레지스트리: 회사나 팀 전용으로 레지스트리를 구축하여 운영하는 경우에 해당
쿠버네티스에서 컨테이너가 동작할 때까지의 흐름을 설명하면 다음과 같음
1. docker build로 이미지를 빌드한다.
2. docker push로 이미지를 레지스트리에 등록한다.
3. kubectl커맨드로 매니페스트에 기재한 오브젝트들의 생성을 요청한다
4. 매니페스트에 기재된 리포지터리로 부터 컨테이너의 이미지를 다운로드한다.
5. 컨테이너를 파드 위에서 기동한다.
쿠버네티스는 도커를 컨테이너의 런타임 환경으로 사용함, 그래서 쿠버네티스를 설치할때 제일 먼저 도커를 설치해야함
오브젝트: k8s클러스터 내부의 엔티티로서, 파드, 컨트롤러, 서비스등의 인스턴스를 의미, 지정된 상태가 유지되도록 쿠버네티스에 의해 제어
워크로드: 오브젝트의 카테고리를 나타내는 용어로 컨테이너와 파드, 그리고 컨트롤러의 그룹을 의미
컨테이너: 쿠버네티스에서는 컨테이너를 독자적으로 실행하는 것이 불가능, 반드시 파드 내에서 실행해야한다.
파드(pod): 컨테이너를 실행하기 위한 오브젝트. 한개 혹은 여러개의 컨테이너를 담을 수있다.
컨트롤러: 파드의 실행을 제어하는 오브젝트
설정: 컨테이너 내 애플리케이션의 설정값이나 비밀번호 등의 정보된 배포된 네임스페이스로부터 취득하는 것이 좋음
서비스: 파드와 클라이언트를 연결하는 역할 수행
스토리지: 파드나 컨테이너는 실행 시에만 존재하는 일시적인 존재이기 때문에 중요한 데이터를 컨테이너의 파일 시스템에 저장해서는 안된다.
데이터를 잃지 않기 위해서는 퍼시스턴트 볼륨을 사용하여 전원이 꺼져도 데이터가 유지되는 스토리지 시스템에 데이터를 저장해야한다.
파드(Pod)는 하나의 목적을 위해 만들어진 컨테이너를 부품처럼 조합할 수 있도록 설계됨
1. 파드 내부의 컨테이너들은 파드의 ip주소와 포트번호를 공유
2. 파드의 내부 컨테이너들은 localhost로 서로 통신 가능
3. 파드의 내부 컨테이너들은 system V 프로세스 통신이나 POSIX 공유 메모리를 사용하여 서로 통신 가능
4. 파드의 내부 컨테이너들은 파드의 볼륨을 마운트하여 파일 시스템을 공유할 수 있다.
파드의 IP주소는 기동 시 부여(고정X),종료시 회수되어 다른 파드가 기동할때 사용됨. 파드에 요청을 보내고 싶은 경우에는 반드시 서비스를 사용해야함
서비스는 클라이언트로부터 요청을 지정한 파드의 그룹에 부하분산하며 전송하는 역할을 담당