728x90
<용어 정리>
- Docker: 컨테이너 가상 실행 환경을 제공해주는 대표적인 오픈소스 플랫폼
- image: 컨테이너를 덩의하는 읽기 전용 템플릿
- Dockerfile: 도커 이미지를 생성하기 위한 명세서
- Container: 애플리케이션 레벨에서 필요한 소스 코드, 라이브러리 등 모든 파일을 하나의 런타임 환경으로 패키징하는 기술
<컨테이너의 특징>
- 가상머신과 비교하여 컨테이너 생성이 쉽고 효율적
- 컨테이너 이미지를 이용한 배포와 롤백이 간단
- 언어나 프레임워크에 상관없이 애플리케이션을 동일한 방식으로 관리
- 개발, 테스팅, 운영 환경은 물론 로컬 PC와 클라우드까지 동일한 환경을 구축
- 특정 클라우드 벤더에 종속적이지 않음
<컨테이너의 기반 기술>
- namespace: 컨테이너에 대한 격리 계층을 제공
- cgroup: 애플리케이션을 특정 리소스 사용 세트(CPU, 메모리, 디스크 1/0, 네트워크 등)로 제한
<컨테이너의 장점>
- 표준화에 따른 이식성: OS 플랫폼 간 및 클라우드 간 이식 가능
- 경량화 및 민첩성: 일반 가상화에 비해 가벼워 빠른 빌드 가능
- 신속한 확장성: 같은 인프라에 더 많은 컨테이너 지원 가능 / 신속한 스케일링 지원
>> 지속적 통합 / 지속적 전달 (CI/CD) + 마이크로 서비스(MSA) / 코드형 인프라(Iaas / IaC) + 소통 및 협업 (Culture)특징으로 인해 DevOps가 컨테이너를 자주 사용
<컨테이너 실행 과정>
<일반 가상화와 컨테이너의 차이>
<쿠버네티스>
- 컨테이너 오케스트레이션: 복잡한 컨테이너 환경을 효과적으로 관리하기 위한 도구
- 쿠버네티스: 컨테이너를 쉽고 빠르게 배포 및 확장하고 관리를 자동화해주는 오픈소스 플랫폼
<쿠버네티스의 장점>
- 자동화된 스케일링 / 롤아웃과 롤백 / 복구(self-healing) / 빈 패킹
- 시크릿과 구성 관리
- 서비스 디스커버리와 로드 밸런싱
- 스토리지 오케스트레이션
- 선언적 코드를 사용한 운영(IaC)
<컨테이너 오케스트레이션의 구조>
<쿠버네티스 아키텍처>
- Control Plane (Master node): 쿠버네티스 전체를 통제 및 관리
- kube-apisever (쿠버네티스 API 서버)
- Kubernetes 클러스터의 중심 부분이며, 모든 API 호출의 진입점
- 클러스터 내부 및 외부에서 API를 통해 쿠버네티스 객체(예: 파드, 서비스, 노드 등)를 만들고 관리
- etcd
- Kubernetes 클러스터의 분산된 저장소 시스템으로, 모든 클러스터 데이터의 실제 상태를 보유
- 클러스터 구성, 상태 및 구성 요소 간의 통신에 사용
- kube-scheduler
- 새로운 pod를 실행할 node를 선택하는 책임을 가진 컴포넌트 (=pod가 어느 node에 배치될 지를 결정)
- Lable / Selector / Affinity / Taint / Toleration 기능과 함께 동작
- kube-scheduler가 없다면 pod를 manual scheduling 해주어야 함
- 머신러닝 워크로드를 돌리는 특정 pod는 GPU가 탑재된 node에서만 돌아야 함
- 소비자들은 네트워크 intensive하므로 전용 node 그룹을 쓰고 싶어 함
- 팀 별로 node를 나눠서 사용하고 싶어 함.
- 사용자가 특정 node에 pod를 배치하고 싶을 때: nodeSelector, Node Affinity, Node Anti-Affinity, Inter Pod Affinity, Inter Pod Anti-Affinity
- NodeSelector: 노드에는 라벨을 할당하고, 파드에는 nodeSelector 필드를 추가하여 특정 노드에서 구동되도록 함
- 다만, NodeSelector는 여러 값을 할당하거나 not 예외 처리를 하거나 하기에는 어려움
- Node Affinity: 여러 advanced 할당을 할 수 있는 만큼 문법이 다소 복잡
- 관리자가 특정 node에는 pod가 배치되는 것을 막고 싶을 때: Taints(node가 가지게 되는 성격), Tolerations (pod가 가지게 되는 taint에 대한 toleration)
- 어떤 pod가 어떤 node에 스케줄링 될 수 있는지 제한
- Toleratio가 있어야 Taints를 무시하고 해당 node에 pod를 생성할 수 있음
- kube-controller-manager
- 클러스터의 다양한 상태를 감시하고 제어하는 역할을 수행하는 컨트롤러들의 집합을 관리
- kube-apisever (쿠버네티스 API 서버)
- Data Plane (Worker node): 실제 사용자의 애플리케이션 배포
- kubelet (쿠브렛)
- 각 노드에서 실행되는 Kubernetes 에이전트
- 마스터 노드의 명령에 따라 노드 상태를 보고하고 파드의 상태를 관리
- 파드 스펙을 받아들이고 컨테이너화된 애플리케이션을 실행하는 주체
- 컨테이너 런타임과 상호 작용하여 파드의 컨테이너를 생성, 시작, 중지 및 모니터링
- kube-proxy
- 클러스터 내의 서비스 디스커버리와 로드 밸런싱을 관리하는 Kubernetes 네트워크 프록시
- 서비스 요청을 적절한 파드로 전달하여 클라이언트가 서비스에 액세스
- userspace > iptables > ipvs로 진화
- ipvs가 더 다양한 로드밸런싱 알고리즘을 갖고 있고, 더 높은 성능 제공
- container runtime
- 컨테이너를 실행하는 소프트웨어
- 가장 많이 사용하는 런타임으로 Docker를 주로 사용했음
- 예시
- 고수준 = containerd, CRI-O, docker
- 저수준 = runc, runv
- kubelet (쿠브렛)
- coredns (kube-dns)
- kubernetes 클러스터 내부의 주소 해석이나 서비스 디스커버리에 사용되는 내부 DNS 서버
- kube 1.12 버전 전에는 kube-dns라는 이름이었으나, 이후에는 CoreDNS로 이름 변경
'클라우드 + DevOps > Docker' 카테고리의 다른 글
내가 보려고 정리한 Docker 명령어 : 자주 사용하는 명령어 정리 (0) | 2024.05.09 |
---|---|
Docker 실습 :: 윈도우 Window에서 Docker 설치 과정 (0) | 2024.04.06 |
Docker 실습 :: Dockerfile 제작 후 이미지 생성 (0) | 2024.03.01 |
Docker 마운트 실습 :: 스토리지 드라이버 설정(--storage-opt)과 pquota 마운트 (0) | 2024.02.29 |
Docker 마운트 실습 :: 마운트를 이용한 NginX 로그 기록 관리 (1) | 2024.02.28 |