Kubernetes

Kubernetes Logo

 

Kubernetes는 구글이 자사의 Backend의 Container들을 관리하기 위해 고안 된 프로젝트이며,
이를 오픈소스로 발표하고 마이크로소프트(MS), 레드햇, IBM, Docker, CoreOS, Meso Sphere, Salt Stack등이 개발에 참여하고 있습니다.

주요 기능은 여러 호스트에서 Container의 응용프로그램 배포와 유지 보수, 확장을 지원 해줍니다.

 

Architecture

Kubernetes는 크게 Master 서버, Minion으로 이뤄져있습니다.

1. Master
– etcd
kubernetes의 관련 된 정보를 담고 있는 Key/Value 저장소 입니다.
여기에 클러스터의 구성이 저장되며, etcd의 기능 및 구성이 모든 노드에 즉시 반영됩니다.

– API Server
Master의 중심이 되는 것이 API 서버이며, 관리자가 kubectl 명령어를 통해 Pod, Service, Replication Controller 등의 설정을 할수 있습니다.

– Scheduler
kubectl 명령어를 통해 지시받은 작업을 스케줄러가 이를 가지고 있다가 API 서버로 보내주는 역할을 합니다.

– Controller Manager (Replication Controller)
Controller Manager는 etcd의 Replication Controller 개체를 모니터링하고 여기에 변경이 있으면 API Server를 통해 Pod의 증감/감소 설정을 하는 역할을 담당 합니다. 예를 들어 관리자가 kubectl 명령어를 통해 replicas 수를 10개로 지정하였다면, Pod가 9개가 되면 자동으로 10개를 맞추고, 11개 이상이 되면 하나를 죽이고, 지정 된 만큼의 수를 지키게 합니다.

2. Minion
– Docker
LXC(LinuX Containers)를 쉽게 사용할수 있도록 만들어졌고,
HostOS의 커널을 그대로 사용하되, HostOS와 Container OS의 다른 부분만을 패키징하여 격리시켜 주는 도구 입니다.
Docker = Minion = Node로 이해 하시면 됩니다.

– Kubelet
Kubelet은 Minion을 제어하는 agent입니다.

– Kube Proxy
간단한 L3 프록시 같은 것이며, 설정한 Pod의 RR(Round Robin)을 담당하는 역할을 합니다.

– Pod
Container = Pod 입니다.

– cAdvisor
Google이 개발하고있는 컨테이너의 자원 모니터링하는 소프트웨어입니다.
Minion의 컨테이너를 모니터링하고 Kubelet에 필요한 정보를 전달하는 것입니다.

– Label
Pod에 이름을 붙이는 것으로, 하나의 Pod에 여러가지의 Label을 붙일 수가 있습니다.
예를들면 환경을 나타내는 Production, Development, Staging 또는 역할을 나타내는 Frontend, Backend, Worker, Logger을 붙일 수가 있습니다.

Kubernetes Architecture

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

 

구성

위의 아키텍처대로 리눅스에서 구성할 것이며, 공통 부분에는 root@ruo91:~# 으로 표시 될것이고, 개별 설정은 다르게 표시 될것입니다.
구성할 서버는 총 6대, kubernetes-client, kubernetes-master, kubernetes-minion-1, 2, 3, 4 입니다.

 

 

Hostname 별칭을 설정 합니다.

 

 

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

 

 

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

 

 

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

 

etcd 빌드

kubernetes-master 서버에서 진행 하며, etcd는 수동으로 설치 하셔야 하므로, GO Lang 설정이 필요합니다.
따라서, Golang을 설치와 설정 후 etcd를 빌드 하겠습니다.

1. Go Lang

 

 

2. etcd

 

 

– profile 설정

 

Kubernetes 빌드

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

 

1. Kubernetes 빌드
kubernetes-master에서 진행하며, Google의 Github 저장소에서 kubernetes를 받고 빌드를 시작합니다.

 

 

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

 

 

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

 

 

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

 

 

– Kubernetes 환경 설정
kubernetes client, master, minion 1,2,3,4에 아래와 같이 환경 설정을 해줍니다.

 

