2. 알아야 할 배경 지식(1) 애플리케이션 실행 환경의 변화
이미지 출처: kubernetes.io
3. 알아야 할 배경 지식(2-1) 컨테이너 기술
! 프로세스 단위의 격리 환경
! 호스트 커널을 공유하고 애플리케이션을 실행하기 위한 라이브러리와 파일만 존재
! VM에 비해 사이즈가 작아 배포가 빠르고, 성능 손실이 거의 없다
! 다양한 컨테이너 런타임 기술 중 도커(Docker)가 사실상 표준
4. 알아야 할 배경 지식(2-2) 도커 이미지와 컨테이너
! 도커 이미지
○ 컨테이너를 실행하기 위해 필요한 모든 파일들을 캡슐화한 패키지
○ `Dockerfile`을 기반으로 각 단계마다 레이어(Layer)로 구성되며,
각 레이어는 이전 레이어를 상속한다
○ 각 레이어는 읽기 전용이며, 컨테이너가 실행되면 마지막에 쓰기 레이어 추가
! 도커 컨테이너
○ 1개의 컨테이너에는 1개의 프로세스를 실행하는 것이 원칙 (PID 1)
○ 컨테이너를 종료하면 쓰기 레이어도 사라진다
5. 알아야 할 배경 지식(2-3) Dockerfile
# Dockerfile
FROM python:slim-buster
ENV PYTHONPATH /bar
ENV HOME /usr/src/app
WORKDIR ${HOME}
COPY server.py ${HOME}/server.py
CMD ["python", "server.py"]
읽기 전용 레이어
쓰기 가능 레이어
$ docker build -t [저장소 이름]/[이미지 이름]:[태그] .
6. 알아야 할 배경 지식(2-3) 도커 컨테이너로 서비스를 한다는 것은
! 하나의 도커 이미지 안에 서비스 운영에 필요한 모든 것들이 들어있다
! 서비스 운영 환경과 개발 환경의 느슨한 결합
! 쉽고 빠른 배포
! 시스템 의존성을 쉽게 업그레이드
! 확장이 쉽다 (스케일 아웃)
! 효율적인 시스템 자원 활용 (CPU limit / Memory limit)
! 가상 머신(vm)보다 나은 성능
7. 알아야 할 배경 지식(3) 컨테이너화된 애플리케이션 관리 문제
아… 또 컨테이너 맛이 갔네
계속 보고 있을 수도 없고…
직접
재실행
용사님
일어나세요
8. 쿠버네티스란 무엇인가?
쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식할 수 있고,
확장 가능한 오픈소스 플랫폼으로, 선언적 구성과 자동화를 모두 지원한다.
쿠버네티스는 크고 빠르게 성장하는 생태계를 가지고 있다.
출처: kubernetes.io
9. 쿠버네티스란 무엇인가?
! 컨테이너화된 애플리케이션을 실행하고, 관리하는 역할
! 요구하는 애플리케이션 상태를 나타내는 선언형 정의
! 애플리케이션의 현재 상태와 요구한 상태를 일치 시켜주는 역할
! 애플리케이션의 운영자 책임과 클러스터 운영자의 책임 분리
10. 쿠버네티스가 하지 않는 것들
! Platform as a Service(PaaS)가 아니다
! 배포, 스케일링, 로드 밸런싱, 로깅, 모니터링 등의 기능을 제공할 수 있지만,
선택적으로 사용한다
! CI/CD를 위한 플랫폼이 아니다
즉, 소스 코드를 배포하지 않으며 애플리케이션을 빌드하지 않는다
! 머신(서버)의 설정, 유지보수, 자동 복구 시스템을 제공하지 않는다
! 단순한 오케스트레이션 시스템이 아닌 독립적이고 조합 가능한 제어 프로세
스들로 구성된다
12. 쿠버네티스 클러스터 - 컨트롤 플레인
! etcd
○ 쿠버네티스 클러스터의 모든 데이터를 담
고 있는 Key-Value 저장소
! kube-api-server
○ 쿠버네티스 클러스터의 허브로서 클라이
언트와 etcd에 저장된 데이터 사이의 상
호 작용을 중개
○ 사용자(운영자), 클러스터 내 구성 요소,
외부 컴포넌트가 서로 통신할 수 있는
HTTP API 제공
13. 쿠버네티스 클러스터 - 컨트롤 플레인
! kube-scheduler
○ 새로운 POD를 어떤 워커 노드에 실행 시
킬지 선택하는 역할
! kube-controller-manager
○ API 서버를 통해 클러스터의 다양한 컴포
넌트들의 상태를 감지하고, 원하는 상태로
만드는 역할
○ 다양한 컨트롤러가 하나로 패키징되어 단
일 프로세스 내에서 실행된다
14. 쿠버네티스 클러스터 - 워커 노드
! kubelet
○ 모든 워커 노드에서 실행되는
에이전트
○ 컨테이너를 생성, 삭제하고 상
태를 모니터링, 마스터 노드와
통신을 담당
! kube-proxy
○ 모든 워커 노드마다 실행되는
네트워크 프록시
○ 다른 POD 간의 네트워크 통신
과 클러스터 바깥에서 POD로
네트워크 통신을 할 수 있게
15. 쿠버네티스 오브젝트 - POD
! 쿠버네티스에서 가장 작은 기본 실행 단위
! 1개 이상의 컨테이너로 구성된 컨테이너의 집합
! POD 안에 모든 컨테이너는 서로 같은 네트워크
와 볼륨을 공유
! POD는 고유한 가상 IP를 할당
! POD 내부 컨테이너끼리 localhost로 통신 가능
(서로 다른 포트 사용시)
16. 쿠버네티스 오브젝트 - POD Manifest
# example_pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
app: webserver
name: example-app
spec:
containers:
- image: nginx
name: example-app
$ kubectl create -f example_pod.yaml
$ kubectl run example-app --image nginx --restart=Never
※ 매니페스트 작성 없이 바로 만들기
17. 쿠버네티스 오브젝트 - Service
! POD의 고유 IP는 바뀔 수 있다
! 클러스터 내외부에서 POD로 접근하기 위한
영속적인 방법
! 여러 POD에 쉽게 접근할 수 있도록 고유한
도메인 이름을 부여
! 여러 POD에 요청을 분산하는 로드 밸런서 기
능 수행
! 접근 방식에 따라 ClusterIP, NodePort,
LoadBalancer 타입으로 나뉜다
;
18. 쿠버네티스 오브젝트 - ReplicaSet
! 정해진 개수(replicas) 만큼 동일한 POD
가 항상 실행되도록 관리
! 워커 노드 장애 등의 이유로 POD를 사용
할 수 없다면 다른 노드에 POD를 다시 생
성
! 실제 운영 환경에서 ReplicaSet으로 직접
사용하는 경우는 거의 없다
19. 쿠버네티스 오브젝트 - Deployment
! ReplicaSet의 상위 개념이지만 같은 역할
! 애플리케이션의 업데이트와 배포를 더욱
편하게 하기 위함
! ReplicaSet의 변경 사항을 저장하는
Revision을 남겨 롤백이 가능
! 무중단 서비스를 위해 POD의 롤링 업데이
트 가능