kubernetes 어디까지 써봤니? 삽질기(1)

Kubernetes 삽질의 시작

이 글은 kubernetes관련 삽질기로 시리즈로 연재될 예정이다.

kubernetes에 대한 소개는 이전글을 참조하기 바란다.

kubernetest(이하 k8s)는 오픈소스 컨테이너 관리 툴이다. k8s는 Go언어로 개발되어 있으며 경량의 이식 가능한 어플리케이션이다.

k8s를 Linux기반의 OS에 올려 다수의 호스트에 클러스터 풀을 생성한후 docker컨테이너 어플리케이션을 올리고 관리하고 확장 가능하게 설정할 수 있다.

본 글에서는 k8s에 대해 자세한 이야기는 다루지 않을것이다.

필자는 k8s전문가도 아니고 docker이미지나 만들고 k8s 에 application을 올리기 위해 deployment spec이나 만드는 일개 엔지니어 일 뿐이다. 실전으로 바로 넘어가서 필자가 try 했던 부분과 의도하지 않았던 어떤 에피소드들이 펼쳐졌는지 가감없이 적나라하게 적어보려 한다. 적어도 이 글을 보시고 필자와 같은 삽질은 피했으면 하는 바람이다.

K8s 입문

k8s에 실전에 진입하기 전에 간단하게 몇가지만 언급하고자 한다. k8s환경을 구축하기 위해서는 다음과 같은 컴포넌트가 필요하다.

  • k8s master
  • k8s nodes
  • etcd
  • overlay network(flannel)

k8s master는 다음과 같은 일을 한다.

  • 인증,권한 관리
  • API entry point
  • 컨테이너 할당 스케줄링
  • 스케일링, 복제 컨트롤러
  • 설정 정보 관리
  • 커맨드 라인 인터페이스(kubectl)

k8s nodes 의 역할과 세부 컴포넌트는 다음과 같다.

  • k8s클러스터에 slave node이다.
  • kubelet agent로 동작하며 master와 통신하며 노드를 관리한다.
  • proxy 각 컨테이너에 대해 네트워크 프록시와 로드 발란서를 담당합니다. 컨테이너간 TCP/UDF패킷을 통제하여 linux iptable의 규칙을 변환 한다.

etcd

  • 분산 키-밸류 스토어이다. RESTful API로 접근 가능하며 CRUD를 담당한다. k8s관련 메타정보를 관리한다고 보면 된다.

overlay network

  • 컨테이너간 네트워크 연결을 지원한다. 호스트 노드에는 docker0라는 가상 네트워크 인터페이스를 생성하게 되는데 이때 private으로 할당되게 된다. 서로 다른 호스트에서 docker container 간의 네트워킹을 가능하게 하는 방식이다. CoreOS의 flannel을 이용하여 구축이 가능하다.
kube

[참고 : https://x-team.com/blog/introduction-kubernetes-architecture/]

삽질의 시작

이제 실전으로 넘어가서 k8s클러스터를 구축해 보도록 하자.

on-premise 환경에서 한땀한땀 설치해가며 소소한 재미를 느껴보는것도 좋지만 앞에서 언급한것처럼 난 k8s전문가가 아니다.

주위에 널려있는 아주 평범한 엔지니어이며 구축된 k8s cluster에 docker와 k8s어플리케이션 개발을 해야 하는게 내 역할이다.

변명이 길지만 클라우드에서 k8s를 설치하는 것으로 방향을 잡았다.

(사실은 내부 개발환경에 k8s 클러스터가 있지만 며칠간 장애가 나서 급하게 클라우드에 k8s를 올릴 수 밖에 없었다. ㅠㅠ)

클라우드에 컨테이너를 올린다고? WHY?

주위에 이상한 시선을 느꼈다. 클라우드에 왜 컨테이너를 올려?

아마도 그 질문이 내포하는 바는 다음과 같을것이다. 이미 가상화된 VM에 있는데 그 안에서 컨테이너로 가상화 하는걸 왜 하는거야?

WHY NOT?

개인적인 경험에 비추어 보았을때 필자가 주로 많이 하는 삽질 중 하나가 실험과 테스트를 위해 동일한 환경을 반복해서 구축하는 작업이다. 물론 이런 것도 자동화 툴인 ansible, saltstack, chef(필자의 경우 이 3가지를 다 써봄 ㅠㅠ ) 등을 가지고 충분히 할 수 있는 일이다.

내가 docker에 꽂힌 이유는 다음과 같다. 경량의, 별도의 hypervisor 필요 없이 OS, SW version, Library 에 대해 제약을 두지 않고 필요로 하는 환경을 쉽게 구축할 수 있다는 점이다.

그리고 k8s는 멀티 호스트에서 이를 실행할 수 있게 해주고 fault-tolerant 하게 컨테이너를 관리까지 해준다.

(이제야 하는 말이지만 참 이상적이다. 그러나 나에게 닥친 현실은 그렇게 녹녹치 않았다.)

STEP 1 : 구글창을 연다. 키워드를 입력한다.

aws kubernetes

여기에 보면 여러가지 가이드가 나온다. 제일 먼저 시도해 본 방법은 CoreOS가 가이드 하는

STEP 2 : https://coreos.com/kubernetes/docs/latest/kubernetes-on-aws.html

방법이다.

한단계 한단계 따라가본다. kube-aws라는 CLI 명령어를 통해 가이드를 보고 10분만에 s3에 폴더를 생성하고 credential정보를 만들고 cloudformation 으로 k8s cluster까지 생성하는 것을 마무리 하였다. k8s 노드도 여러개 만들어 보면서 "편한 툴이군" 이라고 생각하던 찰나

container 생성이 안된다.

이슈를 리포팅 하니 https://github.com/kubernetes/kubernetes/issues/41070 다음과 같은 댓글이 달렸다.

The k8s 1.5 assume it's unsafe to deploy user containers to master. So master will be tainted as NoSchedule by default

우회해서 띄울수도 있지만 어찌된 영문인지 k8s node에는 컨테이너가 뜨지 않는다 OTL

다시 마음을 고쳐먹고(포기하는데 3일 걸림)

STEP 3 : https://kubernetes.io/docs/getting-started-guides/aws/ 가이드를 따라 해보기 시작했다.

이 방식의 경우 ubuntu에서 saltstack기반으로 k8s를 생성해준다.

뭔가 친숙한..그리고 aws에 기본적인 개념정도만 알고 있다면 쉽게 구축할 수 있다.

kube-up.sh을 실행하고 나니 다양한 서비스가 오픈이 된다.

aws에 k8s 대시보드는 물론 heapster도 deploy되어 자원에 대한 모니터링도 가능하다.

이외에도 kibana, influxdb, elasticsearch등이 같이 deploy된다.

k8s에서 생성된 서비스의 endpoint는 동적으로 aws에 ELB에 매핑된다.

서비스를 많이 만들수록 돈이 좀 더 들긴 하겠지만 나름 편리한 기능이다.

kube dashboard

다음편에서는 k8s클러스터에 컨테이너를 올리고 난 후 협업하는 분석가의 멘붕을 초래하게 한 에피소드를 소개하려고 한다.

TO BE CONTINUED


Popit은 페이스북 댓글만 사용하고 있습니다. 페이스북 로그인 후 글을 보시면 댓글이 나타납니다.