'ubuntu'에 해당하는 글 5건



Linux 상에서의 Minikube 도 설치 방법이 여러가지이다. 우선 하이퍼바이저 상에서 Minikube 를 구동할 것인지, 호스트에서 직접 구동할 것인지를 선택해야 한다. 하이퍼바이저를 이용한다면 리소스를 더 알뜰히 사용할 수 있겠지만, 모든 리눅스에서 하이퍼바이저를 사용할 수는 없다. Widnows 편에서 말했듯이 CPU 의 가상화(VT-x/AMD-v) 지원과 Bios 에서 가상화 활성화 상태를 확인해야 하는데, 요즘 많이들 사용하는 클라우드 컴퓨팅 서비스(EC2, GCE) 등에서는 대부분 HVM 가상화를 사용하고 있고, 그 자체가 이미 VM 이므로 그들은 Bios 에 접근을 할 수 없다. 결국 클라우드 컴퓨팅에서는 하이퍼바이저를 사용할 수 없으므로 과감히 VM 사용을 포기한다.ㅠ 현재 상황이 Linux 에서 VM 을 돌리기 위해 멀쩡한 PC 들에 Linux 를 까기는 좀;; 아무튼 현재 상황에서는 Linux 에서 VM 없이 호스트에서 Minikube 를 직접 구동시켜는 방법을 사용해야 하며, VM 없이 Minikube 를 시작하는 명령은...


 # minikube start --vm-driver=none 


하지만 EC2 Linux 에서도 minikube 를 정상적으로 구동하기 위해 체크해야 할 것들이 있다.



Minikube 구동시 체크사항


  1. 2cpu, 2GB 메모리, 20GB 디스크 이상의 사양.
    EC2 에서 free-tier 인 t2.micro 는 1cpu, 1G 메모리로, minikube 를 구동할 수 없다. 최소 t2.medium 사양(2cpu, 4GB mem)이 필요하다.

  2. docker 설치(Container Runtime)와 cgroup driver 매칭
    docker 가 반드시 필요하며(docker.io 나 docker-ce), 설치 후 docker info | grep -i cgroup 명령으로 cgroup driver 가 cgroupfs 인지 systemd 인지 확인해야 한다. minikube 구동 후에 kubelet 의 cgroup driver 와 일치하지 않는 다면 관련을 참고하여 일치시킨다. VM 에서 구동시에는 docker 가 자동 설치되며 자동 매칭을 해준 부분이다.

  3. 구동 실패시 클러스터 삭제
    minikube start 로 클러스터가 생성되다가 에러가 발생하면 캐싱으로 인해 에러가 반복될 수 있다. 다시 구동하기 전에는 minikube delete 명령으로 생성된 클러스터를 제거해 준다.



EC2 에서 발생할 수 있는 에러 메시지


- virtualbox 미설치 메시지

# minikube start

o   minikube v0.35.0 on linux (amd64)

>   Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

@   Downloading Minikube ISO ...

 184.42 MB / 184.42 MB [============================================] 100.00% 0s

!   Unable to start VM: create: precreate: VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path


- 가상화 비활성화 메시지

# minikube start

o   minikube v0.35.0 on linux (amd64)

>   Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

!   Unable to start VM: create: precreate: This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory


- docker 미설치 메시지

# minikube start --vm-driver=none

i   This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true

>   Creating none VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

!   Unable to start VM: create: precreate: exec: "docker": executable file not found in $PATH


- cgroup driver 불일치 메시지

# minikube start --vm-driver=none

This error is likely caused by:

- The kubelet is not running

- The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)



EC2 (ubuntu) 에서 minikube 구동 성공


# minikube start --vm-driver=none

o   minikube v0.35.0 on linux (amd64)

>   Configuring local host environment ...


!   The 'none' driver provides limited isolation and may reduce system security and reliability.

!   For more information, see:

-   https://github.com/kubernetes/minikube/blob/master/docs/vmdriver-none.md


!   kubectl and minikube configuration will be stored in /root

!   To use kubectl or minikube commands as your own user, you may

!   need to relocate them. For example, to overwrite your own settings:


    - sudo mv /root/.kube /root/.minikube $HOME

    - sudo chown -R $USER $HOME/.kube $HOME/.minikube


i   This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true

>   Creating none VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

-   "minikube" IP address is 10.0.1.121

-   Configuring Docker as the container runtime ...

