이 모든 단축키는 Mac OS X 10.5+을 기준으로 작성됐습니다. 
맥 특수문자 입력법 
command + control + Space

전 직장동료들로부터 IntelliJ가 좋다는 소리는 많이 들었지만, 이클립스에 익숙해져서 바꾸는 게 쉽지 않았다.
마치 쿼티 자판을 계속 사용하는 것처럼, 지속하면 평생 더 편한 도구를 못 쓸거 같아 이번 기회에 바꾸려고 한다.


Action 검색
젤 중요한 기능  - Thema변경 및 replace 등 위에 언급한걸 다 이걸로 가능 
$  ⇧(shift) +  ⌘(command) + a

위 명령어를 쳐서 "Enter action or option name”창이 뜨면, plugins을 입력


메인메소드 생성하고 실행
$ ⌃(command) + n 



main method만드는법 psvm을 누르고 enter!

 

sout는 system.out.println의 축약어 


Run을 할 때, 명령어 
$ ^(control) + ⇧(shift) + R

라인 copy하기
$ ⌘(command)+ d 

라인 delete하기 
$ ⌘(command)+ z 

라인합치기
$ ^(control) + ⇧(shift) + j



코드 라인 옮기기 
$ ⌥(option) + ⇧(shift) + 방향키

필요 argument보는 법
$ ⌘(command)+ p


함수내용보기
$ ⌥(option) + space
#클래스에 하면 전체 코드가 보임 ( html, javascript같은 정적파일도 가능 [community version이 아닐시 가능])


Doc 보기 ( 코드에서 아래키를 누르면 된다 )
$ F1

단어별 이동
$  ⌥(option) + 방향키

라인 맨 앞, 맨 뒤로 가기
$ fn + 방향키 

오류라인으로 가기
$ F2

검색
$ ⌘(command)+ f

텍스트 교체 
$ ⌘(command)+ r

프로젝트에서 텍스트 검색
$ ⌘(command)+ ⇧(shift)  + f


프로젝트에서 텍스트 교체 기능
$  ⌘(command)+ ⇧(shift)  + r



열었던 모든 파일을 볼 수 있음
#  ⌘(command) + e


import 자동완성 
$ ⌥(option) + ↩︎


자동완성
$  ^(control) + ⇧(shift)  + space


자동완성
$  ^(control) + ↩︎


상속시 추상 메소드 구현
$ ^(control) + i

변수 추출
$ ⌘(command) + ⌥(option) + V

파라미터 추출
$ ⌘(command) + ⌥(option) + P

메소드 추출
$ ⌘(command) + ⌥(option) + M

변수명 바꾸기 
$ ⇧(shift)  + F6

사용하지않는 import 다 제거 
$ ⌘(command) + ⌥(option) + O

아래처럼 optimize import on을 하면 자동화된다.


코드 정렬
$ ⌘(command) + ⌥(option) + L

디버그 기능


$ ^(control)  +⇧(shift)  + D


'etc > mac' 카테고리의 다른 글

맥에서 mariadb설치  (0) 2018.03.04
맥에서 윈도우 설치(VMWare Fusion )  (1) 2018.02.17
AppCleaner - 앱 깔끔하게 지우기  (0) 2018.02.16
맥에서 패키지관리(brew)  (0) 2018.02.10
요즘 관심 있는 분야가 웹, 빅데이터, 인프라, AI인데, 이 포스팅은 인프라 관련된 내용! 

보통 개발자가 개인 피시에서 개발을 하고, 개발한 소프트웨어를 운영서버에 올리게 된다.

개발서버와 운영서버는 환경이 다르기에, 개발서버에서 설치한 소프트웨어들을 운영서버에도 설치해줘야 하고, 코드에 문제가 있을 시 다시 배포해줘야 한다. 
위 작업들이 실제 개발을 할 때, 생각보다 많은 비용(시간)이 소요될 수가 있다. 

또한, 이러한 작업을 사람이 직접 여러 서버에 하다 보면, 실수가 발생하여 서버 간 환경이 조금씩 달라질 수 있다. 이를 snowflake 서버라고 한다.  눈송이를 보면 다 똑같은 모양처럼 느껴지지만 실제론 다들 조금씩 다르다. 
( 모든 서버에 똑같이 설치된 거 같지만, 실제론 약간씩 다르다 ) 



운영하는 입장에서  가장 껄끄러운 게 오래된 서버라고 한다. 조금씩 다른 서버에 ( snowflake서버 ) 무슨 문제가 일어날지 모르기 때문에 .. 


이래서 나온 게 phoenix서버 !  
피닉스 서버는 말 그대로 불사조! 다시 살아나는 서버 ( 말 그대로 서버를 아예 비우고, 다시 설치함 [Immutable Server] )

기업들은 이러한 작업들을 자동화(생산성 향상) 하는 방안들에 대해 고민을 하게 되었다. 
그래서 나온 게  Infrastructure as Code 수작업으로 해오던 인프라 구축이나 변경 작업을 코드로 자동화하는것. 이러한 작업으로 인프라에 반복성과 확장성을 부여한다. 
이러한 Tools로 나온 게 Ansible, Chief, puppet, Terraform, AWS Cloudformation

