Docker Storage 이해

Dev & Ops 2016.12.16 10:25
크리에이티브 커먼즈 라이선스
Creative Commons License

2016.12.16 덧붙임

- 도커는 원래 Ubuntu에서 개발, Ubuntu의 파일 스토리지 시스템은 AUFS.
- Red Hat 계열 배포판 (RHEL, CentOS, ...)에는 AUFS가 존재하지 않음.
- Red Hat 계열 리눅스를 위해,
도커는 Device Mapper를 2번째 Storage Backend로 수용함.
- Red Hat 계열 리눅스에 도커를 설치하면,

  Device Mapper가 도커의 Storage Backend로 동작 (loop-lvm).
- 만약, 도커를 상용 수준으로 운영하려면,

  Device Mapper를 loop-lvm(디폴트)가 아닌 direct-lvm으로 설정/운영해야 함.

- 도커 스토리지가 충분한 공간 위에서 안정적으로 운영되지 못하면,

  사용하는 컨테이너 이미지의 종류가 다양해질수록

  또 실행중인 컨테이너의 수가 많아질수록 시스템이 정상동작하지 못할 가능성이 높아짐.



2016.01.29 원글

Q: 도커를 쓸 때 궁금했다
- 도커허브에서 가져온 도커 이미지는 어디에 저장되는 걸까?
- 도커 컨테이너 안에 write 하는 데이터는 어디에 저장되는 걸까?

A: 알고보니, <도커 스토리지>에 저장됐다
- <도커 이미지>는 layer 구조를 갖는다
- <도커 컨테이너>의 데이터는 CoW (Copy On Write) 정책에 따라 저장된다
+ RHEL/ CentOS/ Fedora 에서는 <도커 스토리지> 설정 작업이 필요하다 (Device Mappr)
  - 디폴트 스토리지는 loopback 장치
  - 안정적이지 않음
- Ubuntu는 도커 패키지 설치후 도커 스토리지 설정 없이 그냥 써도 좋다 (AUFS)

도커 스토리지 설정 스크립트 (@RHEL/ CentOS/ Fedora)
0. su
  $ su
1. volume이 정상적으로 준비되어 있는지 확인
  # fdisk -l
  - 사용하지 않는 /dev/vdc 장치 존재 확인
2. docker-storage-setup 설정 파일 수정
  # cat <<EOF > /etc/sysconfig/docker-storage-setup DEVS=/dev/vdc VG=docker-vg EOF
3. docker-storage-setup 명령 실행
  # docker-storage-setup
  ...
  Physical volume "/dev/vdc1" successfully created
  Volume group "docker-vg" successfully created
  Rounding up size to full physical extent 16.00 MiB
  Logical volume "docker-poolmeta" created.
  Logical volume "docker-pool" created.
  ...

Ref
- (추천!) Understand images, containers, and storage drivers
  https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/
- Docker and the Device Mapper storage driver
  https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/
- Comprehensive Overview of Storage Scalability in Docker
  http://developerblog.redhat.com/2014/09/30/overview-storage-scalability-docker/

(이상)

저작자 표시 비영리 변경 금지
신고
Posted by ingee
TAG docker

댓글을 달아 주세요

크리에이티브 커먼즈 라이선스
Creative Commons License

k8s vs swarm 비교 요약

비교항목 Kubernetes
Swarm
설치
△ (열위)
Docker 설치 후,
k8s 추가 설치 필요
O (우위)
Docker만 설치하면 끝

미세 조정
(fine control)
O (우위)
클러스터 미세 조정 가능
(pod, replica-set,
deployment, service 등
세밀하게 구분된 객체 제공)
△ (열위)
미세 조정 미흡
(service 객체만 제공)


성능
container
life-cycle 관리
O (동등)
deploy, scale, update
O (동등)
deploy, scale, update
container
rolling-update
O (우위)
7초
△ (열위)
117초
node fail 복구
△ (열위)
304초
O (우위)
21초
사용 소감
* Flexible
* 신뢰성이 높고 유연함
* 현시점에서 가장 적합한 선택
* Simple
* 리소스 사용량이 작고 빠름
* 특수 상황에 적합한 선택


