본문 바로가기
IT/Kubernetes

1. Kubernetes/Container 개요

by halizy 2018. 8. 5.

Overview

 

 

컨테이너 기술들의 발전과정


      

최초의 컨테이너는 서버 가상화에서 시작


가상머신을 구현하기 위해 vmware, kvm, hyper-v 같은 기술을 사용
최근 docker로 대표되는 LXC(linux container)와 같은 컨테이너형 가상화 기능 등장
컨테이너 가상화 기술은 기존의 가상화 기술보다 가벼워 지고 이식성이 뛰어난 특징
리눅스 컨테이너를 보면 os의 내부는 물리적 자원을 관리하는 커널공간과 사용자프로세스(애플리케이션)을 실행하는 사용자 공간으로 나뉨
이런 사용자 프로세스를 정리하여 분리한 사용자 공간이 바로 컨테이너
 
 
Linux chroot명령어가 개념의 시초


리눅스에서 제공하는 명령어중 chroot가 있는데
chroot는 파일시스템에서 루트 디렉토리를(/) 변경하는 명령어
chroot로 특정디렉토리를 루트 디렉토리로 설정하면 chroot jail이라는 환경이 생성되는데 
이 jail에서는 바깥은 파일과 디렉토리에 접근할수 없음
하지만 chroot는 jail에 들어갈 실행 파일과 공유 라이브러리를 직접분비해야 하고, 설정이 복잡함
완벽한 가상환경이 아니기때문에 제약이 많음 그래서 LXC라는 시스템 레벨 가상화를 제공

 

 

 


LXC(LinuX Container)


단일 컨트롤 호스트 상에서 여러개의 고립된 리눅스 시스템(컨테이너)들을 실행하기 위한 운영 시스템 레벨 가상화 방법
리눅스커널은 cgroup(control groups)을 절충하여 가상화 머신을 시작할 필요없이 자원할당을 한다. 
cgroups는 앺플리케이션 입장에서 프로세스트리, 네트워크, 사용자id, 파일시스템 등의 운영환경을 고립시키기 위해 namespace isolation을 제공한다. 
 
cgroups가 cpu, mem, 디스크, 네트워크 자원을 할당하여 완전한 형태의 가상공간 제공
또한 프로세스트리, 사용자 계정, 파일시스템, ipc등을 격리시켜 별개의 namespace isolation(namespaces)를 만듬
lxc는 cgroup과 namespace 를 결합하여 애플리케이션을 위한 고립된 환경을 제공한다.

 

 

 

컨테이너의 장점


1. 빠른 시작과 종료 속도 - os입장에서는 단순하게 프로세스를 시작하는것, 하드웨어 초기화 작업이 필요없음
2. 높은 직접도 - 컴퓨터상에서 동작하는 os는 하나 소비하는 자원이 줄어듬
3. 낮은 오버헤드 - 가상화를 위한 하드웨어 에뮬레이트 단계 없이 불리된 공간생성이므로 오버헤드가 줄어듬
4. 애플리케이션 컨테이너 지원 - 필요한 애플리케이션만 설치하여 실행가능

 

컨테이너의 단점

1. host os에 종속적 
    - Linux외에 동작하지 않음, 실행중인 커널은 하나이기때문에 host os의 커널을 사용하게 됨 
    - ubuntu host에 centos 를 설치한다고 해도 실행중인 커널은 ubuntu 커널 
2. 컨테이너별 커널 구성이 불가능 - 전체 컨테이너에서 보이는 커널은 동일함

 

 

 

Docker의 등장


Docker


lxc는 격리된 공간만 제공할 뿐 개발 및 서버운영에 필요한 부가기능이 부족함.
docker는 리눅스 커널의 cgroups와 namespaces를 기반으로 하여 이미지, 컨테이너 생성 및 관리기능과 다양한 부가기능을 제공함
LXC의 랩퍼, 단순한 랩핑 뿐만아니라 docker union파일 시스템을 이용하여 컨테이너 작업을 commit, push로 변경 내용을 관리할수 있다.
docker가 처음 개발될 당시에는 lxc를 기반으로 구현을 하였지만  버전 0.9부터는 lxc를 대신하는 libcontainer를 개발하여 사용함
내부적으로는 실행드라이버(exec driver)라고 하는데 libcontainer는 native, lxc는 lxc로 표기되고 
실행옵션에 따라 lxc를 사용할 수도 있음

 

 

Docker 이미지와 컨테이너


docker는 이미지와 컨테이너라는 개념이 있음
이미지 : 리눅스배포판의 유저랜드만(유저공간에서 실행되는 실행파일과 라이브러리) 설치된 파일, 보통 리눅스 배포판이름으로 되어 있음
컨테이너 : 이미지를 실행한 상태
이미지는 실행파일 컨테이너는 프로세스 정도로 생각하면됨
유저랜드란 : os의 메모리 사용공간 중 사용자(유저)가 사용하는 공간에서 실행되는 파일과 라이브러리를 뜻함, 보통 리눅스 배포판에서 유저랜드는 부팅에 필요한 실행파일과 라이브러리 그리고 고유의 패키징 시스템을 포함함
 
      

Docker 이미지와 union mount


docker는 이미지를 통째로 생성하지 않고, 바뀐부분만 생성한 뒤 부모이미지를 계속 참조하는 방식으로 동작함(Docker Layer)
docker는 이미지 파일이기 때문에 저장소에 올린뒤 다른 곳에서 받을수 있음(레지스트리서버)
저장소에 올릴때 자식이미지와 부모이미지를 함께 올리고 받을때도 마찬가지, 이후에는 내용이 바뀐 이미지만 주고 받음
생성된 docker 이미지는 읽기 전용 상태, 여기서 내용이 바뀌면 이미지를 수정하지 않고 쓰기 이미지를 생성한뒤 기록함 -> union mount 방식
union mount를 지원하는 파일시스템을 union file system이라고 함

 


 

 

       <참고>

