docker client 와 kubernetes client에 대해서 알아보고, Python 기반의 공식 라이브러리를 사용하여 테스트해보자.

Docker Client

도커 클라이언트는 도커 데몬과 UNIX Socket 또는 REST API를 사용하여 통신한다.
도커 데몬과 통신하는 방법은 Docker CLI, SDK (Go, Python) 사용하여 자체적으로 구축, Docker Engine API를 직접 호출 하는 방법이 존재한다.

공식적으로 지원되는 라이브러리 의 경우 Go, Python, HTTP 가 있다.
커뮤니티에 의해 관리되는 Unofficial libraries 중에 Java 등이 존재 한다.

테스트

Python 기반의 공식 라이브러리(Python Docker Engine SDK)를 사용했다.

설치

1
> pip install docker

예제

도커 이미지 목록을 조회하는 예시

1
2
3
4
5
6
7
import docker

client = docker.from_env()
containers = client.containers.list()

for c in containers:
print(c.image)

결과

1
2
<Image: 'test-app:0.1'>
<Image: 'eureka-server:0.1'>

참고

비공식 라이브러리 중에 자바기반의 docker-client 에 대해서 우선 테스트를 해보았다.
기존 스프링 부트 프로젝트 라이브러리의 버전과 docker-client에서 사용되는 라이브러리들 간의 Conflict가 발생했다. ()

Kubernetes Client

쿠버네티스 API를 사용하기 위해서 공식적으로 지원되는 쿠버네티스 클라이언트 라이브러리를 사용한다.

쿠버네티스 REST API를 사용해 애플리케이션을 작성하기 위해 API 호출 또는 요청/응답 타입을 직접 구현할 필요는 없다. 사용하고 있는 프로그래밍 언어를 위한 클라이언트 라이브러리를 사용하면 된다.

쿠버네티스 클라이언트 라이브러리는 Go, Python, Java 등이 공식적으로 관리되고 있다.
Python 라이브러리 를 이용해서 테스트해보자.

개발환경

Python 2.7 and 3.4 +

설치

1
2
3
4
> pip install kubernetes
...
Installing collected packages: pyyaml, oauthlib, requests-oauthlib, pyasn1, rsa, cachetools, pyasn1-modules, google-auth, python-dateutil, kubernetes
Successfully installed cachetools-4.0.0 google-auth-1.11.0 kubernetes-10.0.1 oauthlib-3.1.0 pyasn1-0.4.8 pyasn1-modules-0.2.8 python-dateutil-2.8.1 pyyaml-5.3 requests-oauthlib-1.3.0 rsa-4.0

예제

1
2
3
4
5
6
7
8
9
10
from kubernetes import client, config

# Configs can be set in Configuration class directly or using helper utility
config.load_kube_config()

v1 = client.CoreV1Api()
print("Listing pods with their IPs:")
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items:
print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))

라이브러리에 구현되어있는 함수를 통해서 쿠버네티스 API /api/v1/pods 를 호출하게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
return self.api_client.call_api('/api/v1/pods', 'GET',
path_params,
query_params,
header_params,
body=body_params,
post_params=form_params,
files=local_var_files,
response_type='V1PodList',
auth_settings=auth_settings,
async_req=params.get('async_req'),
_return_http_data_only=params.get('_return_http_data_only'),
_preload_content=params.get('_preload_content', True),
_request_timeout=params.get('_request_timeout'),
collection_formats=collection_formats)

샘플 코드의 경우 아래와 같은 결과 데이터를 출력하게 된다.
(단일 노드의 kubernetes cluster 구성을 지원해주는 Docker Desktop을 사용해서 테스트 함.)

1
2
3
4
5
6
7
10.1.0.36	kube-system	coredns-5c98db65d4-5kvwh
10.1.0.37 kube-system coredns-5c98db65d4-6vfrz
192.168.65.3 kube-system etcd-docker-desktop
192.168.65.3 kube-system kube-apiserver-docker-desktop
192.168.65.3 kube-system kube-controller-manager-docker-desktop
192.168.65.3 kube-system kube-proxy-9l6jq
192.168.65.3 kube-system kube-scheduler-docker-desktop

Document

documentation-for-api-endpoints

쿠버네티스 API에 대한 문서는

전체 API 관례는 API conventions doc에 기술되어 있다.

API 엔드포인트, 리소스 타입과 샘플은 API Reference에 기술되어 있다.

API에 원격 접속하는 방법은 Controlling API Access doc에서 논의되었다

공식적으로 지원되는 Python Docker Engine SDK, 쿠버네티스 클라이언트 라이브러리 사용하여 컨테이너 관리에 필요한 기능을 구현한 API 서버를 구축해 볼 수 있다.