솔루션 특징 요약
k8s
  * 주요 resource
    - pod 객체
      . 컨테이너 집합
      . k8s의 실행 단위 (스케줄링 단위)
    - deployment 객체
      . pod 배포를 담당하는 자원
      . pod 인스턴스 수를 관리하는 replica-set 자동 생성
      . pod 인스턴스에 대한 rolling-update 관리
    - service 객체
      . pod 집합을 고정된 end-point로 관리
  * declarative configuration
    - desired-state를 선언(declare)하면 k8s가 클러스터의 current-state를 desired-state로 맞추기 시작
    - kubectl edit 명령이 유용


swarm
  * 주요 resource
    - docker engine swarm mode에는 pod, replica-set 등의 객체가 없고, service 객체만 존재
    - service
      . service는 1개 이상의 container로 구성되며,
        service 생성시 옵션 파라미터를 사용하여 replica 갯수를 지정
  * imperative configuration
    - 클러스터 상태 변경 명령을 내리면 즉시 반응 (장점 아님)

공통점 & 차이점
  . k8s와 swarm 모두 master가 죽어도 pod/service/overlay-network의 동작/연결은 유지됨
  . k8s는 delarative configuration, swarm은 imperative configuration
    즉, admin이 컨테이너 인스턴스를 100개 -> 10개로 지정하는 명령을 내렸을 경우
    - k8s는 중간 상태인 100개를 건너뛰고 최종 상태인 10개에 도달하는 방식
    - swarm은 100개 상태를 거쳐 10개 상태에 도달하는 방식

성능 테스트 결과

테스트 종류 Kubernetes Swarm
Container
Life-cycle
Mgmt.
컨테이너 생성
- 컨테이너 생성 시간 측정
- master x1, node x3
10개 생성
2.3초
3:4:3
7.0초
4:3:3
50개 생성
11.6초
17:17:16
14.3초
17:16:17
100개 생성
27.8초
34:33:33
22.2초
33:33:34
200개 생성
83.2초
66:67:67
63.2초
66:67:66 (?)
200개 with 4 node
59.1초
50:50:50:50
41초
50:50:50:50
300개 with 4 node
실패
(자원 부족)
70초
75:75:75:75
Scaling:
- 1개 컨테이너를 100개로 scaling
- master x1, node x4
25.3초
25:25:25:25
26.4초
25:25:25:25
Rolling Update:
- 어플리케이션 중단 없이 컨테이너 이미지 교체
- 컨테이너 인스턴스 10개가 동작하는 상황
- master x1, node x4
7.1초
3:2:2:3
117초
Cluster
Mgmt.
node fail 대처:
- 4개 node가 동작중인 상황에서
- 1개 node를 power-off,
- 제거된 node에서 실행되던 컨테이너가
다른 node로 이동/복구되는 시간을 측정
304.8초
33:33:34
21초


k8s vs swarm 테스트 스크립트 비교

테스트 종류
Kubernetes 명령 스크립트
Swarm 명령 스크립트
컨테이너 생성
$ kubectl create -f deploy.yaml
$ docker service create
--name hello-nodejs
ingee/hello-nodejs:0.2
Scaling
$ kubectl scale
--replicas=10
deploy hello-nodejs
$ docker service update
--replicas 10
hello-nodejs
Rolling Update
$ kubectl set image
deploy hello-nodejs
hello-nodejs=ingee/hello-nodejs:0.2
$ docker service update
--images ingee/hello-nodejs:0.2
hello-nodejs


(이상)

저작자 표시 비영리 변경 금지
신고
Posted by ingee

댓글을 달아 주세요

크리에이티브 커먼즈 라이선스
Creative Commons License

Docker networking and service discovery 요약
  * <https://www.oreilly.com/learning/docker-networking-service-discovery>
  * 2016-04-11
  * 저자는 Mesosphere 엔지니어, 편향된 의견이 있을 수 있음

개요
  * 도커 네트워킹과 서비스 디스커버리는 신규 영역이라 Best Practice 가 적다
  * 도커 네트워킹과 서비스 디스커버리 표준이 정립되려면 몇년 더 있어야할 것 같다

