정의
Container?
- SW서비스를 실행하는 데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 중속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지
- 애플리케이션의 코드를 관련 구성 파일, 라이브러리 및 앱 실행에 필요한 종속성과 함께 번들로 제공하는 SW패키지
Hypervisor 기술과 Container 기술
Container 특징
- 쉽고 효율적인 컨테이너 이미지 생성으로 애플리케이션을 기민하게 생성, 배포할 수 있음
- 안정적, 주기적으로 컨테이너 이미지를 빌드, 배포할 수 있기 때문에 지속적인 개발, 통합 및 배포 가능
- 빌드/릴리즈 시점에 애플리케이션 컨테이너 이미지를 만들기 때문에 개발과 운영의 관심사 분리
- 애플리케이션의 헬스와 그 밖의 시그널을 볼 수 있어 가시성이 높음
- 랩탑, 클라우드에서 모두 동일하게 구동되므로 개발, 테스팅 및 운영 환경에 걸친 일관성 확보
- 주요 퍼블릭 클라우드와 어디에서든 구동되어 클라우드 및 OS 배포판 간 이식성이 높음
- 논리적 리소스를 사용하는 OS 중심으로 추상화 수준이 높아져 애플리케이션 중심 관리 가능
- 느슨하게 묶이고, 분산되고, 유연하며, 자유로운 마이크로 서비스 형태로 애플리케이션 배포, 관리
- 리소스가 격리되어 애플리케이션 성능을 예측할 수 있음
- 고휴율 고집적의 리소스 사용량
Container Engine & Container Runtime
- 컨테이너를 관리하기 위한 API나 CLI 도구를 제공하는 소프트웨어
- 컨테이너 엔진은 사용자 입력을 받고, 컨테이너 이미지를 꺼내고, 컨테이너 실행 방법을 명시한 메타데이터를 만든 다음, 컨테이너 런타임에 이 정보들을 전달
- 도커 엔진(docker0-ce), 레드햇의 파드맨, 로켓 컴퍼니의 rkt 등
- 루트 파일시스템과 메타 데이터를 받아 컨테이너를 실행하는 도구
- 가장 일반적으로 쓰이는 런타임 OCI를 준수하는 runC
- 컨테이너-디(containerd), 크라이-오(cri-o) 등도 runC에 의존
Podman
리눅스 시스템에서 컨테이너 및 컨테이너 이미지를 실행, 관리, 배포 할 수 있도록 설계된 Daemonless 컨테이너 엔진
- Podman은 Pod Manager tool의 약자
- Rootless 컨테이너와 Pod를 위한 리소스를 실행하고 분리하여 더 손쉽게 액세스 할 수 있는 컨테이너 환경을 만드는 동시에 보안 리스크를 줄일 수 있음
- OCI(Open Container Initiative)를 준수하며 Docker와 거의 대부분의 CLI Command가 동일
- 컨테이너를 관리하기 위해 RESTful API를 배포
** Daemon - 서비스 요청에 대해 응답하기 위해 오랫동안 실행중인 백그라운드 프로세스
Docker와 Podman
Daemon 존재 여부
-
Docker
-
Podman
Kubernetes
- 서비스 디스커버리와 로드 밸런싱
- 스토리지 오케스트레이션
- 자동화된 롤아웃과 롤백
- 자동호된 빈 패킹
- 자동화된 복구
- 시크릿과 구성관리
- 쿠버네티스 클러스터 구성요소
- Cluster : 컨테이너화된 애플리케이션을 실행하기 위한 일련의 노드 머신의 집합
- Master : 클러스터 전체를 컨트롤하며 내부에 있는 모든 노드를 관리하는 가상 머신
- Worker : 마스터에 의해 명령을 받고 실제 컨테이너들이 생성되고 일을 하는 가상 머신
- kube-api-server : 쿠버네티스의 모든 통신은 kube-api-server를 통해 통신
- kube-controller-manager : 파드들을 관리하는 각각의 컨트롤러를 제어하는 역할
- kube-scheduler : 리소스를 자원 할당이 가능한 노드에 할당하는 역할
- etcd : 클러스터 내의 모든 세부적인 데이터를 저장하는 키-값 저장소
- cloud-controll-manager : 컨트롤러들을 클라우드 서비스와 연결하여 관리
- kubelet : 모든 노드에서 실행되며 컨테이너 실행 및 지속적인 헬스체크를 통해 마스터의 kube-api-server와 통신을 하는 에이전트
- kube-proxy : 클러스터 내부의 가상 네트워크를 설정하여 관리
- Container Runtime Interface(CRI)
컨테이너 런타임 인터페이스는 쿠버네티스에서 다양한 컨테이너 런타임을 사용할 수 있게 해주는 API
- Pod
- 컨테이너가 직접 실행되는 장소
- 컨테이너를 돌리는 최소한의 단위
- 하나 이상의 컨테이너 그룹
- 컨테이너를 직접 관리하지 않고 파드 단위로 관리
- Service
- 클러스터 외부에서 클러스터 내부파드에 접근
- 고정된 IP주소 할당
- 파드 간의 로드 밸런싱 지원
- 하나 또는 여러 개의 포트 지원
- Ingress
- 서버 외부로부터 서버 내부로 들어오는 네트워크 트래픽을 로드밸런싱
- L7 로드밸런싱 기능을 수행
- Service에 외부 URL을 제공
- 클러스터로 접근하는 URL 별로 다른 서비스에 트래픽을 분산
- TLS/SSL 인증서 처리
- 도메인 기반의 Virtual hosting을 지정
- ReplicaSet
- 파드의 개수 유지 및 관리
- 실행되는 파드를 안정적으로 유지
- 파드 개수에 대한 가용성 보장
- Deployment
- 상태가 없는 앱을 배포할 때 사용되는 가장 기본적인 컨트롤러
- 레플리카셋을 관리
- 앱의 배포를 세밀하게 관리
- 파드 개수 유지
- 배포 시 롤링 업데이트
- StatefulSet 소개
- 동일한 컨테이너 스펙을 가진 파드들을 관리하며 각 파드들은 각각의 식별자를 가지기 때문에 독자성을 유지
- 파드들의 순서 및 고유성을 보장
- 식별자를 가지고 있어 재스케줄링 간에도 지속적인 유지
- 내부 파드마다 고유한 pvc를 갖도록 설정이 가능하여, 스케일 확장시 PV를 유지 가능
- Deployment vs StatefulSet
- 여러 파드를 지정하여 지정된 파드를 성공적으로 실행하도록 하는 설정
- 배치작업, 임시작업 등 처음 한번 실행하고 종료되는 작업에 사용
- 파드의 성공적인 완료를 보장
- 단일잡, 다중잡, 병렬잡
- JOB을 실행하는데 스케줄러 역할
- 데이터 백업, 이메일 송신 등 정해진 시간에 맞춰 반복적으로 JOB을 실행해야 할 때 사용
- 리눅스의 crontab과 비슷
- 클러스터 전체에 특정 파드를 실행할 때 사용하거나 특정 노드 또는 모든 노드에 항상 실행되어야 할 특정 파드들을 관리
- 전체 노드에서 Pod가 한 개씩 실행되도록 보장
- 로그 수집기, 모니터링 에이전트와 같이 모든 노드에 항상 실행시켜야 하는 특정 파드를 관리해야 할 때 사용
- 특정 파드와 상관없이 별도의 생명주기를 가지는 독립적인 볼륨
- 프로비저닝은 정적 방법, 동적 방법 두 가지 방법으로 생성
- PVC로부터 요청이 들어오면 요청에 맞는 PV 할당
- PV와 PVC 매핑은 1:1 관계로 바인딩
- 사용자가 PV에 하는 요청
- 파드와 PV를 연결
- 요청 시 스토리지 용량, 접근방법, 셀럭터 등 설정 가능
- PV와 PVC 매핑은 1:1 관계로 바인딩
- PV로 확보한 스토리지 종류를 정의 하는 리소스
- PV의 동적 프로비저닝일 때 사용되며 동적 프로비저닝을 활성화 하려면
하나 이상의 스토리지 클래스가 미리 생성 되어 있어야함
- 스토리지 클래스를 미리 정의하면 그에 맞는 PV를 바로 생성할 수 있음
- Provisioning : 정적 방법과 동적 방법 두 가지가 있으며 PV를 생성하는 단계
- Binding : PVC가 원하는 접근방법, 스토리지 용량 등을 요청하면 그에 맞는 PV가 연결되는 단계(맞는 PV가 없으면 대기)
- Using : 파드가 유지되는 동안 파드에서 설정된 PVC가 계속해서 사용되고 있는 단계
- Reclaiming : 사용이 끝난 PVC는 삭제되고 사용 중이던 PV는 초기화 되는 과정
- Volume 구조(정적 프로비저닝)
-
Volume 구조(동적 프로비저닝)
-
ConfigMap
- 컨테이너와 분리해서 환경설정 제공
- 키-값 형태의 설정 정보를 저장하는 일종의 저장소 역할
- 간단한 문자부터 큰 설정 파일까지 값으로 가질 수 있음
- 동일한 파드라도 여러 개의 컨피그맵을 사용할 수 있음
- 보안유지가 필요한 자격증명 및 개인 암호화 키 같은 정보를 저장 및 관리하는 역할
- Base64 인코딩으로 생성
- 키-값 형태의 설정 정보를 저장하는 일종의 저장소 역할
- 메모리에 저장됨
- 개별 시크릿의 최대 크기는 1MB까지 정의
- 모든 파드에는 자동으로 연결된 시크릿 볼륨이 존재
ConfigMap, Secret 사용 방법 소개
쿠버네티스 리소스 관리
디폴로이먼트 예시
서비스예시
yaml 파일 통합
Container Platform 도구
- IaC(Infrastructure as Code)
스크립트를 통해 인프라 및 구성 관리를 자동화 하는 방법론
- 수동 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝
- 정보 관리를 위해 별도의 인프라 세트가 필요하지 않음(Masterless)
- 물리적 환경에 대한 세부정보를 추상화 하여 중요한 코드에 집중 가능
- 비용절감
- 배포 속도 향상
- 오류 감소
- 인프라 일관성 향상
- 구성 드리프트 제거
- Terraform
HashiCorp에서 운영 중인 인프라를 손쉽게 구축하고 안전하게 변경하고,
효율적으로 인프라의 형상을 관리할 수 있는 오픈 소스 도구
- 플랫폼에 구애 받지 않음
: 다양한 클라우드 서비스들을 프로바이더 방식으로 제공(AWS, GCP, Azure 등)
- 변경 불가능 인프라
: 환경에 대한 변경 사항이 적용될 때마다 현재 구성이 변경을 반영할 수 있는 새로운 구성으로 대체되고 인프라가 다시 프로비저닝됨
- Ansible
Red Hat에서 개발 중인 프로비저닝, 구성 관리, 애플리케이션 배포, 오케스트레이션 등 여러 수동 IT 프로세스를 자동화하는 오픈소스 IT 자동화 툴
- 플레이북에 실행할 구성을 선언해 놓으면, 필요시마다 자동 실행 가능
즉, 웹서버의 구성과, DB서버의 구성을 선언해 놓으면 관리자들은 필요 할 때마다 그 구성대로 서버의 설정을 배포할 수 있음
- Vault
HashiCorp에서 제공하는 크로스플랫폼 패스워드 및 인증 관리 시스템
- UI, CLI, HTTP API 등의 인터페이스를 제공하고 있으며, 저장된 비밀 정보를 안전하게 사용할 수 있는 방법들을 제공
- Vault의 storage backend는 암호화된 데이터를 저장하기 위한 스토리지를 담당하며, 스토리지의 종류, 가용성 등을 책임지지 않음
-
Vault 구성요소 체계
-
Vault 구조
-
Ceph
오픈소스 소프트웨어 스토리지 플랫폼
-
단일 분산 컴퓨터 클러스터에 object 스토리지를 구현하고 object, block 및 file level의 스토리지 기능을 제공
-
Single point of failure이 없는 완전히 분산된 운영을 주소 목표로 하며 엑사바이트 수준으로 scale-out 가능