-   Preparing Kubernetes environment ...

-   Pulling images required by Kubernetes v1.13.4 ...

-   Launching Kubernetes v1.13.4 using kubeadm ...

:   Waiting for pods: apiserver proxy etcd scheduler controller addon-manager dns

-   Configuring cluster permissions ...

-   Verifying component health .....

+   kubectl is now configured to use "minikube"

=   Done! Thank you for using minikube!

root@ip-10-0-1-121:~# minikube status

host: Running

kubelet: Running

apiserver: Running

kubectl: Correctly Configured: pointing to minikube-vm at 10.0.1.121




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

td-agent.conf 설정

Tool/Fluentd 2017. 4. 10. 23:35

td-agent.conf 는 fluentd 의 설정 파일이다.


1. 어떤 경로를 통해서 input 이 들어왔는지 체크하고, 

2. 특정 경로나 tag 별로 데이터를 수집하여, 

3. 어디로 수집된 데이터를 보낼 것인지 등을 설정한다.


$ curl -X POST -'json={"json":"message"}' http://localhost:8888/debug.test
cs


이전 예제에서 처럼 HTTP input 에서 POST 메소드로 데이터를 json 포맷으로 변환하였고, 아래와 같이 td-agent.log 파일에 기록되었다.


2017-04-05 07:05:41 +0000 debug.test: {"json":"message"}
cs


이것은 /etc/td-agent/td-agent.conf 설정 파일에 위처럼 동작하도록 기본값이 설정되어 있기 때문이다.

설정 파일인 /etc/td-agent/td-agent.conf 를 열어보자.


<match debug.**>
  @type stdout
</match>
 
<source>
  @type forward
</source>
 
<source>
  @type http
  port 8888
</source>
cs


하나의 <match> 지시자와 두개의 <source> 지시자가 보인다.

<source> 는 어떤 방식의 이벤트를 받을지 결정하는 지시자이다.

@type 에 특정 input 플러그인(위 예제에는 forward, http) 을 지정하여 그 방식의 이벤트만 받겠다는 것이다.

http 는 HTTP 8888 포트를, forward 는 TCP 24224 포트(default) 를 Listen 하고 있다.

그렇게 입력된 이벤트 중 <match> 지시자에 일치하는 tag(위 예제에는 debug.** 에 해당하는 모든 tag) 를 output 플러그인인 stdout 처리하도록 되어 있다.

이 stdout 플러그인은 /var/log/td-agent/td-agent.log 파일에 기록되며 디버깅에 유용하다.


아래와 같이 fluent-cat 디버깅 도구를 이용하여 forward 입력 플러그인으로 메시지를 보낼 수 있다.


echo '{"json":"message"}' | /opt/td-agent/embedded/bin/fluent-cat debug.test
 
2017-04-05 07:15:23 +0000 debug.test: {"json":"message"}
cs


output 형태는 다음과 같이 세 부분으로 구성된다.


- time : 2017-04-05 07:05:41 +0000

- tag : debug.test

- message : {"json":"message"}


tag 는 <match>, <filter> 등의 지시자를 사용하여 구분할 때 주로 사용하며, message 형태는 항상 JSON 이다.

output plugin 을 살펴보고, 입력된 이벤트로부터 더 다양한 처리를 할 수 있다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Fluentd 는 125 개 이상의 시스템들에서 모든 로그를 수집할 수 있는 오픈 소스 로그 수집기(log collector) 이다.

대부분의 어플리케이션이 자체 로그를 기록하지만, 로그 수집기는 이 다양한 로그들을 원하는 형태로 취합하여 분석/통계가 용이하도록 해준다.

일단 서버에 설치되면 백그라운드에서 다양한 유형의 데이터를 JSON 형태로 수집, 분석, 변환, 저장 등을 한다.


아래 순서대로 설치를 하겠지만, fluentd 가 아닌 td-agent 를 설치할 것이다.

td-agent 란 Ruby 로 작성된 fluentd 를 사용자가 쉽게 사용할 수 있도록 트레저데이터(Treasure Data) 사에서 제공하는 래퍼 프로그램이다.

fluentd 의 기능이나 업데이트를 직접 제어하려는 것이 아니라면, Ruby 를 모르고 싶은 사용자라면 td-agent 를 사용하는 것이 안정성 및 정신건강에 좋다.




1. 설치 전 유의사항