위와 같은 자동화 기술이 발전하면서 Immutable Infrastructure( 서버가 배포된 후에 수정되지 않는 인프라 )란 말도 같이 이슈도 떠올랐다. 

Immutable Infrastructure : 아예 인프라 구축이나 변경 작업을 모두 자동화하자! 

이런 것을 가능하게 해주는 도구가 여러 가지가 있다. 
먼저 개발 환경과 동일한 환경을 이미지로서 제공해주는 Docker와 이를 관리하기 위한 Kubernetes, Docker Swarm, Apache Mesos 등의 도구가 있다. 
( bare metal서버 환경은 안 변하고 이미지만 교체하여 컨테이너로 띄우기 때문에 snowflake서버 같은 문제를 피할 수 있음 )

또한, 개발자가 코드를 commit 하면 빌드, 테스트, 배포 과정을 UI로서 제공하고, 특정 step에서 문제 발생 시 committer에게 알려주는  CI/CD Pipeline 툴인 Jenkins와 Spinnaker도 있다. 
( 코드를 빌드 하면 테스트와 배포하는 과정을 자동화함으로써 비용을 절감 )

예) jenkins 화면



이러한 기술의 발전으로 Dev + Ops( 개발팀과 운영팀 사이의 소통, 협업을 강조하는 S/W 개발 방법론 ) 가 가능해졌고, 많은 기업들이 도입하고 있다. 
DevOps를 잘하고 있는 기업으로는 Netflix, Facebook 가 대표적으로 떠오르고 있다. 
빠른 배포 주기를 통해 더욱 효율적으로 작업하고 더 빠르게 혁신하며 기업과 고객을 대상으로 더 큰 가치를 제공할 수 있도록 돕는다.



'apps > docker' 카테고리의 다른 글

쿠버네티스란 무엇인가?  (0) 2018.08.18
도커란 무엇인가?  (0) 2018.08.04
flannel을 통한 pod간 통신  (2) 2018.07.03
도커에서 nodejs+mongodb 테스트  (0) 2018.07.01
kubernetes에서 gpu pod생성( nvidia-docker2 )  (2) 2018.05.30
오늘은 Apache Zookeeper에 관해 설명하고자한다.

주키퍼는 Apache 재단의 오픈소스 프로젝트 중 하나이다.

홈페이지를 보면  zookeeper: A Distributed Coordination Service for Distributed Applications
분산 어플리케이션을 위한 분산 협력 서비스라고 써있다. 

zookeeper의 뜻은 사육사란 뜻인데, Apache에서 다양한 프로젝트들을 보면 hadoop(코끼리), hive(꿀벌) 등 각 프로젝들이 동물로서 표현된다.
이러한 동물들을 관리해주는 사육사라고 생각하면 된다.
 zookeerper 이미지 : 




그럼 이제 좀 더 자세히 알아보자.

주키퍼의 설계 목표는 간단하고, 복제되고, 순서가 있고, 빠르다 .
자세한 내용은 위 링크를 참조하면 된다.

 설계 목표를 정리해보면, 주키퍼는 간단하게 설계되었다. 아래와 같은 그림의 형태로 계층형 네임스페이스를 가지고 데이터를 저장한다.
이때, 데이터를 메모리상에서 유지하여 높은 처리량과 낮은 지연률을 가능하게 하였다.

( 이 그림을 보면 계층형 구조로 된 것을 볼 수 있는데, 각 계층의 네임스페이스를 znode라고 한다 - 이곳에 데이터를 저장 가능하다  )

두번째,  아래 그림처럼 서버들끼리 연결되어 서로 데이터가 복제되는데, 주키퍼 서비스는 메모리와 영속적인 저장소에 트랜잭션 로그, 스냅샷을 유지한다.
( 영속적이란 말이 좀 이상한데, 별도의 지워지지않은 파일시스템 같은곳에 기록한다는 말 ) 
서버의 과반수가 살아있음 서비스를 유지할 수 있다. 


세번째, 주키퍼는 각 업데이트 순서를 기록하는데, 이 숫자는 주키퍼 트랜잭션에 쓰인다.  ( 이를 통해 동기화가 가능 ) 

네번째, 주키퍼는 읽는 작업에서 빠르다. 쓰는 작업보다 읽기에 적합하다. 
( 내 생각엔 쓰는건 위에서 복제를 통해 데이터를 공유하는 과정이 있어서 느린 듯싶다 ) 


주키퍼 구성요소인데, 쓰기 요청을 받음 브로드캐스트를 통해 연결된 서버들에게 데이터를 보내고 데이터베이스에 저장된다.
읽기 요청이 된, 그 데이터베이스에 요청을 보낸 후 응답을 받는다. 


