#1. 가상화(Virtualization) 와 컨테이너 (Container)

  • 가상화 (Virtualization)
    • 가상화는 소프트웨어를 사용하여 프로세서, 메모리, 스토리지 등과 같은 단일 컴퓨터의 하드웨어 요소를 일반적으로 가상 머신(VM)이라고 하는 다수의 가상 컴퓨터로 분할할 수 있도록 해주는 컴퓨터 하드웨어 상의 추상화 계층을 구축
    • 일반적인 가상화는 OS를 가상화 하는 방식이다, 예를 들어 VMWare, VirtualBox 같은 가상머신은 호스트 OS 위에 게스트 OS 전체를 가상화 하여 사용하는 방식이다.
    • 위의 방식은 간단하지만 무겁고 느려 CPU의 가상화 기술(HVM)을 이용한 KVMKernel-based Virtual Machine반가상화 Paravirtualization방식의 Xen 이 등장하였다.
    • 이러한 기술들은 OpenStack이나 AWS, Rackspace같은 클라우드 서비스에서 가상 컴퓨팅 기술의 기반이 되었다.


  • 컨테이너 (Container)
    • 전가상화와 반가상화의 문제점은 추가적인 OS를 설치하여 가상화 하는 것이기 때문에 성능상 문제가 있었고, 이를 개선하기 위해 프로세스를 격리하는 방식이 등장하게 되었다.
    • 리눅스에서는 이를 리눅스 컨테이너 라고 하고 단순 프로세스를 격리 시켜 가볍고 빠르게 동작한다.
    • 프로세스를 격리하는 다른 방식으로는 cgroupscontrol groups와 namespace를 이용한 LXCLinux container가 있었고 FreeBSD에선 Jail, Solaris에서는 Solaris Zones이라는 기술이 있었고, 구글의 lmctfy 등이 있다.
    • 도커는 LXC를 기반으로 시작해서 0.9버전에서는 자체적인 libcontainer 기술을 사용하였고 추후 runC기술에 합쳐졌다.


    • 가상머신과 도커
가상머신과 도커



#2. 도커(Docker) 란 ?
도커는 컨테이너를 관리하는 플랫폼

  • 도커 (Docker)
    • 컨테이너 기반의 오픈소스 가상화 플랫폼 이다 = 도커는 컨테이너를 관리하는 플랫폼

  • 이미지 (Image)
    • 이미지는 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않습니다(Immutable).
    • 컨테이너는 해당 이미지를 실행한 상태이고, 추가되거나 변하는 값은 컨테이너에 저장된다.

Docker image

    • 이미지는 Docker hub에 등록 또는 Docker Registry 저장소를 직접 만들어 관리할 수 있다.
    • 이미지는 url 방식으로 관리하며 태그를 붙일 수 있다.

Docker image url



  • 레이어 (Layer)
    • 레이어 개념의 저장방식을 사용하고 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해주며, 이미지는 여러개의 읽기 전용read only 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다
Docker Layer

  • Dockerfile
    • 도커는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSLDomain-specific language언어를 이용하여 이미지 생성 과정을 적음

  • Docker Hub
    • Docker Hub는 Docker에서 운영하는 Docker 이미지 저장소 서비스, 도커는 Docker hub를 통해 공개 이미지를 무료로 관리해 줍니다.


#3. 쿠버네티스란?



  • 쿠버네티스는 '컨테이너 오케스트레이션 툴' 입니다.
  • 오케스트레이션이란?
    • 컨테이너 역시 그 수가 많아지게 되면, 관리와 운영에 있어서 어려움이 따릅니다.
    • 컨테이너 오케스트레이션은, 이러한 다수의 컨테이너 실행을 관리 및 조율하는 시스템입니다.
    • 오케스트레이션 엔진을 통해, 컨테이너의 생성과 소멸, 시작 및 중단 시점 제어, 스케줄링, 로드 밸런싱, 클러스터링 등
    • 컨테이너로 어플리케이션을 구성하는 모든 과정을 관리할 수 있습니다.
    • 다른 컨테이너 오케스트레이션 툴로는 '도커 스웜', 'ECS', 'Nomad'등이 있습니다.
  • 쿠버네티스 특징
    • 자동화된 복구(self-healing)
      • 컨테이너들을 모니터링하며, 컨테이너 중 하나라도 죽으면 쿠버네티스는 그것을 빠르게 재시작 시킵니다.
    • 로드 밸런싱(Load balancing)
      • 만약 1만명의 유저가 접속하지만, 당신의 웹/앱은 준비가 되지 않았을 경우
      • 쿠버네티스는 해당 웹사이트의 니즈를 수용할 수 있도록
      • 자동으로 새로운 컨테이너들을 만들 수 있습니다.
      • 또한, 니즈가 줄어들면 컨테이너의 숫자를, 지정해둔 최소 숫자로 자동으로 조절합니다.
      • 이전에는 수동으로 했던 작업들을 쿠버네티스가 자동으로 도와주는 것입니다.
    • 무중단(Fault tolerance-FT) 서비스
      • 기업에서는, 서버 업데이트를 위해서 사용자들이 잠든 새벽 시간을 활용하거나, 긴급 점검의 형태로 서비스를 일시 중단해왔습니다.
      • 하지만, 쿠버네티스는 점진적 업데이트를 제공하기 때문에, 서비스를 중단하지 않고도 애플리케이션을 업데이트할 수 있습니다.
    • 호환성(Vendor Lock In 해결)
      • 고객이 A사의 클라우드를 사용하다가 I사의 클라우드로 환경을 이전하고 싶을 때,
      • 서로 다른 업체(Vendor)의 클라우드 제품 간에 호환 문제가 발생하여 이전하기 어려운 상황을 Vendor Lock In 이라고 합니다.
      • 쿠버네티스는 도커 컨테이너를 기반으로 하는 오픈소스이기 때문에, 사용자들이 특정 업체에 종속되지 않고 클라우드의 환경들을 이전할 수 있습니다.
      • 또한, 한 번 쿠버네티스를 익히면 provider 회사에 상관없이 공통된 마이크로서비스 아키텍쳐 개발이 가능합니다.



