ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [docker] Containerd ?
    Container 2017. 7. 4. 13:42

    Containerd

     

    :  runC를 제어하는 데몬으로 Docker engine에 내장될 예정이다. containerd는 업계 표준 컨테이너 런타임이며, 전체 컨테이너 life cycle(이미지 전송 및 저장, 컨테이너 실행 및 관리, low-level 저장 및 네트워크 첨부 등)을 관리 할 수 있다. runC를 활용하여 체크 포인트 및 복원, seccomp 및 userspace 지원과 같은 고급 기능을 제공한다.

     

     

     

     

    containerd는 로컬 시스템의 컨테이너를 관리하는 GRPC API를 제공하는 데몬이다.

     

     

     

     

    Driving containerd operations with gRPC ?

     

    gRPC 란

     

    • Command-line client (runC와 같은)
    • REST/HTTP client (docker -> dockerd)
    • Web/HTTP client (curl, web brower)

    위와 같은 일반적인 client가 있을 때, gRPC는 RPC 스타일 인터페이스가 장기간에 걸쳐서 만들어진 단순한 client-server 메소드 실행 모델이다.

     

     

    gRPC

     

    gRPC에서 클라이언트 응용 프로그램은 마치 로컬 객체 인 것처럼 다른 시스템의 서버 응용 프로그램에서 메소드를 직접 호출 할 수 있으므로 분산 응용 프로그램 및 서비스를보다 쉽게 만들 수 있습니다.

     

    많은 RPC 시스템 에서처럼 gRPC는 매개 변수와 return 타입을 사용하여 원격으로 호출 할 수있는 메소드를 지정하여 서비스를 정의한다는 아이디어를 기반으로합니다.

     

    서버 측에서는 서버가 이 인터페이스를 구현하고 gRPC 서버를 실행하여 클라이언트 호출을 처리합니다. 클라이언트 측에서 클라이언트는 서버와 동일한 메소드를 제공하는 stub (일부 언어에서는 클라이언트라고 함)을 가지고 있습니다.

     

     

    JSON+HTTP를 사용하지 않고, gRPC+ProtoBuffers를 사용한 이유는 'Code greneration'기능과 '빠른 속도', 'Json이나 XML보다 작은 사이즈' 그리고 '공통성'(docker swarm, kubernetes, etcd 등에서 사용)을 주기 위해서이다.

     

    추가적으로 grpc를 사용함으로써 연결 지원 및 옵션이 풍부하고 완전히 구현에 내장된다. 즉, HTTP2, 인증, 스트리밍, 소켓 옵션 등을 다루기 위해서 서버 코드를 찾거나 쓰는 시간이 적어진다.

     

     

     

    Containerd에서의 gRPC 사용

     

     

    현재 gRPC API를 제공하는 서비스는 대표적으로 Execution, Shim, Content 가 있다.

     

     

     

     

     

    각 서비스는 '.proto' 파일을 가진다. 타입 정의와 같은 definition들이 포함되어 있다. protobuf 컴파일러는 적절한 언어 바인딩을 생성한다.

    proto파일로부터 go 코드 바인딩을 위해 'go generate' 도구를 사용하며 '.pb.go' 파일이 생성된다. 오직 API 를 변경하거나 메세지/타입 정의를 변경할 때만 도구가 필요하다.

     

     

     

     

    gRPC 서비스 그리고 Client 생성

     

    EXAMPLE 'CTR LIST'

    Server

     

    생성된 'containers.pb.go' 파일은 인터페이스 뿐만 아니라 서버를 위한 List 메소드를 호출하는 핸들러를 가지고 있다. ( 경로 : api/services/containers/v1/containers.pb.go )

     

     

     

     

     

     

     

     

    이 파일에는 적절한 gRPC 메세지 응답을 반환하고 연산을 수행하는 'ContainersServer.List' 메소드가 구현되어있다.

     

     

     

    Client

     

    gRPC 메소드를 호출하는 client 코드는 protobuf generation 동안에 생성된다.

    client 코드는 client 명령을 생성된 client stub에 연결하기 위해서만 필요하다.

     

     

     

     

     

     

    Summary

     

    - gRPC를 사용함으로써 proto buffers를 위한 정의와 API layer를 구현하는 복잡성이 줄어든다.

    - containerd의 소비자는 gRPC API를 사용할 것으로 예상된다. ctr 도구는 개발/admin 자원이다.

     

     

     

     

     

    containerd the universal container runtime

     

     

    GRPC API

     

     

    content

    : 콘텐츠 주소 지정 저장소, Content는 요약(content hash)를 통해 식별된다. Status는 진행중인 write 트랜잭션의 상태를 제공한다.

     

    containerd: content
Content is a content addressed store
service Content {
rpc Info(InfoRequest) returns (InfoResponse);
r...

     

     

    rootfs

    : 다운로드된 이미지를 압축 해제하고, 레이어 집합으로부터 루트 파일시스템을 준비한다. Mounts는 생성할 마운트 리스트를 반환한다. 

     

    containerd: rootfs
service RootFS {
rpc Unpack(UnpackRequest) returns (UnpackResponse);
rpc Prepare(PrepareRequest) return...

     

     

     

     

    execution

    : 컨테이너 생성 및 정보 획득을 위한 단순한 API

     

    containerd: execution
service ContainerService {
rpc Create(CreateRequest) returns (CreateResponse);
rpc Start(StartReques...

     

     

     

     

    shim

    : 컨테이너를 위한 IO를 다루는 프로세스

     

     

    containerd: shim
The shim is a process that handles IO for a container.
service Shim {
rpc Create(CreateRequest) returns (...

     

     

     

     

Designed by Tistory.