주키퍼에 데이터를 저장할 때, ephemeral(하루살이) 모드를 설정 할 수 있는데, 이렇게 설정할 경우 znode 에 저장 된 데이터는 자동으로 읽고 쓰여지는 것을 막는다.
즉, 세션이 종료되면 데이터가 날라감 

또한, 주키퍼의 watch기능을 제공한다. znode에 watch을 set하면, 그 znode에 변화가 일어나면 trigger된다. 
( 실제, 지속적으로 상태를 감시 해야 되는 서비스 같은 경우 znode에 상태를 기록하고 읽는 식으로 구현할 수도있다 )  


지금까지 설명한 부분이 zookeeper의 핵심 내용들이다. 실제 zookeeper은 "분산 어플리케이션을 위한 분산 협력 서비스"라 설명되고 있지만, 분산 파일 시스템이라고 생각해도 무방할 거 같다.
보는것과 같이 간단하지만 분산 파일 시스템으로서 watch기능, 동기화 등 많은 기능을 제공하기에 사용하기 편리하고 유용할 것이다.

실제 kafka에서도 metadata부분을 zookeeper에 기록하는 식으로 구성을 해놨다. 분산된 노드에서, 공유 된 파일 시스템이 필요하면 zooekeeper을 고려하면 충분히 비용을 아낄 수 있을 거라 생각한다.
하지만 zookeeper는 light하게 쓰는 것을 권장한다. (개인적생각)  
데이터를 메모리에 올려놓아서 높은 처리량과 낮은 지연률을 자랑하지만, 큰 데이터를 기록하긴 안 좋은거같다.






크롤링 도구를 선택할 때, 사용하기 편하고 기능을 많이 제공하는걸 사용하고 싶었다.
그러던 중, Scrapy에서 많은 기능을 제공한다고해서 사용해보기로 마음먹었다. 

# 아까 가상환경을 통해 만든 환경으로 접속 
$ workon test

#프로젝트를 만들어준다. 
$ (test) root@447fe7338239:~/.virtualenvs/test# scrapy startproject tutorial

# 위와같이 프로젝트를 만들면, 자동으로 파일들이 생긴다. 좀더 편하게 개발할려면 pycharm같은 도구를 설치하는 것을 추천!

먼저 items.py 에 가져올 아이템을 정의한다.
여기선 title, link, desc을 가져오기로 정의
import scrapy

class DmozItem(scrapy.Item):
   title = scrapy.Field()
   link = scrapy.Field()
   desc = scrapy.Field()


이제 파싱을 해야되는데, 실제 크롤링하고 싶은 사이트와 비교하면서 하면 편하다.  ( 다들 아시겠지만 크롬에서 개발자 도구를 가면 해당 Elements들을 확인가능하다 ) 


위 Elements에 <div class= "title-and-desc”> 인 element을 긁어와서 title, link, desc에 파싱해줄거다.
위 Elements들과 아래 코드들을 비교하면, 금방 익숙해질것이다. 

이제 정보을 수집할 spider을 만들어 준다. spiders directory안에 아래와 같이 만들어주었다.
dmoz_spider.py
import scrapy
from tutorial.items import DmozItem

