상태가 없는 애플리케이션은 클러스터의 다른 노드에서 간단히 재시작할 수 있지만,,


상태가 있어야 하는 쿠버네티스 애플리케이션은 어떻게 구축할까?



쿠버네티스는 상태를 갖는 애플리케이션을 처리할 수 ​​있다.  이를 통해 장애 안정성 및 로드 밸런싱을 용이해진다.





애플리케이션이 상태를 갖는다면 즉, 도커 볼륨에 특정 데이터를 저장해야 한다면, 


애플리케이션이 실행되는 각 노드에서 필요한 도커 볼륨을 사용할 수 있어야 한다. 




따라서 상태를 갖는 애플리케이션의 처리가 더욱 복잡해진다. 



그래서 쿠버네티스는 영구 볼륨(persistent volumes)(https://kubernetes.io/docs/concepts/storage/persistent-volumes/)과 



상태 저장 셋(stateful sets)(https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#stable-storage)을 제공한다.







또 다른 방법은 operators(https://coreos.com/operators)을 사용하는 것이다. 


operators을 사용하면 상태를 갖는 애플리케이션을 자동으로 설치할 수 있다. 



예를 들어 프로메테우스(Prometheus) operator(https://github.com/coreos/prometheus-operator)가 있다. 


프로메테우스 operator는 쿠버네티스 클러스터에 모니터링 시스템인 프로메테우스를 설치할 수 있다. 


또한 Prometheus, ServiceMonitor, Altermanager와 같은 프로메테우스 컴포넌트에 대한 쿠버네티스 자원을 소개하며 프로메테우스 컴포넌트를 포드, 서비스, 배포 대신 쿠버네티스 설정으로 사용할 수 있다. 



프로메테우스 operator는 프로메테우스가 모니터링 데이터를 저장하는 방법을 결정해 핵심 과제를 해결한다.

Posted by 김용환 '김용환'



마라톤(marathon)은 url 상태 체크가 있는데. traffic이 많이 오면  health check 실패되어 자동 실행되고 그런게 좀 있었는데.


쿠버네티스는 url 헬스 체크외에 파일 체크 기능이 생겼다..


https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/




쿠버네티스는 Liveness Probe(https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/)를 통해 포드의 장애를 파악한다. 


사용자 지정 Liveness Probe를 사용하여 애플리케이션의 요구에 맞춰 컨테이너가 새로 시작되는 시점을 결정할 수 있다.



한편,


Readiness Probe(https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-readiness-probes)는 컨테이너가 요청을 처리할 수 ​​있는지 여부를 나타낸다. 


예를 들어 애플리케이션이 많은 양의 데이터를 처리하거나 아직 완전히 시작되지 않은 경우에 요청이 블럭되면 Readiness Probe는 애플리케이션의 상태를 쿠버네티스에 알린다. 


Liveness Probe와는 달리 Readiness Probe가 실패했다고 해서 컨테이너가 재시작되지 않는다. 


쿠버네티스는 일정 시간 후에 포드가 요청을 처리할 수 있는 지 여부를 Readiness Probe를 통해 신호를 보낸다고 가정한다.





<Liveness Probe>


ports:

- name: liveness-port

  containerPort: 8080

  hostPort: 8080


livenessProbe:

  httpGet:

    path: /healthz

    port: liveness-port

    


<Rediness Probe>

    

readinessProbe:

  exec:

    command:

    - cat

    - /tmp/healthy

  initialDelaySeconds: 5

  periodSeconds: 5

Posted by 김용환 '김용환'


TSDB에서 다음과 같은 에러가 발생했다.

(기본 설정에는 채널 사이즈가 정해져 있지 않다.)


net.opentsdb.tsd.ConnectionManager$ConnectionRefusedException: Channel size (201) exceeds total 



connection limit(200), 즉 채널 사이즈가 작아서 발생한 것이다.



설정을 보면 200으로 되어 있다.


# Sets the maximum number of connections a TSD will handle, additional connections are immediately closed. (from 2.3)

tsd.core.connections.limit = 200




이를 큰 값으로 (예, 500)수정하면 해당 트래픽 상황에서는 더 이상 문제가 생기지 않는다.





Posted by 김용환 '김용환'

grafana에서 특정 metric을 downsample을 1m으로 하면 잘 보이는 장점이 있다.

그러나 해당 메트릭 패널이 많이 모인 dashboard에서는 당연히 DataSource(예, tsdb)가 영향을 받을 수 있다. 

따라서 auto downsampling을 하는 게 좋다.

자세한 내용은 아래를 참고한다.

https://railsadventures.wordpress.com/2015/07/17/advanced-grafana-using-automatic-intervals/


Posted by 김용환 '김용환'


opentsdb 개발 환경 구성하기


$ git clone https://github.com/OpenTSDB/opentsdb.git

$ cd opentsdb

$ sh build.sh pom.xml

$ mvn compile



intellij에서 open project... maven 기반으로 읽는다. 


그래도 source generated되는게 있어서 완벽하지 않지만 그럭저럭 쓸만하다.



Posted by 김용환 '김용환'

[openstack] flavor 추가

Cloud 2018.06.16 11:54


admin 권한으로 보고 사용할 수 있는 openstack에서의 flavor가 따로 있다.

내 계정으로는 admin 권한으로 사용할 수 있는 flavor는 admin권한의 flavor의 subset이다.


따라서 내 계정으로 가지고 있는 않는 flavor로 openstack instance를 생성하고 싶다면, 프로젝트에 flavor 생성 권한이 있어야 한다.


현재 가지고 있는 권한은 다음과 같다. 


$ openstack --os-project-name GOOGLE_PLUS flavor list


+--------------------------------------+-----------+------+------+-----------+-------+-----------+

| ID                                   | Name      |  RAM | Disk | Ephemeral | VCPUs | Is Public |

+--------------------------------------+-----------+------+------+-----------+-------+-----------+

| 9933ea88-9535-4b04-add8-910e08c01aea | m1.medium | 

| cdb20a75-87a5-43d3-b75b-a5331cad8cb7 | m1.small  | 

| e3739ce3-746c-4e3f-820e-eb9803fa4e62 | m1.large  | 

+--------------------------------------+-----------+------+------+-----------+-------+-----------+



admin 권한으로 접속해 사용할 수 있는(권한을 줄 수 있는) flavor를 확인한다. 

$ openstack flavor list
...
| 66be1e64-2776-4457-a31e-923340e583a2 | r1.xlarge |...
..



여전히 admin 권한으로 66be1e64-2776-4457-a31e-923340e583a2 flavor를 내 프로젝트에 추가한다.

$ openstack flavor set 66be1e64-2776-4457-a31e-923340e583a2 --project GOOGLE_PLUS

그리고 제대로 추가되었는지 확인한다.

 $ openstack --os-project-name KEMI-SAURON flavor list
+--------------------------------------+-----------+-------+------+-----------+-------+-----------+
| ID                                   | Name      |   RAM | Disk | Ephemeral | VCPUs | Is Public |
+--------------------------------------+-----------+-------+------+-----------+-------+-----------+
| 66be1e64-2776-4457-a31e-923340e583a2 | r1.xlarge | 
| 9933ea88-9535-4b04-add8-910e08c01aea | m1.medium | 
| cdb20a75-87a5-43d3-b75b-a5331cad8cb7 | m1.small  | 
| e3739ce3-746c-4e3f-820e-eb9803fa4e62 | m1.large  | 
+--------------------------------------+-----------+-------+------+-----------+-------+-----------+


openstack horizon 또는 cli를 사용할 때 추가된 flavor로 인스턴스를 생성할 수 있다. 







Posted by 김용환 '김용환'


nova 커맨드를 실행하다가 아래와 같은 에러를 만났다.


$ nova quota-show --user $projectUser --tenant $project

ERROR (AttributeError): 'unicode' object has no attribute 'get'




다음 코드를 써서 해결할 수 있는 경우가 있다.


export PYTHONIOENCODING=UTF-8



그래도 에러가 발생하면. 이전 컴맨드에 --debug를 추가하면.. 확실히 알 수 있다.


 404 not found.. API 이슈이다. 


$ nova quota-show --user $projecUser --tenant $project --debug

DEBUG (session:198) REQ: curl -g -i -X GET https://code.google.io:5000/v2.0/ -H "Accept: application/json" -H "User-Agent: python-keystoneclient"

...

DEBUG (connectionpool:387) "GET /v2/ae17dbd7165142808e074579360a8b9c HTTP/1.1" 404 112

DEBUG (session:215) RESP: [404] Date: Tue, 12 Jun 2018 08:01:07 GMT Content-Length: 112 Content-Type: application/json; charset=UTF-8 X-Compute-Request-Id: req-0a8e18ed-860e-4dcb-a566-f7eb02fb19bd

RESP BODY: {"message": "The resource could not be found.<br /><br />\n\n\n", "code": "404 Not Found", "title": "Not Found"}


DEBUG (shell:909) 'unicode' object has no attribute 'get'







Posted by 김용환 '김용환'



https://www.openstack.org/summit/vancouver-2018/summit-schedule/global-search?t=Yuki%20Nishiwaki





Excitingly simple multi-path OpenStack networking: LAG-less, L2-less, yet fully redundant from LINE Corporation


Posted by 김용환 '김용환'

[펌] Istio 내부 구조

Cloud 2018.05.24 20:19




openshift에서 밀고 있는 istio의 개념을 살펴본다. (redhat 원래 발표자가 한 말은 아니지만 이해한 내용을 기반으로 거의 들어맞는 얘기를 해본다)




서비스에 다양한 기능(discovery, lb, resiliency, metrics, tracing)을 가진 jvm 애플리케이션에 docker로 개발하는 MSA를 진보적으로 바꿔보자. 





istio를 사용함으로서..

서비스만 jvm 애플리케이션으로 개발하고 나머지는 istio가 책임져 줄께.. 


kubenetes를 사용할꺼야. Pod 안에 jvm container 하나 있고, sidecar container(envoy)라는 것을 추가할 꺼야. 

sidecar container(envoy)를 사용하면 쉽게 MSA 서비스만 개발하면 될꺼야.





istio control plane이 쿼터 부터 api, config, rate limiting, ca 등등을 지원할꺼야. 


프로토콜? http는 물론 gRPC, TCP(TLS 포함)까지 지원한다.

근데 thrift는 지원하지 않아 보이지만.. 최근에 추가되었다.

https://github.com/istio/istio/tree/master/vendor/github.com/apache/thrift









실제 내부 구조는 다음과 같다. enovy와 Mixer가 핵심적인 서비스로 동작한다. 


https://developer.ibm.com/dwblog/2017/istio/







Posted by 김용환 '김용환'



클라우드 아키텍처 그림 그리는 툴


https://cloudcraft.co/app



1탭은 Design으로 그림을 그린다.


공유기능은 링크와 이미지만 있다. (visio처럼 xml로 나오지는 않는다.)


<링크>

https://cloudcraft.co/view/4d5731b7-7e14-43e2-b8e5-5b329a2bd6c3?key=3m40jn0enpfd2t90


<이미지>

https://cloudcraft.co/api/blueprint/4d5731b7-7e14-43e2-b8e5-5b329a2bd6c3/png?grid=true&transparent=false&width=1280&height=720






3탭의 예산 정보도 볼 수 있다.






2탭은 Live인데, 실제 그림 그리는대로 아마존 설계를 한다.


Welcome to Cloudcraft Live

Live mode allows you to link your real AWS infrastructure with your diagrams.


이 부분이 cloudcraft 회사가 창출하는 부분이다.




Posted by 김용환 '김용환'