Update: 2015-12-06

Kubernetes Logo

Kubernetes?


결론부터 말하자면, Kubernetes는 구글이 자사의 Backend 부분의 Container들을 쉽게 관리하기 위해 고안 된 프로젝트라고 보시면 됩니다.

사실, 구글은 Borg라는 프로젝트를 만들어 Container를 다년간 관리 해왔는데, 이것(Borg)의 경험을 녹여 Kubernetes라는 오픈소스를 2013년에 오픈하게 된 것입니다. 관련 논문은 여기를 참고 하시면 됩니다.

오픈소스로 발표하고 나서, 마이크로소프트(MS), 레드햇, IBM, Docker, CoreOS, Meso Sphere, Salt Stack등등의 회사들이 개발에 참여하여 급속도로 빠르게 성장 하는중 입니다.

Kubernetes의 주요 기능은 여러 호스트에서 Container의 응용프로그램 배포와 유지 보수, 확장을 지원 해줍니다.
또한, 현재 포스팅 내용은 Kubernetes v1.1 버전에서 테스트 및 작성 되었습니다.

Architecture


Kubernetes는 크게 Master 서버와 Minion 서버로 이루어져 있습니다.

1. Master
– etcd
CoreOS에서 만든 Key/Value 저장소이며, 여기에 kubernetes에 관련 된 정보를 담아 두는 곳으로 쓰입니다.
– API Server
Master의 중심이 되는 것이 API 서버 입니다.
– Scheduler
client로 부터 kubectl 명령어를 통해 지시받은 작업을 스케줄러가 이를 가지고 있다가 API 서버로 보내주는 역할을 합니다.
– Controller Manager (Replication Controller)
Controller Manager는 Pods의 Replication 부분을 모니터링하고, 여기에 변경 사항이 있으면 API Server를 통해 Pods의 증감/감소 설정을 하는 역할을 담당 합니다.
예를 들어 Pods의 replicas 수가 지정된 개수보다 낮거나 높으면 자동으로 지정 된 수를 지키도록 합니다.


2. Minion

Minion은 Container가 실행 될 수 있는 서버를 말하며, minion = docker server 라고 이해 하시면 됩니다.

– Docker
dotCloud Inc에서 개발하여 Docker라는 이름으로 오픈소스로 발표 되었고,
사용하기 불편했던, LXC(LinuX Containers)를 쉽게 사용할 수 있게 되었습니다.
이 Docker는 HostOS의 커널을 그대로 사용하되, HostOS와 Container OS의 다른 부분만을 패키징하여 독립 된 환경을 제공 해주는 도구 입니다.
– Kubelet
Minion을 제어하는 agent이며, 단일 Container 또는 Pod를 생성 해주는 역할을 담당 합니다.
– Kube Proxy
간단한 L3 프록시이며, kubelet에서 생성한 Pods의 RR(Round Robin)을 담당하는 역할을 합니다.
– Pod
여러 Container들의 묶음이 Pod 입니다.
ex)
redis-group-1(redis-1, redis-2, redis-3, redis-4. … redis-N)
nginx-group-1(nginx-1, nginx-2, nginx-3, nginx-4. … nginx-N)
– cAdvisor
Container의 자원을 모니터링 하는 소프트웨어입니다.
단일 Container 또는 Pods에 대해 모니터링하고, 이를 Kubelet에 전달 합니다.
– Label
Pods에 이름을 붙이는 것으로, 하나의 Pod에 여러가지의 Label을 붙일 수가 있습니다.
예를 들면 환경을 나타내는 ‘Production’, ‘Development’, ‘Staging’ 또는 역할을 나타내는 ‘Frontend’, ‘Backend’, ‘Worker’, ‘Logger’를 붙일 수가 있습니다.

Kubernetes Architecture