class DmozSpider(scrapy.Spider):
   name = "dmoz"
   allowed_domains = ["dmoz.org"]
   start_urls = [
   ]

   def parse(self, response):
       for sel in response.xpath('//*[@class="title-and-desc"]'):
           title = sel.xpath('a/div[@class="site-title"]/text()').extract()
           link = sel.xpath('a/@href').extract()
           desc = sel.xpath('div[@class="site-descr "]/text()').extract()

           item = DmozItem()
           item['title'] = title
           item['link'] = link
           item['desc' = desc
           yield item

# yield는 generator다 아이템이 생성될때마다 리스트형태로 쌓이게 된다. 
( stack형태로 쌓이게 됌 ) 

실행
$ scrapy crawl dmoz


json형태로 저장
scrapy crawl dmoz -o items.json


이것으로 간단하게 크롤링을 해보았다. 
더 많은 정보는 공식사이트에 가면 자세히 나와 있다. scrapy는 필터 등 다양한 기능을 제공하니, 적은 비용으로 크롤링 서비스를 구축하고 싶으면 한번 시도해봤음한다.





'apps > crawling' 카테고리의 다른 글

scrapy를 통해 크롤링 해보기 - 설치  (0) 2018.09.13
scrapy설치 ( ubuntu에서 진행 ) 
python가상환경을 통해 만들어주었다. 
이런식으로 안 해도 되지만, 프로젝트별로 별도로 환경을 구축하면 라이브러리도 안 꼬이고 편하다.

# 먼저 앱 업데이트를 먼저 해준다.
$ apt-get update 
# gcc나 make등 개발하기 위한 기본 패키지
$ apt-get install build-essential

# python을 설치 하고, pip도 설치해준다.
$ apt-get install python
# 버전 확인
$ python -V
# python package관리를 위해 python-pip설치
$ apt-get install python-pip 

# 파이썬 가상환경 구축 ( 가상환경을 사용 안 해도 되지만, library가 꼬일 가능성이 있기에 가상환경을 구축하였다 ) 
#virtualenvwrapper :  virtualenv을 사용하기 쉽게 제공
$ pip install virtualenv virtualenvwrapper

# vim 이없어서 설치해줌 .. 
$ apt-get install vim

# 환경변수에 넣어준다.
$  vi .bashrc
# 맨 아래 두줄 추가
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

# 바로 적용 
$ source .bashrc

# test라는 가상환경 패키지생성
$ mkvirtualenv test

(test) root@447fe7338239:~#
나갈땐 
$ deactivate

들갈 땐 
$ workon test

# 설치되는 위치 
$  cd .virtualenvs/


########## scrapy설치
$ apt-get install libffi-dev libssl-dev
$ pip install Scrapy




'apps > crawling' 카테고리의 다른 글

scrapy을 사용하여 크롤링 - 실전  (0) 2018.09.13
ELK STACK이란 ?



Log 및 데이터 분석을 한다고 할 때, 가장 먼저 떠 오르는 도구는 ELK Stack이다.

ELK는 수집 기능을 하는 Logstash, 분석 및 저장 기능을 담당하는 ElasticSearch, 시각화 도구인 Kibana의 앞 글자만 따서 ELK Stack이라고 한다.
이런 조합이 많이 떠오르는 이유는 접근 용이성 때문이라고 생각한다. 

ELK vs Apache echo system으로 비교해보았을 때, ELK가 더 접근성이 좋다.
하지만 좀 더 깊게 들어가서, 큰 시스템을 구축한다고 가정한다면 Apache echo system이 좀 더 유리하다고 생각된다.

ELK을 공부하며 느낀 점은 맘만 먹으면 하루 만에 간단한 기능을 제공할 수 있을 정도로 쉽다는 점이다.

LogStash
먼저 Logstash에 대해 살펴보자 

Logstash는 수집기능을 제공한다고 했다. 아래 그림을 보면 좀 더 명확히 이해할 수 있다. 
다양한 입력형태의 데이터를 읽어, 데이터 필터 기능을 제공하고, 다른 저장소에 저장도 가능하다. 



예로서 logstash설정파일을 보자 
$ logstash-simple.conf

input {
  file {
   # csv 파일에서 받음
    path => "/home/Documents/sample.csv"
   # 파일에서 처음부터 받을라면 beginning (보통은 end가 default )
    start_position => “beginning"
   # 데이터 offset정보가 sincedb에 저장 
    sincedb_path => "/dev/null"
  }
}
#필터 ( csv에서 ,를 분리자로 사용 )
filter {
  csv {
      separator => ","
      columns => [“Test”,”data1”,"data2"]
  }
# float로 변환
  mutate {convert => [“data1", "float"]}
  mutate {convert => [“data2", "float"]}
}
output {
    elasticsearch {
        hosts => "localhost"
        index => “test"
    }
    stdout {}
$ cat sample.csv

Test,data1,data2
abc,100,200
Bcd,200,300
Jas,400,100
이러고 실행함 수집이 된다. ( 무척 쉽다 )
$  ./logstash -f logstash-simple.conf


ElasticSearch
이제 ElasticSearch에 대한 간단 예를 보여주겠다. 

ElasticSearch는 Rest API형식으로 기능을 제공하는데, 아래와 같이 document들을 index기반으로 저장을 하므로 검색 시 Relational DB보다 빠르다. 


Elastic Search와 Relational DB을 비교한 표다
Elastic Search
Relational DB
Index
DataBase
Type
Table
Document
Row
Field
Column
Mapping
Schema

Elastic Search
Relational DB
GET
Select
Put
Update
Post
Insert
Delete
Delete
ElasticSearch는 Rest기반으로 제공하기 때문에 아래와 같이 사용해야한다.
Elastic Search
Relational DB
curl -XGET localhost:9200/classes/class/1 
select * from class where id =1
curl -XPOST localhost:9200/classes/class/1 -d ‘{xxx}'
insert into class values {xxx}
curl -XPUT localhost:9200/classes/class/1 -d ‘{xxx}'
update class set xxx where id = 1
curl -XDELETE localhost:9200/classes/class/1
delete from class where id = 1
Logstash을 거치지 않고도 ElasticSearch에 데이터를 넣고, 조회가 가능하다.
하지만 지금은 ELK에 대해 이해하기 위함 이기에 이 과정은 생략하였다.


Kibana
키바나는 설치 후, 조회할 indexname을 저장하면 다양한 차트를 만들 수 있다.



다양한 형태로 데이터를 볼 수있다. 더 많은 기능은 kibana홈페이지 팜고



이렇게 지도로도 제공가능하다.



많은 오픈소스들을 사용하면서, 절대적으로 좋은 도구는 없다고 생각한다.
주어진 상황에 맞춰서 사용하면, 좀 더 개발하는데 비용을 아낄수 있을 것이다.











참조 :

도커란 무엇인가? 포스팅에 이어 쿠버네티스에 정리하고자한다. 

 위키백과에서 쿠버네티스를 찾아보면 "쿠버네티스(Kubernetes, 쿠베르네테스, "K8s"[3])는 디플로이 자동화, 스케일링, 컨테이너화된 애플리케이션의 관리를 위한 오픈 소스 시스템으로서[4] 원래 구글에 의해 설계되었고 현재 리눅스 재단에 의해 관리되고 있다. 목적은 여러 클러스터의 호스트 간에 애플리케이션 컨테이너의 배치, 스케일링, 운영을 자동화하기 위한 플랫폼을 제공하기 위함이다.[3] 도커를 포함하여 일련의 컨테이너 도구들과 함께 동작한다.” 라고 나온다.

 처음 저 글을 봤을 땐 전혀 와 닿지 않지만, 쿠버네티스를 이용해 서비스를 짧은 기간인 3개월 정도 운영해본 후, 저 글을 다시 읽으니 저 3문장에 쿠버네티스를 아주 잘 설명 한 거같다. 요즘 오픈소스의 이름들을 보면 명칭에 아주 신경을 많이 쓴 것을 알 수 있는데, 쿠버네티스는 그리스어로 키잡이를 뜻한다고 한다. 




kubernetes는 플랫폼 이름이 길어서 줄여 k8s라고도 한다. 앞으로는 k8s라고 적겠다. ( 8은 kubernetes의 중간의 글자라고 생각하면 된다 )
 왼쪽 그림은 k8s의 마크다. k8s가 앞서 키잡이(배의 키를 조정하는 사람)를 뜻한다고 했는데, 옆에 도커마크랑 같이 봄 이해가 간다.

도커란 배들의 키잡이 역할을 해주는 플랫폼이구나 하고 넘어가면 된다.

그럼 k8s가 왜 필요한지 생각해보자 우리한테는 앞서 여러 application을 올릴 수 있는 컨테이너 플랫폼인 도커를 공부 하였다. 

도커만으로 충분하지 않을까? 
물론 경우에 따라선 도커만으로 충분하다. 앞으로는 관리자 역할에서 생각해보자.
하나의 노드에서 여러 컨테이너를 띄우다 보니 자원( disk, memory, cpu )이 부족하기 시작했다. 

관리자 : 서버를 하나 추가해서 컨테이너를 나눠서 노드에 담자


위 그림처럼 노드를 하나 늘려서 도커를 설치하였다. 하지만 관리하는 노드가 많아질수록 점점 복잡해진다.
또한 이러한 요구사항이 올 수도있다.

클라이언트 :  웹 서버를 배포할 건데 죽으면 안되니까 이중화로 구성해주고 로드밸런서를 둬서 트래픽을 분산시켜줘. !
관리자 :#@($

예가 이상할 수도 있지만, 간단하게 k8s의 필요성에 관해 설명하고자 했다. 
k8s은 위에서 필요한 기능들을 다 제공하고 있다. ! 

대충 이런 그림 !




그럼 좀 더 자세히 k8s의 아키텍처를 보자 
( 처음에 모르는 오픈소스를 볼 때, 이러한 그림부터 보면 좀 더 시간을 아낄 수 있다 )




일단 각각의 역할을 그림을 보면서 이해해보자. 
큰 그림으로 보면 kubectl을 통해 받은 명령어를 api server를 통해 kubelet으로 전달하면 Pod( container 묶음 )를 생성하며 서비스를 제공한다. 물론 메타데이터를 저장하는 etcd, 다양한 제어기능을 위한 controller-manager, 자원분배를 도와주는 scheduler, 네트워크 트래픽을 담당하는 kube-proxy도 있다. 

자세히 적으면 처음 k8s을 접하는 사용자의 이해에 어려움이 있을 수 있어, 여기서는 간략하게만 소개하고 나중에 좀 더 자세히 소개하도록 하겠다.

kubectl : kubectl은 간단하게 명령어를 보내는 역할만 한다. 
예) kubectl get pods  ( pod들을 확인하는 명령어  )
API server : 간단하게 명령어를 전달해주는 역할만 진행한다. 또한 etcd클러스터랑 통신한다. 이 정도만 알고 가자 !
( 기본적으로 REST방식으로 통신한다 ) 
etcd : kubernetes 클러스터 데이터(포드 수,상태,네임 스페이스 등), API 객체 및 서비스 검색 세부정보를 저장하는 데 사용되는 분산 키 값 저장소다. 
( 메타 데이터가 저장되는 역할을 한다 생각하면 된다 ) 
controller-manager :  컨트롤러 매니저는 복제, 서비스계정, 네임스페이스 등을 생성하고 이를 각 노드에 배포하며 관리하는 역할을 한다.
( 여기선 사용자가 다양한 설정을 정할 수 있는데 이러한 것을 제어하기 위해 도와주는 역할이라고 간단하게 넘어가자 ) 
scheduler : 스케줄러는 Pod,서비스 등 각 자원을 적절한 노드에 할당하는 역할을 한다.
kubelet :  노드는 기본적으로 정기적으로 새로운 pod 또는 수정된 pod의 사양으로 포드 및 컨테이너가 원하는 상태로 실행되고 있는지 확인한다.
kube-proxy :  노드로 들어오는 네트워크 트래픽을 적절한 컨테이너로 라우팅하고, 로드밸런싱 등 노드로 나가는 네트워크 트랙픽을 프록시하고 노드와 마스터간 통신을 관리한다.

이 포스팅은 k8s가 무엇인지 이해하는 것이 목적이기 때문에, 이해를 쉽게 하기 위해 어려운 내용은 다 제거했다. 좀 더 자세한 내용은 시간이 생긴다면, k8s 내부 컴포넌트들이 어떤 식으로 통신하는지 그림과 같이 정리할 생각이다.


 


'apps > docker' 카테고리의 다른 글

DevOps가 떠오른 이유  (0) 2018.11.25
도커란 무엇인가?  (0) 2018.08.04
flannel을 통한 pod간 통신  (2) 2018.07.03
도커에서 nodejs+mongodb 테스트  (0) 2018.07.01
kubernetes에서 gpu pod생성( nvidia-docker2 )  (2) 2018.05.30
docker에 대해 공부하면서 느낀 점을 공유하면 좋을 것 같아 포스팅합니다.


먼저 도커란 무엇인가 ? 
 공식 홈페이지에서 도커의 개요를 보면 도커란 "Docker는 컨테이너 이동을 주도하는 회사이며 하이브리드 클라우드의 모든 애플리케이션을 처리할 수 있는 유일한 컨테이너 플랫폼 제공 업체입니다“ 라고 쓰여있다. 

여기서 '컨테이너'란 말에 주목할 필요가 있다. 
컨테이너란 무엇일까? 
아래 그림을 보면 대충 감이 온다. 아래에 도커 이미지를 보면 귀여운 배 위에 컨테이너를 올린 모습을 볼 수 있다. 
대충 아! 컨테이너란 "다양한 OS에 여러 application이 올려져 있는 것"을 의미하는 거고 그런 컨테이너를 도커 위에 올리는구나 





그럼 이미 존재하는 Virtual Machines랑 뭐가 달라 ..? 
물론 다르다 위에 그림을 보면 각 컨테이너가 같은 Kernel을 공유하고 있는 모습을 볼 수 있다.


 위 그림을 보면 좀 더 명확하다. 
virtual machine의 경우 Hypervisor을 통해 가상화 기능을 제공한다. 각 독립 된 커널 공간을 가진 OS를 생성하는 식의 환경 구성을 해준다.
containers의 경우 커널 공간을 공유하며 같은 가상화 기능을 제공해준다.

* 같은 커 널공간을 공유하기 때문에 virtual machines보다 좀 더 가볍다. 


이런 구성도 가능하다.!! ( Virtual Machine에 OS를 설치 후 Docker를 설치 )
* 물론 이런 구성으로 실제 서비스를 제공하는 기업은 없을 거로 생각한다.  


어떻게 이런 게 가능할까 ? 
namespaces 와 cgroup에 대해서 알아야 한다. 

namespace 
먼저 리눅스 커널의 주요 이름 공간에 대해서 알아보자.
이름공간
기능
Mount namespace
파일 시스템 분리
UTS namespace
호스트 네임 분리
IPC namespace
프로세스간 통신 분리
User namespace
유저(UID/GID) 분리
PID namespace
프로세스 테이블 분리
Network namespace
네트워크 설정 분리
이름 공간은 모두 리눅스 상에서 동작하는 프로세스에 할당하는 자원을 분리하는 기능을 한다.

cgroups (Control Groups)
cgroups(Control Groups)는 자원(resources)에 대한 제어를 가능하게 해주는 리눅스 커널의 기능입니다.
cgroups는 다음 자원을 제어할 수 있다.
* 메모리, CPU, I/O, 네트워크, device노드

사실 이러한 기술이 처음 나온 건 아니다. LXC 등 유사한 기술이 많았으나 도커가 히트친 이유는 사용자 편의성 ( 이미지 repository 등 )에 있다고 생각한다

그럼 마지막으로 도커 이미지에 대해 알아보자.

도커 이미지
도커 이미지는 특정 프로세스를 실행하기 위한 환경이다. 
이 이미지는 필자가 가진 이미지들이다. 
Default registry ( hub.docker.com )에 등록된 centos:7같은 이미지를 가져올 수도 있고, 개인적으로 172.30.1.19:5000같은 registry을 등록해서 이미지를 주고 받을 수도 있다.
또한 nodejs-mongodb-test처럼 자신이 만든 서비스( api서버로 데이터를 받아 mongodb에 저장하는 간단한 서비스)를 이미지로써 제공할 수도 있다. 
yjhui-MacBook-Pro:elk yjh$ docker images
REPOSITORY                TAG                     IMAGE ID            CREATED             SIZE
nodejs-mongodb-test       yang                    ffe8520fe8cd        4 weeks ago         664MB
172.30.1.19:5000/centos   7                       e934aafc2206        3 months ago        199MB
centos                    7                       e934aafc2206        3 months ago        199M
mongo                     latest                  9a63ed32fc2b        5 weeks ago         378MB

도커를 사용하며 가장 편리한 점은 서비스를 만들어 상용 서버에 배포를 하려고 하면 환경이 달라 예상치 못한 일들이 발생해서 반나절을 보낸 경우가 많았다....
도커를 사용한다면 이런 불필요한 삽질을 줄일 수 있을 거로 생각한다. 
이미지를 구워서 실행하면 배포 완료..?  또한 서비스가 죽어도 다시 살리는 기능도 제공한다. 

물론 실제 서비스에서 도커를 통해 서비스를 안정적으로 제공하기 위해서는 도커에 대해 좀 더 공부가 필요하다.
앞으로의 포스팅은 도커의 다양한 기능에 대해 공부해 포스팅할 예정이다. 



'apps > docker' 카테고리의 다른 글

DevOps가 떠오른 이유  (0) 2018.11.25
쿠버네티스란 무엇인가?  (0) 2018.08.18
flannel을 통한 pod간 통신  (2) 2018.07.03
도커에서 nodejs+mongodb 테스트  (0) 2018.07.01
kubernetes에서 gpu pod생성( nvidia-docker2 )  (2) 2018.05.30
간단한 내용이지만 이 간단한 정보를 확인하는데 불필요한 삽질을 하였기에 도움이 될까 포스팅합니다.

서로 다른 노드에 있는 pod간 통신을 완성하기 위해서는 관련 기능을 제공하는 network plugin이 필요하다.
필자의 경우는 flannel plugin을 설치했다.

구글링하다 좋은 케이스를 찾았기에 공유

* 만약 잘못된 정보가 있으면 지적해주세요




그림을 보면 노드1에서 노드2로 다른 ip끼리 패킷을 보낼 때, 보내는 컨테이너의 출발지와 목적지를 가지고 있는 모습을 확인 할 수 있다.
그리고 flannel에서 패킷을 주고받는 node의 출발지와 목적지 정보를 UDP로 캡슐화해서 보내는 역할을 수행한다. 
이런 식으로 flannel plugin을 설치하여 컨테이너 간 통신을 할 수 있다.

테스트한 yaml파일은 아래와 같다.
$ cat cent.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - image: centos:7.2.1511
        name: test
        command: ["/bin/bash","-c","while true; do sleep 1000; done"]
        imagePullPolicy: IfNotPresent



$ cat mysql.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  labels:
    name: mysql-pod
    context: docker-k8s-lab
spec:
  containers:
    -
      name: mysql
      image: mysql:5.7
      env:
        -
          name: "MYSQL_USER"
          value: "mysql"
        -
          name: "MYSQL_PASSWORD"
          value: "mysql"
        -
          name: "MYSQL_DATABASE"
          value: "sample"
        -
          name: "MYSQL_ROOT_PASSWORD"
          value: "supersecret"
      ports:
        -
          containerPort: 3306

yaml을 통해 centos, mysql을 실행하여 centos pod에서 mysql에 접속되는 지 테스트

pods 확인
$ kubectl get pods
mysql-pod                       1/1       Running   0          6m
test-6b5c774944-fqcdl           1/1       Running   0          17m


mysql을 설치해준다.
$ yum install mysql 

master서버에서 mysql pod의 ip주소 체크
$  kubectl describe pod test-6b5c774944-fqcdl
Name:               mysql-pod
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               jf-api/192.168.0.89
Start Time:         Tue, 03 Jul 2018 17:32:13 +0900
Labels:             context=docker-k8s-lab
                    name=mysql-pod
Annotations:        kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"context":"docker-k8s-lab","name":"mysql-pod"},"name":"mysql-pod","namespace":"d...
Status:             Running
IP:                 10.244.1.53
Containers:
  mysql:
    Container ID:   docker://ee63968f90c86a3062627a68c3830d425b1b385ebc61cc1c960e824411799f7e
    Image:          mysql:5.7
    Image ID:       docker-pullable://mysql@sha256:f030e84582d939d313fe2ef469b5c65ffd0f7dff3b4b98e6ec9ae2dccd83dcdf
    Port:           3306/TCP
    State:          Running
      Started:      Tue, 03 Jul 2018 17:32:16 +0900
    Ready:          True
    Restart Count:  0
    Environment:
      MYSQL_USER:           mysql
      MYSQL_PASSWORD:       mysql
      MYSQL_DATABASE:       sample
      MYSQL_ROOT_PASSWORD:  supersecret
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-dn4mq (ro)
Conditions:
  Type           Status
  Initialized    True
  Ready          True
  PodScheduled   True
Volumes:
  default-token-dn4mq:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-dn4mq
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason                 Age   From               Message
  ----    ------                 ----  ----               -------
  Normal  Scheduled              9m    default-scheduler  Successfully assigned mysql-pod to jf-api
  Normal  SuccessfulMountVolume  9m    kubelet, jf-api    MountVolume.SetUp succeeded for volume "default-token-dn4mq"
  Normal  Pulled                 9m    kubelet, jf-api    Container image "mysql:5.7" already present on machine
  Normal  Created                9m    kubelet, jf-api    Created container
  Normal  Started                9m    kubelet, jf-api    Started container


centos접속 후 mysql 접속확인
$ kubectl exec -it test-6b5c774944-fqcdl /bin/sh

sh-4.2# mysql -h10.244.1.22 -umysql -pmysql -Dsample
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.22 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [sample]

이와 같이 pod간 커뮤니케이션을 flannel을 통해 할 수 있다는 것을 확인했다.!




 



'apps > docker' 카테고리의 다른 글

쿠버네티스란 무엇인가?  (0) 2018.08.18
도커란 무엇인가?  (0) 2018.08.04
도커에서 nodejs+mongodb 테스트  (0) 2018.07.01
kubernetes에서 gpu pod생성( nvidia-docker2 )  (2) 2018.05.30
centos7에서 nvidia driver설치하기  (0) 2018.05.28

최근 도커를 공부하다가 다른 컨테이너에 있는 프로세스끼리 어떤 식으로 통신하는지 궁금해져서 테스트를 해봤다. 

 
도커를 통해 두 개의 컨테이너를 만들 건데 하나는 nodejs 하나는 mongodb을 띄울 거다.


움 완성하고 보니 대충 이런 그림?


코드는 아래와 같이 진행하면 된다.


완성하고 보니 link로 연결하면 컨테이너의 /etc/hosts  에 다른 컨테이너 아이디가 등록된 것을 확인할 수 있었다.


도커프록시를 통해 내부에서 할당받은 아이피대역대끼리는 통신이 되기 때문에 이런 식으로 가능한 듯 ..


문득 궁금한게 k8s에서는 pod간 통신이 궁금해진.. ( 다음 포스팅에 올려볼예정 )


** 이 포스팅에 잘못 된 내용이 있으면 지적해주세요 


nodejs-mongo-test

First : mongodb을 시작한다. ( 여기선 docker를 이용하여 시작 ).


몽고디비 컨테이너에 생성

$ docker run --name mongo -p 27017:27017 -d mongo

도커 프로세스 확인

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
b2482f6a58be        mongo               "docker-entrypoint.s…"   5 minutes ago       Up 5 minutes        0.0.0.0:27017->27017/tcp   mongo

컨테이너에 접속

$ docker exec -it mongo /bin/bash

mongo를 입력하여 제대로 동작하는지 확인

root@b2482f6a58be:/# mongo

MongoDB shell version v4.0.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.0
Server has startup warnings:
2018-06-30T04:51:49.681+0000 I STORAGE  [initandlisten]
2018-06-30T04:51:49.681+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-06-30T04:51:49.681+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-06-30T04:51:50.154+0000 I CONTROL  [initandlisten]
2018-06-30T04:51:50.154+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-06-30T04:51:50.154+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-06-30T04:51:50.154+0000 I CONTROL  [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service to collect and display
metrics about your deployment (disk utilization, CPU, operation statistics,
etc).

The monitoring data will be available on a MongoDB website with a unique
URL created for you. Anyone you share the URL with will also be able to
view this page. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command:
db.enableFreeMonitoring()
>

>  db
test

Second : nodejs 실행


우선 해당 git에 프로젝트 다운

$ git clone https://github.com/yangjeehan/nodejs-mongo-test.git 

해당 도커파일을 통해 이미지를 만든다.

$ docker build -t nodejs-mongodb-test:yang

*만든 이미지를 실행한다. ( 전에 만든 mongo container을 link을 통해 연결 ) *

$ docker run -i --link mongo --name test -t nodejs-mongodb-test:yang /bin/bash 

만든 컨테이너에 접속하여 아래명령어 수행

$ docker exec -it test /bin/bash 
root@ee137a79dd4e:/usr/src/app# node demo_mongo_insert.js 

몽고디비에 접속해서 데이터 입력 체크

root@b2482f6a58be:/# mongo

> show databases;
admin   0.000GB
config  0.000GB
local   0.000GB
mydb    0.000GB

> use mydb
switched to db mydb
>
> show collections;
customers

> db.customers.find()
{ "_id" : ObjectId("5b371eb7d8daba00078e2fdf"), "name" : "Company Inc", "address" : "Highway 37" }

End


'apps > docker' 카테고리의 다른 글

도커란 무엇인가?  (0) 2018.08.04
flannel을 통한 pod간 통신  (2) 2018.07.03
kubernetes에서 gpu pod생성( nvidia-docker2 )  (2) 2018.05.30
centos7에서 nvidia driver설치하기  (0) 2018.05.28
kubenetes설치 실패 시 초기화방법  (0) 2018.05.28

+ Recent posts