Fluentd 를 설치 전, 언젠가 발생할지 모르는 문제를 예방하기 위해 시스템의 파일 디스크립터(File Descriptors) 설정을 바꿔줘야 한다.

파일 디스크립터란 운영체제의 파일/소켓 등을 지칭하는 숫자이다.

프로세스 자원한도를 늘리기 위해 ulimit -n 명령을 사용하여 현재 파일 디스크립터 최대치를 확인한다.


$ ulimit -n

1024


최대치가 1024 로 보여진다면 fluentd 운영하기에 많이 부족하므로 많이 늘려야 한다.

fluentd 의 플러그인과 설정(in_tail 의 파일수 / in_forward 의 접속수 / buf_file 의 버퍼 정크수 등) 에 따라 다르겠지만 65536 정도가 안전하다.

아래와 같이 수정하고 재부팅하여 적용된 수치를 확인한다.


$ sudo vi /etc/security/limits.conf

...

root soft nofile 65536

root hard nofile 65536

* soft nofile 65536

* hard nofile 65536


또 한가지, 네트워크 커널 파라미터 최적화.

많은 Fluentd 인스턴스로 구성된 고부하 환경의 경우, TCP_WAIT 에 문제가 있다면 아래 매개 변수를 /etc/sysctl.conf 파일에 추가한다.


$ vi /etc/sysctl.conf

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.ip_local_port_range = 10240    65535


sysctl -p 를 입력하거나 서버를 재부팅하여 변경 사항을 적용한다.




2. 설치할 플랫폼 선택


설치는 다양한 패키지를 제공하며 원하는 플랫폼의 설치를 진행하면 된다.

Redhat / Ubuntu / Debian / OSX / Ruby / Chef / source

windows 는 v0.14 (td-agent3) 부터 지원한다. 현재 최신 안정화(stable) 버전은 v0.12 (td-agent2).

나 역시 stable 버전을 설치하려고 했지만, 필요한 기능이 td-agent3 에 있어서 v0.14(td-agent3) 를 설치했다.


현재 EC2 AMI 버전은 amzn-ami-hvm-2016.09 를 쓰고 있었는데 td-agent 저장소 페이지가 404 라 설치 실패했다.


http://packages.treasuredata.com/3/redhat/latest/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found Trying other mirror.


검색해 보니 RHEL 에 대응이 좀 늦는 듯... 이건 시간이 지나면 업데이트 해주겠지.

일단 Ubuntu-xenial-16.04 로 진행했다.


현재 stable 버전이나 다른 플랫폼 설치는 아래 링크를 참조한다.

http://docs.fluentd.org/v0.12/categories/installation




3. 설치


아래 한줄의 명령으로 apt 저장소(/etc/apt/sources.list.d/treasure-data.list) 를 등록하고, td-agent3 을 설치한다.


$ curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent3.sh | sh




4. 데몬 실행


/etc/init.d/td-agent 는 start | stop | restart | status | reload 명령을 사용할 수 있다.


$ /etc/init.d/td-agent start 

Starting td-agent: [  OK  ]

$ /etc/init.d/td-agent status

td-agent.service - LSB: data collector for Treasure Data

   Loaded: loaded (/etc/init.d/td-agent; bad; vendor preset: enabled)

   Active: active (running) since Thu 2017-04-06 05:58:25 UTC; 58s ago

   ...




5. 테스트


td-agent 의 설정 파일 /etc/td-agent/td-agent.conf 의 기본 설정은 HTTP 에서 로그를 가져 와서 stdout (/var/log/td-agent/td-agent.log) 로 라우팅하도록 되어 있다.

설정 파일을 보기 전에, curl 명령을 사용하여 샘플 로그를 보내 테스트 해본다.


$ curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test


실시간으로 로그가 라우팅 되는 것을 아래 명령으로 확인할 수 있다.


$ tail -f /var/log/td-agent/td-agent.log


2017-04-05 07:05:41 +0000 debug.test: {"json":"message"}



fluentd 준비 완료!




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

apt-get update error

Daily/Prog 2016. 5. 13. 23:37

한 두달 정도 방치한 내 EC2 테스트 서버가 갑자기 맛이 갔다.

아래처럼 apt-get update 시 저장소에 접속하지 못하는 문제였는데 원인을 찾을 수가 없다;;


언제나 컴퓨터 초보들은 이런 말을 하곤 한다.

"아무것도 건드린게 없는데, 갑자기 이렇게 됐다고..."