Figure 1. Kubernetes Architecture
(https://github.com/GoogleCloudPlatform/kubernetes/blob/master/DESIGN.md)

 

좀 더  이해가 쉽게 GIF로 만들어 봤습니다.

k8s_architecture

 

구성


위의 아키텍처대로 리눅스에서 구성할 것이며, 공통 부분에는 ‘[email protected]:~#’로 표시 될 것이고, 개별 설정은 다르게 표시 될 것입니다.

* 실제 물리 서버가 1대 밖에 없는 분들은 Docker를 가지고 응용하여 구축 해볼 수 있습니다.
Github: https://github.com/ruo91/docker-kubernetes

구성할 서버는 총 7대, etcd-cluster-0, 1, 2, kubernetes-master, kubernetes-minion-0, 1, kubernetes-client 입니다.


– Overlay network

Kubernetes를 사용하면 몇가지 네트워크 문제에 봉착하게 됩니다.
1. Container <-> Container
2. Pod <-> Pod
3. Pod <-> Service
4. External <-> Internal
여러가지 방법이 있겠지만, 간단한 해결 방법으로는 CoreOS의 Flannel을 사용하여 해결 하는 것입니다.
이 Flannel을 Master, Minion 서버에 실행해야 합니다.

공통설정


Hostname 별칭을 설정 합니다.

SSH 연결시 비밀번호를 묻지 않도록 설정합니다.

kubernetes-client 서버에서 master, minion 0, 1 서버들의 authorized_keys 파일의 내용을 추가 합니다.

이후 kubernetes-client 서버의 authorized_keys 파일을 master, minion 0, 1 서버에 배포 합니다.

 

ETCD 구성


– ETCD 설치

etcd-cluster-0, 1, 2 서버에서 아래와 같이 설치와 설정을 합니다.

 

– ETCD Profile 설정

 

– 클러스터 설정

etcd-cluster-0

etcd-cluster-1

etcd-cluster-2

 

 

Kubernetes 빌드


Kubernetes를 구축하기 위해서는 HostOS에 Docker가 설치 되어 있어야 합니다.
설치 방법은 생략하며 링크를 통해 설치 하시기 바랍니다.


– kubernetes 빌드

Kubernetes 설치는 kubernetes-master에서 진행하겠으며, Google의 Github 저장소에서 받아 빌드를 진행 하겠습니다.
(최신 개발 버전으로 사용하고 싶다면 checkout 과정은 무시 하고 바로 make 과정으로 넘어 가시면 됩니다.)

빌드가 완료 되면 _output 디렉토리에서 client, server의 tar 파일을 가져 옵니다.

Master 서버에서는 바로 압축을 풀어 줍니다.

kubernetes client, kubernetes minion 0, 1 서버들에게 scp를 통해 해당 파일을 배포를 합니다.


– Kubernetes Profile 설정

kubernetes client, master, minion 0, 1에 아래와 같이 환경 설정을 해줍니다.

 

 

Kubernetes – Master


Master 서버에 관련 된 데몬을 실행 하기전 Flannel를 실행하여 Overlay network를 사용하도록 해야 합니다.

– Flannel

Flannel에서 지정한 네트워크 범위를 사용하기 위해서는 ETCD에 최조 등록을 해야 Flanneld가 실행 되었을때,
해당 범위를 할당 받을 수 있게 됩니다. 따라서, Flannel 네트워크 범위를 적절하게 설정하여 한번만 실행 해주면 됩니다.

그외 추가 옵션은 여기를 통해 살펴 보시기 바랍니다.

– Flannel 빌드
GitHub에서 Flannel을 다운받아 설치 후 실행 합니다.


– Flannel 실행


– Bridge Interface 생성

Flannel의 네트워크를 사용하려면 전용 브릿지를 생성 후에 사용하도록 해야 합니다.
(Flannel의 CIDR을 사용 하도록 설정 합니다.)


– API Server

API 서버는 public(0.0.0.0)으로 binding 해주는 것이 일반적입니다. 경우에 따라서 내부에서만 사용 할 경우 내부 IP로 설정 하시면 됩니다. 또한, –service-cluster-ip-range 옵션을 필수로 지정 해줘야 하는데, 이 옵션은 Pod에서 실행 될 Container들의 IP를 할당 해주도록 하는 옵션입니다. 이 옵션의 경우 Flannel의 CIDR 범위 보다 한단계 아래로 지정 해주시면 됩니다.

Flannel 브릿지의 CIDR을 확인 하고,

기본 API 포트와 etcd cluster 서버 정보를 적절하게 지정하여 실행 하면 됩니다.


– Scheduler

Scheduler도 마찬가지로 외부에서 접근이 가능하도록 public(0.0.0.0)으로 binding 해줘야 합니다.
(이것 역시 내부로 사용할 경우 내부 IP로 지정 해주시면 됩니다.)

스케줄러의 기본 포트는 10251이고, Master(api server)의 IP와 포트를 적절하게 입력 하면 됩니다.


– Controller Manager (Replication Controller)

외부에서 연결이 가능하도록 public(0.0.0.0)으로 설정하고, Master(api server)의 IP와 포트를 입력 하면 됩니다.
(이것 역시 내부로 사용할 경우 내부 IP로 지정 해주시면 됩니다.)

 

 

Kubernetes – Minion


Minion은 0, 1 서버 모두 같은 방식으로 데몬을 실행 하기전 Flannel를 실행하여 Overlay network를 사용하도록 해야 합니다.

– Flannel

GitHub에서 Flannel을 다운받아 설치 후 실행 합니다.


– Flannel 실행

– Docker Interface 재설정
Docker 데몬이 실행 될 때 자동으로 docker0 인터페이스를 생성하고 구성 하므로, 따로 Bridge 인터페이스를 생성하기 보다는, Docker 데몬이 실행 될때, Flannel의 CIDR로 강제로 사용하기 위한 설정을 해야합니다.

따라서, docker0 인터페이스를 초기화 하고, Docker 데몬 옵션을 추가하여 Docker를 실행토록 합니다.
실행 중인 Docker를 중지하고, docker0 인터페이스를 삭제 합니다.

Flannel의 CIDR을 확인 합니다.

이후 Docker의 데몬 옵션 파일을 열어 –bip 옵션을 추가 합니다.

Docker를 시작 합니다.


– Kube Proxy

Master의 IP와 포트를 지정 하여 실행 합니다.

kubernetes-minion-0

kubernetes-minion-1


– Kubelet

외부에서 연결이 가능하도록 public(0.0.0.0)으로 binding 합니다.
(이것 역시 내부로 사용할 경우 내부 IP로 지정 해주시면 됩니다.)

그리고, API Server의 IP와 포트를 지정 해주고 실행 합니다.
(필요에 따라, kubelet, cadvisor 포트를 지정 하여 실행 해주어도 됩니다.)

kubernetes-minion-0

 

kubernetes-minion-1

 

 

Kubernetes – Client (kubectl)


관리자가 kubectl 명령어 도구를 통해 Pod, Label, Replication Controller를 추가/수정 할 수 있습니다.

– Create
Create는 YAML 형식의 파일을 통해 Pod, Label을 직접 지정하여 만들 수 있는 명령어 입니다.
예를 들어 ngnx를 10개 실행 하고자 할 경우 아래와 같이 지정 해주시면 됩니다.

위의 옵션 중 -s 는 API의 서버를 뜻합니다.

명령이 실행이 되고 나면, 모든 Minion들은 Docker Hub 저장소를 통해 ruo91 사용자의 nginx 이미지를 다운로드 합니다.
이후 Minion들 중에 Workload가 낮은 서버에서 해당 Container가 실행 됩니다.

 

– GET
get 명령어는 자원 정보를 확인 할 때 사용합니다.
Pod의 정보를 확인 하고자 할 경우에는 아래와 같이 사용 하시면 됩니다.

 

– Describe
특정 자원에 대해 자세한 정보를 확인 할 때 사용합니다.

 

– Log
해당 Pod에 존재하는 Container의 로그를 확인 할때 사용합니다.
이후 log 명령어를 통해 로그 확인이 가능 합니다.

 

 

– Stop
특정 Container를 중지 시킬 수 있습니다. 이 명령어를 통해 강제로 장애 발생을 시킬 수 있습니다.

 

Pod 중에 nginxs-1m3ns 이름을 가진 것을 중지 시켜 보도록 하겠습니다.

 

위 명령어가 실행 되면 replicas 수에 맞춰 새로운 Container를 실행하고 Pod 이름이 변경 되어 나타 납니다.

새로 추가 된 nginxs-psb95 가 있는지 확인 해봅니다.

 

Kubernetes – Web UI


API Server를 실행하면 기본값인 8080 포트를 통해 WEB UI를 지원합니다.

이전 v0.x 에서는 Web UI가 API Server에 자체 내장 되어 있었지만, v1.x 버전부터 Web UI(kube-ui)가 Minion 서버에 Pod로 실행 되어 API Server와 연결 되므로, kubectl 명령어를 통해 몇가지 작업이 필요 합니다.

우선, client 서버에서 kube-ui의 yaml 파일 2개를 생성 합니다.

– kube-ui-rc.yaml
https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/kube-ui/kube-ui-rc.yaml


– kube-ui-svc.yaml
https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/kube-ui/kube-ui-svc.yaml

이후 kube-ui Pod를 생성 합니다.

웹서버를 사용 중이라면, Reverse Proxy 설정을 합니다.

해당 도메인으로 접속하여 살펴 봅니다.

k8s_web_ui_0

k8s_web_ui_1
k8s_web_ui_2
k8s_web_ui_3
k8s_web_ui_4

참고

– Google I/O 2014 – Containerizing the Cloud with Docker on Google Cloud Platform
https://www.youtube.com/watch?v=tsk0pWf4ipw

– Connecting Containers: Building a PaaS with Docker and Kubernetes
https://www.youtube.com/watch?v=omTGY8LjVdA

– Github GoogleCloudPlatform
https://github.com/GoogleCloudPlatform/kubernetes/blob/master/DESIGN.md

– Slideshare
http://www.slideshare.net/search/slideshow?searchfrom=header&q=kubernetes