도커 네트워킹
  * 도커 네트워킹은 컨테이너를 위한 SDN 솔루션
  * 도커 네트워킹이 해결해야 하는 문제
    - 서로 다른 host에서 실행되는 컨테이너들끼리 어떻게 연결/통신하게 하나?
    - 컨테이너와 외부세계(인터넷)가 어떻게 연결/통신하게 하나?
    - 클러스터 내부의 상태 (IP 할당 등)를 어떻게 유지하나?
    - 기존 네트워크 인프라에 어떻게 통합하나?
    - 보안정책을 어떻게 적용하나?
  * 도커 네트워킹 솔루션
    - Overlay
      . 도커사는 2015년 3월 SDN 스타트업 SocketPlane을 인수
      . SocketPlane의 솔루션을 Docker Overlay Driver라고 명명
      . 도커 bridge mode 네트워크를 클러스터 레벨로 확장
      . Docker Swarm에 적용 (도커 버전 1.9+)
    - Flannel
      . 모든 컨테이너(pod)는 고유한 IP 주소로 통신 가능
      . k8s에 적용
    - 그밖에 Weave, Project Calico, Open vSwitch, Pipework, OpenVPN 등 존재

서비스 디스커버리 & 로드 밸런싱
  * 서비스 디스커버리
    - 컨테이너 스케줄링과 서비스 디스커버리는 동전의 양면
      . 두 기능은 반드시 동행하며,
      . 서로가 서로를 필요로 함
    - 서비스 디스커버리란?
      . 특정 컨테이너가 어느 host에서 실행되는지 알아내는 솔루션
      . register 기능과 lookup 기능으로 구성
    - 서비스 디스커버리는 로드 밸런싱과 밀접한 관계가 있다
    - 100~1000+ node 규모의 클러스터라면 서비스 디스커버리 부하 테스트 필요
    - 서비스 디스커버리 솔루션
      . Zookeeper : 검증된 솔루션, 설치가 어렵다는 평
      . etcd : 경량 솔루션
      . Consul
      . 기타 Mesos-DNS, SkyDNS, WeaveDNS 등
  * 로드 밸런싱
    - 로드 밸런싱으로 달성할 수 있는 것
      . throughput 최대화, response time 최소화
      . 특정 컨테이너에만 부하가 집중되는 것(hotspotting)을 방지
    - 도커 로드 밸런싱 솔루션
      . NGINX : 서비스 디스커버리 솔루션과 정합성 좋음
      . HAProxy : 도커사가 솔루션을 인수, 향후 도커의 네이티브 솔루션이 될 전망
      . Bamboo
      . Kube-Proxy : k8s에 적용

컨테이너 오케스트레이션
  * 스케줄링은 중요, 하지만 오케스트레이션의 일부일 뿐
  * 스케줄러는 컨테이너를 클러스터 위에서 배포/실행(deploy)하는 역할
  * 스케줄러가 deploy target node를 선택하는 기준
    - 머신의 사용 현황
    - app 실행에 필요한 자원 요구사항
    - app 실행 조건(constraint)
      . ex) SSD 가 설치된 머신에서 실행
  * 오케스트레이션 솔루션별 스케줄러 특성
    - Docker Swarm
      . Swarm의 스케줄러는 pluggable (다른 스케줄러로 교체 가능)
      . HA 기능 제공 (아직은 불완전하다는 평, 개발중)
    - Kubernetes
      . 구글의 10년 노하우를 결집
      . 모든 컴포넌트가 교체 가능


  * 오케스트레이션 솔루션 비교
    - 노드 규모에 따른 적합도

  Tool       | ~10 nodes | 10~100 nodes | ~1,000 nodes | 1,000+ nodes
-------------+-----------+--------------+--------------+--------------
Docker Swarm |    ++     |    +         |    ?         |    ?
-------------+-----------+--------------+--------------+--------------
Kubernetes   |    ++     |    ++        |    +         |    ?
-------------+-----------+--------------+--------------+--------------
Apache Mesos |    +      |    ++        |    ++        |    ++

    - 워크로드 종류에 따른 적합도

             | non-      |           |       | Long-   |           |

  Tool       | Container | Container | Batch | running | Stateless | Stateful
-------------+-----------+-----------+-------+---------+-----------+---------
Docker Swarm |  -        |  ++       |  +    |  ++     |  ++       |  +
-------------+-----------+-----------+-------+---------+-----------+---------
Kubernetes   |  -        |  ++       |  +    |  ++     |  ++       |  +
-------------+-----------+-----------+-------+---------+-----------+---------
Apache Mesos |  ++       |  ++       |  ++   |  ++     |  ++       |  +


(이상)

저작자 표시 비영리 변경 금지
신고
Posted by ingee

댓글을 달아 주세요



티스토리 툴바