Kubernetes – Master

Master 서버에 관련 된 데몬을 실행 합니다.

1. etcd
listen-peer-urls, listen-client-urls은 외부에서 연결이 가능 하도록 Public으로 binding 하도록 설정 합니다.

 

 

2. API Server
API 서버는 public으로 binding 하여야 하며, -portal_net 옵션을 사용해서 CIDR을 설정해야 Container가 IP를 할당 받을 수 있습니다.
CIDR을 설정시에는 Docker의 기본 브릿지 인터페이스인 docker0의 CIDR을 입력하면 됩니다.

먼저 docker0 브릿지의 CIDR을 확인 합니다.

 

 

기본 API 포트는 8080 이며, Minion의 kubelet의 기본 포트는 10250 입니다.
포트의 경우는 설정하지 않으면 기본값으로 설정 되니 굳이 사용하지 않아도 됩니다. 마지막으로 etcd 서버의 IP와 포트를 지정 하면 됩니다.

 

 

3. Scheduler
Scheduler도 마찬가지로 외부에서 접근이 가능하도록 Public으로 binding 해줘야 하며, 스케줄러의 기본 포트는 10251이고, Master의 IP와 포트를 입력 하면 됩니다.

 

 

4. Controller Manager (Replication Controller)
이것 역시 외부에서 연결이 가능하도록 설정하고, Minion의 kubelet 포트를 지정, Master의 IP와 포트, Minion들의 IP 주소를 입력 하면 됩니다.

 

Kubernetes – Minion

Minion은 1, 2, 3, 4 서버 모두 같은 방식으로 데몬을 띄워주면 됩니다.

1. Kube Proxy
Master의 IP와 포트를 지정 해주면 됩니다.

 

 

2. kubelet
외부에서 연결이 가능하도록 public으로 binding 해주고, kubelet, cadvisor 포트를 지정, API Server의 IP와 포트를 지정 해주면 됩니다.

 

위의 옵션중 –hostname_override가 설정 되어 있지 않으면, 기본값인 Hostname으로 설정 되고, 아래와 같은 에러가 나옵니다.
추측하건데, Hosname 또는 FQDN으로 지정해야 에러가 나지 않은 것 같습니다.

 

Kubernetes – kubectl

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

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

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

 

명령이 실행이 되고 나면, 모든 Minion들은 Docker Hub 저장소를 통해 ruo91 사용자의 redis 이미지를 다운로드 합니다.
이후 Minion들 중에 Workload가 낮은 서버에서 해당 Container가 실행이 되며, 정상적으로 실행이 되었다면 probe success: master 라는 메세지를 출력합니다.
여기서 probe success: 뒤에 오는 master는 YAML에서 지정했던 Container의 name을 갖습니다.

 

 

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

 

 

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

 

 

- Log
해당 Pod에 존재하는 Container의 로그를 확인 할때 사용합니다.
우선 Pod를 확인 합니다.

 

 

이후 log 명령어를 통해 로그 확인이 가능 합니다.

 

 

- run-containers
클러스터에 특정 이미지를 실행 하고자 할 경우 사용합니다.
사용법은 아래와 같습니다.

 

 

ex 1) Single Instance

 

ex 2) Multiple Instance
Container가 replicas 수 보다 크거나 작을 경우 replicas 수대로 맞출 것 명령한다.

 

 

redis-groups-01 이라는 Label에 Container가 실행 된 것을 확인 할 수가 있습니다.

 

 

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

 

 

Pod 중에 redis-groups-zi4hx 이름을 가진 것을 중지 시켜 보도록 하겠습니다.

 

 

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

 

 

Kubernetes – WEB UI

API Server를 실행하면 기본값인 8080 포트를 통해 WEB UI를 지원합니다. 이를 통해 Pods 내역과 API를 확인 가능합니다.

kubernetes-3

 

swagger-ui를 통해 들어가면 API를 확인 할 수 있는 화면이 나타납니다.

kubernetes-4

kubernetes-5

 

참고

– 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