내가 지금 그렇다 ㅡㅡ;;ㅋ


# apt-get update
0% [Connecting to ap-northeast-1.ec2.archive.ubuntu.com (54.199.23.9)] [Connect
cs


# ps ax | grep apt
 1904 ?        S      0:00 /bin/sh /etc/cron.daily/apt
 1972 ?        S      0:00 apt-get -qq -y update
 1976 ?        S      0:00 /usr/lib/apt/methods/http
 1977 ?        S      0:00 /usr/lib/apt/methods/https
 1978 ?        S      0:00 /usr/lib/apt/methods/http
 1979 ?        S      0:00 /usr/lib/apt/methods/https
 1980 ?        S      0:00 /usr/lib/apt/methods/http
 1981 ?        S      0:00 /usr/lib/apt/methods/http
 2126 pts/1    S+     0:00 grep --color=auto apt
cs


혹시나 하고 ps 를 확인해 보니 apt update 가 자동으로 돌아가고 있었다. 난 아무것도 건드린게 없다 ㅜㅜ


# vi /etc/apt/apt.conf.d/10periodic
APT::Periodic::Update-Package-Lists "1";
cs


Update-Package-Lists 값이 1이면 자동 업데이트된다고 하는데 왜 이게 1로 되어 있냐...

어쨌든 apt-get update 는 고쳐지지 않았다.

같은 저장소 주소에 직접 ping 을 날리면 잘 날아가는데 왜 apt-get 로 연결하면 커넥팅이 안 이루어지는지...

당장 시간이 없어서 EC2 를 스피드하게 날려버리고 새로 생성하였다.


지금도 이유는 모르겠다 ㅜㅜ

실서버가 이렇게 됐으면 어땠을까... 헝헝~


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Install on Ubuntu

Tool/Docker 2016. 1. 16. 22:53

Docker 는 거의 모든 리눅스 배포판에서 사용 가능하다.

Docker 를 설치할 수 있는 Ubuntu 배포판이다.


- Ubuntu Wily 15.10

- Ubuntu Vivid 15.04

- Ubuntu Trusty 14.04 (LTS)

- Ubuntu Precise 12.04 (LTS)



요구사항


- Ubuntu 버전과 상관없이 Docker 64-bit 를 설치.

- 커널 버전 3.10 이상 (uname -r 체크)



APT 저장소 업데이트


- 현재 apt 저장소에서 docker-engine 을 사용하기 위해 APT 저장소를 업데이트 한다.


gpg(Gnu Private Guard) key 추가

# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

gpg: requesting key 2C52609D from hkp server p80.pool.sks-keyservers.net

gpg: key 2C52609D: public key "Docker Release Tool (releasedocker) <docker@docker.com>" imported

gpg: Total number processed: 1

gpg:               imported: 1  (RSA: 1)


저장소 리스트 추가 (해당하는 버전의 주소 한 줄만 입력)

# vi /etc/apt/sources.list.d/docker.list


# On Ubuntu Precise 12.04 (LTS)

deb https://apt.dockerproject.org/repo ubuntu-precise main

# On Ubuntu Trusty 14.04 (LTS)

deb https://apt.dockerproject.org/repo ubuntu-trusty main

# On Ubuntu Vivid 15.04

deb https://apt.dockerproject.org/repo ubuntu-vivid main

# On Ubuntu Wily 15.10

deb https://apt.dockerproject.org/repo ubuntu-wily main


새 저장소에서 리스트 갱신

# apt-get update

# apt-get upgrade


docker-engine 패키지 확인

# apt-cache policy docker-engine


Ubuntu Trusty 14.04 (LTS) 버전부터는 aufs 스토리지 드라이버를 사용할 수 있도록 linux-image-extra 패키지를 설치한다.

# apt-get install linux-image-extra-$(uname -r)



Docker 설치


# apt-get install docker-engine



Docker 데몬 실행


# service docker start



Docker 작동 확인


# docker run hello-world



* 이후의 docker 사용시에는 docker 그룹 권한이 필요하므로 유저에게 그룹 권한을 부여하거나 sudo 를 이용해서 docker 를 사용하도록 한다.

(docker 데몬은 TCP 포트 대신 Unix 소켓에 바인드하여 실행되는데 Unix 소켓은 root 에게 소유권이 있으므로 docker 데몬은 root 로만 실행 가능하다.)




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,