#4. 도커와 쿠버네티스 비교 예시

  • 컨테이너를 하나만 띄워서 사용해야지! => 도커
  • 0월 0시에, 100개의 컨테이너를 자동으로 생성해야지! => 쿠버네티스
    • 즉, 도커는 ’이미지를, 컨테이너에 띄우고 실행하는 기술’이고
    • 쿠버네티스는 '도커를 관리하는 툴'이라고 생각하시면 됩니다.
    • 따라서, 도커는 '한 개의 컨테이너를 관리’하는 데 최적화 되어있고,
    • 쿠버네티스는 '여러 개의 컨테이너를, 서비스 단위로 관리’하는 데 최적화 되어있습니다.
  • 도커와 쿠버네티스는 상황마다 다르게 사용됩니다.
  • 한 개의 컨테이너만 사용한다면 쿠버네티스는 필요 없습니다.
  • 쿠버네티스는 많은 컨테이너 관리에 유용합니다.



#5. 쿠버네티스 네트워크 구성도

  • 쿠버네티스의 네트워크 구성도는 기본적으로 docker 의 네트워크 구성도를 베이스로 함.


  1. 도커의 컨테이너 네트워킹

(브릿지 타입의 네트워크 구조)

(docker가 구성 된 VM의 ip 확인)

  • docker0
    • 호스트 네트워크 네임스페이스 또는 디폴트 네트워크 네임 스페이스
    • 호스트의 기본 네트워크는 docker0 에서 만들어 지고 관리

  • veth (베스)
    • 컨테이너 네트워크 네임스페이스
    • 컨테이너의 기본 네트워크는 베스에서 만들어지고 관리
    • 네트워크 네임스페이스는 연결되기 전까지 독립적으로 동작하다가, veth(Virtual Ethernet) 이라는 가상장치에 의해 네임스페이스가 연결된다.



  1. 쿠버네티스의 파드 네트워킹

  • 도커와 달리 파드(pod)단위로 컨테이너들을 관리한다.
  • 파드는 여러개의 컨테이너로 구성될 수 있는데 컨테이너들은 모두 동일한 IP를 부여 받을 수 있다. (pause 컨테이너를 이용)
  • pause 컨테이너는 하나의 ip를 갖고 각 컨테이너들은 127.0.0.1로 포트를 구분하여 서로 통신이 가능하다.




  • 싱글 노드 Pod-to-Pod 통신


    • 네트워크 인터페이스( Kubenet 또는 CNI ) 를 통해 파드에 할당되어 있는 고유한 IP 주소로 통신할 수 있다.
    • CNI : CNCF(Cloud Native Computing Foundation)의 프로젝트 중 하나인 CNI는 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준
    • 기본적으로 쿠버네티스는 kubenet이라는 아주 기본적이고 간단한 네트워크 플러그인을 제공해준다. 하지만 이 네트워크 플러그인은 크로스 노드 네트워킹이나 네트워크 정책설정과 같은 고급 기능은 구현이 되어있지 않다. 따라서 CNI(Container Network Interface)의 스펙을 준수하는 네트워크 플러그인을 따로 사용해야 한다.
    • 각 Pod 는 고유 ip주소를 갖고 네트워크 인터페이스를 통해 통신




  • 멀티 노드 Pod-to-Pod 통신


    • 오버레이 네트워크 기능을 구현하기 위해 CNI를 설치하고 라우터를 경유하여 통신
    • Pod → veth → CNI(Flannel) → eth0 → 라우터(=VPC) → eth1 → CNI(Flannel) → veth → Pod
    • 가상 네트워크 인터페이스, 브릿지 네트워크, 라우터의 라우팅 Rule 조합을 일컬어 오버레이 네트워크라 한다.


  1. CNI 의 필요성



  • 호스트 1의 컨테이너 1과 호스트 2의 컨테이너 1 은 같은 IP를 갖게 된다. 이 경우 어떤 노드의 파드로 패킷이 가야 하는지 알 수 없기 때문에 CNI 라는 추가적인 네트워크 인터페이스를 설치하여, 각종 네트워크 기능들 (Iptables, 커널 라우팅, 터널링, 브릿지) 를 사용하게 해줌.



  1. Pod To Service


  • kube-proxy의 netfilter에 정의 되어 있는 chain rule에 의해 요청을 포워딩
  • 쿠버네티스는 기본적으로 Pod는 쉽게 대체 될 수 있어 IP로 서비스를 통신하는 것은 부적절, 이에 Pod 앞단에 Reverse Proxy를 위치 시키는 방법이 있다. 이것을 수행하는 추상적인 리소스가 Service (가상 IP 주소 사용) 이다.
  • 쿠버네티스 클러스터 내부에서 통신할 때는 이 Service의 IP를 거쳐서 통신하게 된다.