http://opennaru.tistory.com/9

http://opennaru.tistory.com/105

http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter01/01

http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter01/02

http://www.slideshare.net/ext/devfair-kubernetes-101
 

 

 

 

Kubernetes


docker의 사용은 시스템 provisioning 및 service isolation, 서버가상화 경량화에 도움을 줌
그러나 클러스터 환경에서 한정된 자원에서 컨테이너 실행, 스케줄링이 필요하기 때문에 컨테이너 스케줄링 도구의 요구사항이 생김
kubernetes는 오픈소스 컨테이너 클러스터 관리도구 made by google
원하는 상태를 정의하고 이 상태가 유지하도록 함(container manifest)
단순 실행이 아닌 컨테이너의 실행 스케줄을 관리
 

kubernetes 구성요소
 
ETCD : kubernetes의 관련된 정보를 담는 key/value 저장소 
 
Master 

 

- kube api server : master의 중심이 되는 api, 말그대로 api server


- kube scheduler : kubectl 명령어를 통해 지시받은 작업을 스케줄러가 이를 가지고 있다가 api 서버로 보내주는 역할, 실행될 minion을 찾음


- kube controller manager(replication controller) : pods의 replication을 모니터링한다.변경사항이 있으면 증/감 설정을 하는 역할,

                                                                     etcd의 replica 설정을 확인
 
minion(server node) : 컨테이너가 실행되는 물리적 단위 node위에 docker daemon에서 컨테이너를 실행
                          

- docker : 말그대로 docker, container 실행 S/W


- kubelet : minion을 제어하는 agent, 단일 컨테이너 또는 pods를 생성해주는 역할, kube proxy의 통신을 위한 iptables 설정하는 등의 역할


- kube-proxy : pod-pod, pod-service 간의 traffic을 처리한다. 간단한 L3프록시(LAN스위치 혹은 백본스위치),

                    kubelet에서 생성한 pods의 round robin을 담당하는 역할


- pod : 컨테이너 manifest(적하목록), 여러 컨테이너의 묶음 kubernetes의 최소 실행 단위, 항상 같은 node위에서 실행되어야 하는 컨테이너들 
         (pod안에서는 같은 네트워크 환경을 공유하고 디스크를 공유한다.) yarml/json로 파일 선언 

 

 

- cAdvisor : 컨테이너 자원을 모니터링 하는 소프트웨어, 단일 컨테이너 또는 pods에 대해 모니터링 하고, 이를 kubelet에 전달함


- Label : pods의 이름

 

 

application 구성


application은 컨테이너 그룹인 pods과 이를 관리하는 controller manager(replication controller), 이를 외부와 통신하는 service로 구성됨
replcation controller가 여러 pod을 구성하는데,
각 pod은 독립적인 IP를 가진다. 이것을 외부 또는 내부에서 접근하기 위해서는 ElasticIP(like VIP)와 같은 방식으로 접근하는데 이것을 service라 부름
service는 여러 pods의 집합이다.(a set of pods) 그리고 하나의 IP와 그에 상응하는 DNS 이름을 가진다. 
 
network model


kubernetes는 vlan, flanner, weave, openVSwitch등으로 pod간 internal network를 overlay network(기존 네트워크를 바탕으로 물리네트워크 위에 성립되는 가상의 네트워크)로 구성해야 한다. 

 

 

container cluster (k8s vs docker swarm)

 

 

k8s

swarm

 concept

 A service oriented container

 orchestration  architecture

 A native clustering tool for docker
 structure  kube-master/node/container(docker, rkt)  swam manager/agent/docker
 network  flannel, openVSwitch, weave, L2network   Multi-host docker overlay network 
 Execution
 Units
 Pod(a container group)  Container
 service
 scale out
 enable  enable
 scheduling  predicates : focus on node status
 priorities : focus on service
 spread, binpack : available cpu, mem
 Random
 advantages  High flexibility and scalable
 Service orientied concepts
 Many function of util 
 Using the docker standard interface
 Lightweight daemons
 Simple architecture and concept
 disadvantages  A complex concept(pod, rc, service, pv…)
 Learn about the kubernetes util
 Lock-in docker
 Manual workflow
 Require other tools for production
 aspect -  monitoring healin, scaling

 

      

 

 <참고>

 

 

http://www.slideshare.net/ruo91/introduce-google-kubernetes

http://www.slideshare.net/ext/devfair-kubernetes-101

http://www.yongbok.net/blog/google-kubernetes-container-cluster-manager/

 

https://github.com/kubernetes/kubernetes

https://github.com/kubernetes/kubernetes/blob/master/docs/design/architecture.md

 

http://kubernetes.io/v1.0/docs/whatisk8s.html

http://blog.woosum.net/blog/2015/04/06/kubernetes-summary/

http://yisangwook.tumblr.com/post/120593105594/google%EC%9D%98-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EA%B4%80%EB%A6%AC-%EB%85%BC%EB%AC%B8%EC%9D%84-%EC%9D%BD%EA%B3%A0-borg-paper-kubernetes

 

http://ingeec.tistory.com/74

http://www.ahnseungkyu.com/195

https://prezi.com/xa48lfxkq4z5/kubernetes-and-docker/?utm_campaign=share&amp;utm_medium=copy

  

'IT > Kubernetes' 카테고리의 다른 글

4. Etcd 설치 (클러스터)  (0) 2019.10.09
3-1. Kubernetes 설치  (0) 2019.01.23

댓글