클라우드 + DevOps/Docker

Docker와 Kubernetes 소개 이론 정리

gamjadori 2024. 4. 5. 12:37
728x90

<용어 정리>

  • Docker: 컨테이너 가상 실행 환경을 제공해주는 대표적인 오픈소스 플랫폼
  • image: 컨테이너를 덩의하는 읽기 전용 템플릿
  • Dockerfile: 도커 이미지를 생성하기 위한 명세서
  • Container: 애플리케이션 레벨에서 필요한 소스 코드, 라이브러리 등 모든 파일을 하나의 런타임 환경으로 패키징하는 기술

 

<컨테이너의 특징>

  1. 가상머신과 비교하여 컨테이너 생성이 쉽고 효율적
  2. 컨테이너 이미지를 이용한 배포와 롤백이 간단
  3. 언어나 프레임워크에 상관없이 애플리케이션을 동일한 방식으로 관리
  4. 개발, 테스팅, 운영 환경은 물론 로컬 PC와 클라우드까지 동일한 환경을 구축
  5. 특정 클라우드 벤더에 종속적이지 않음

 

<컨테이너의 기반 기술>

  • namespace: 컨테이너에 대한 격리 계층을 제공
  • cgroup: 애플리케이션을 특정 리소스 사용 세트(CPU, 메모리, 디스크 1/0, 네트워크 등)로 제한

 

<컨테이너의 장점>

  1. 표준화에 따른 이식성: OS 플랫폼 간 및 클라우드 간 이식 가능
  2. 경량화 및 민첩성: 일반 가상화에 비해 가벼워 빠른 빌드 가능
  3. 신속한 확장성: 같은 인프라에 더 많은 컨테이너 지원 가능 / 신속한 스케일링 지원

>> 지속적 통합 / 지속적 전달 (CI/CD) + 마이크로 서비스(MSA) / 코드형 인프라(Iaas / IaC) + 소통 및 협업 (Culture)특징으로 인해 DevOps가 컨테이너를 자주 사용

 

<컨테이너 실행 과정>

<일반 가상화와 컨테이너의 차이>

 

<쿠버네티스>

  • 컨테이너 오케스트레이션: 복잡한 컨테이너 환경을 효과적으로 관리하기 위한 도구
  • 쿠버네티스: 컨테이너를 쉽고 빠르게 배포 및 확장하고 관리를 자동화해주는 오픈소스 플랫폼

<쿠버네티스의 장점>

  1. 자동화된 스케일링 / 롤아웃과 롤백 / 복구(self-healing) / 빈 패킹
  2. 시크릿과 구성 관리
  3. 서비스 디스커버리와 로드 밸런싱
  4. 스토리지 오케스트레이션
  5. 선언적 코드를 사용한 운영(IaC)

 

<컨테이너 오케스트레이션의 구조>

 

<쿠버네티스 아키텍처>

 

  1. Control Plane (Master node): 쿠버네티스 전체를 통제 및 관리
    • kube-apisever (쿠버네티스 API 서버)
      • Kubernetes 클러스터의 중심 부분이며, 모든 API 호출의 진입점
      • 클러스터 내부 및 외부에서 API를 통해 쿠버네티스 객체(예: 파드, 서비스, 노드 등)를 만들고 관리
    • etcd
      • Kubernetes 클러스터의 분산된 저장소 시스템으로, 모든 클러스터 데이터의 실제 상태를 보유
      • 클러스터 구성, 상태 및 구성 요소 간의 통신에 사용
    • kube-scheduler
      • 새로운 pod를 실행할 node를 선택하는 책임을 가진 컴포넌트 (=pod가 어느 node에 배치될 지를 결정)
      • Lable / Selector / Affinity / Taint / Toleration 기능과 함께 동작
      ** 파드 (Pod): Kubernetes에서 가장 작은 배포 단위이며, 클러스터 내에서 실행되는 하나 이상의 컨테이너 그룹
      • kube-scheduler가 없다면 pod를 manual scheduling 해주어야 함
      <pod 스케줄링의 필요성>
      • 머신러닝 워크로드를 돌리는 특정 pod는 GPU가 탑재된 node에서만 돌아야 함
      • 소비자들은 네트워크 intensive하므로 전용 node 그룹을 쓰고 싶어 함
      • 팀 별로 node를 나눠서 사용하고 싶어 함.
      <pod 스케줄링 분류>
      1. 사용자가 특정 node에 pod를 배치하고 싶을 때: nodeSelector, Node Affinity, Node Anti-Affinity, Inter Pod Affinity, Inter Pod Anti-Affinity
        • NodeSelector: 노드에는 라벨을 할당하고, 파드에는 nodeSelector 필드를 추가하여 특정 노드에서 구동되도록 함
        • 다만, NodeSelector는 여러 값을 할당하거나 not 예외 처리를 하거나 하기에는 어려움
        • Node Affinity: 여러 advanced 할당을 할 수 있는 만큼 문법이 다소 복잡
      2. 관리자가 특정 node에는 pod가 배치되는 것을 막고 싶을 때: Taints(node가 가지게 되는 성격), Tolerations (pod가 가지게 되는 taint에 대한 toleration)
      • 어떤 pod가 어떤 node에 스케줄링 될 수 있는지 제한
      • Toleratio가 있어야 Taints를 무시하고 해당 node에 pod를 생성할 수 있음
    • kube-controller-manager
      • 클러스터의 다양한 상태를 감시하고 제어하는 역할을 수행하는 컨트롤러들의 집합을 관리
  2. Data Plane (Worker node): 실제 사용자의 애플리케이션 배포
    • kubelet (쿠브렛)
      • 각 노드에서 실행되는 Kubernetes 에이전트
      • 마스터 노드의 명령에 따라 노드 상태를 보고하고 파드의 상태를 관리
      • 파드 스펙을 받아들이고 컨테이너화된 애플리케이션을 실행하는 주체
      • 컨테이너 런타임과 상호 작용하여 파드의 컨테이너를 생성, 시작, 중지 및 모니터링
    • kube-proxy
      • 클러스터 내의 서비스 디스커버리와 로드 밸런싱을 관리하는 Kubernetes 네트워크 프록시
      • 서비스 요청을 적절한 파드로 전달하여 클라이언트가 서비스에 액세스
      <kubu proxy가 네트워크를 관리할 때 쓰는 방법>
      • userspace > iptables > ipvs로 진화
      • ipvs가 더 다양한 로드밸런싱 알고리즘을 갖고 있고, 더 높은 성능 제공
    • container runtime
      • 컨테이너를 실행하는 소프트웨어
      • 가장 많이 사용하는 런타임으로 Docker를 주로 사용했음
      • 예시
        • 고수준 = containerd, CRI-O, docker
        • 저수준 = runc, runv
  • coredns (kube-dns)
    • kubernetes 클러스터 내부의 주소 해석이나 서비스 디스커버리에 사용되는 내부 DNS 서버
    • kube 1.12 버전 전에는 kube-dns라는 이름이었으나, 이후에는 CoreDNS로 이름 변경