DevOps 46

[번역]마틴파울러의 테스트 피라미드

원문 : https://martinfowler.com/bliki/TestPyramid.html bliki: TestPyramid Write most of your tests at a low level (unit tests) with a few broad-stack tests, eg via UI. UI tests tend to be fragile and slow. martinfowler.com 테스트 피라미드는 자동화된 테스트를 어떻게 효율적으로 만들지 고민하기 위해 만들어진 형태입니다. 여기서 중요한 점은 고수준 테스트를 만들기 보다는 최대한 저수준의 유닛테스트를 많이 만들어야 한다는 점입니다. 자동화된 테스트는 대부분 유저 인터페이스를 통한 테스트를 뜻해 왔습니다. 만들어진 애플리케이션이 있다면 특정한..

aws centos6에서 grafana 빌드하기

1. centos6 AMI로 instance 생성 2. root권한 획득 및 유저 변경 $ sudo passwd Changing password for user root. New password: Retype new password: passwd: all authentication tokens updated successfully. $ su root Password: 3. 관련 패키지 설치 $ yum install wget gcc gcc-c++ git 4. golang 다운로드 $ wget https://dl.google.com/go/go1.15.linux-amd64.tar.gz $ tar -C /usr/local -xvzf go1.15.linux-amd64.tar.gz 5. 환경변수 설정 $ vi /e..

DevOps 2020.08.20
Grafana 알람 사용시 Image Renderer 사용 이슈 정리

그라파나는 모니터링 대시보드로 많이 쓰이는 웹 애플리케이션입니다. 다양한 기능을 제공하는데 그 중 하나는 Alert기능이 있습니다. 이 기능에는 graph이미지를 추가로 전송할 수 있는데, slack, email 등에 noti를 보낼때 매우 유용하게 사용할 수 있습니다. 이미지를 전달하기 위한 Redering은 grafana의 Grafana Image Renderer플러그인이 chromium(headless browser)을 통해서 수행합니다. Grafana Image Renderer을 사용하기 위해서는 몇가지 제한사항과 이슈에 대해 확인해야하는데 이 부분에 대해 정리하고자 합니다. Grafana Image Renderer 플러그인 사용 방법 1) grafana-cli로 설치 $ grafana-cli p..

DevOps 2019.12.09
Grafana와 엘라스틱서치 사용시 각종 query 조건 사용 방법(and, or, regex 등)

엘라스틱서치는 분산형 RESTful 검색 및 분석엔진이다. ELK라는 스택을 통해서 여러 데이터를 모으고 시각화하여 활용하는데 많이 쓰인다. 데이터를 모아서 Kibana로 사용하는 것도 좋지만 Grafana를 사용하면 미려한 그래프 디자인과 함께 alert기능등 여러 기능을 사용할 수 있다. 이번 포스팅에서는 엘라스틱서치와 Grafana를 사용하여 그래프를 그릴 때 Query를 사용하는 방법에 대해서 이야기해보고자 한다. 그라파나에 엘라스틱서치 연결하기 엘라스틱서치의 document를 그래프로 그리기 위해서는 index pattern을 그라파나에 등록해야 한다. 아래와 같이 add data source탭을 통해 elasticsearch에 대한 정보를 등록한다. 그라파나 Query 아래와 같은 형태로 ES..

DevOps 2019.10.11
넷플릭스에서 리눅스 퍼포먼스 체크하기(in 60초)

원문 : https://medium.com/netflix-techblog/linux-performance-analysis-in-60-000-milliseconds-accc10403c55 항상 그렇듯이 서버에는 이상이 생길 수 있다. 만약 서버에 갑자기 이슈가 생기면 무엇부터 봐야할까? 넷플릭스에는 어마어마한 개수의 AWS EC2 리눅스 서버들을 가지고 있고 상당히 많은 수의 성능 체크 툴을 가지고 있다. 그 중에는 Atlas와 Vector도 포함된다. > Atlas : Cloud-wide monitoring > Vector : on-demand instance analysis 상기 2개의 모니터링 tool로 상당수의 이슈가 해결되지만 그럼에도 불구하고 서버에 로그인해서 리눅스 성능체크를 해야할 경우가 있..

DevOps 2019.08.27
Telegraf에서 system metric 수집하여 elasticsearch에 적재하기

Telegraf는 influxdata(사)에서 opensource로 제공하는 plugin 기반의 metric수집 server agent이다. github url : https://github.com/influxdata/telegraf telegraf의 역할이 이해하기 어렵게 느껴질 수 있는데, 간단히 말하자면 아래와 같이 input, process, output이 가능하다. Telegraf로 할 수 있는 일 System의 ram, cpu수치를 elasticsearch에 적재 Redis의 data를 elasticsearch에 적재 File log를 influxdb에 적재 즉, input plugin으로 뽑아낸 데이터를 output plugin이 지원하는 곳으로 보낼 수 있다. System metric을 e..

DevOps 2019.08.09
마틴파울러의 마이크로서비스의 정의(Micro Service Architecture by Martin folwer)

2014년 마틴파울러는 마이크로서비스에 대한 정의를 자신의 블로그(바로가기)에 올렸다. 이를 바탕으로 나의 생각과 함께 정리해보았다. 개요 "마이크로 서비스 (Microservices)"- 소프트웨어 아키텍처에 대한 또 다른 새로운 용어다. 지난 몇 년 동안 많은 프로젝트에서이 스타일을 사용 해왔고 지금까지의 결과는 긍정적이었다. 많은 동료가 엔터프라이즈 application 구축의 기본 스타일이되었지만 슬프게도 마이크로 서비스 스타일이 무엇이며 어떻게 수행하는지 설명하는 정보는 많지 않다. 이를 설명하고자 한다. 마이크로서비스(Microservices) 간단히 말해 Micro service Archiectrure(이하 MSA)는 작은 단위의 경량 application의 모음 군으로 개발하는 접근 방식이..

Slack으로 process가 정상적으로 시작되었는지 나타내는 이쁜 메시지 만들기(Incoming webhook과 Attachment message 활용)

Slack은 개발자들이 사랑하는 커뮤니케이션 도구 중 하나이다. Slack의 webhook을 사용하여 back-end서버에 개발한 application process가 정상적으로 실행되고 있는지, 정상적으로 꺼졌는지 여부 등을 알림으로 받을 수 있다. 배포하는 서버가 1, 2대라면 ssh 접속으로 언제든지 확인가능하지만 만약 10대, 100대의 서버에 다 들어가서 process가 정상작동 되는지 여부를 확인하기는 어렵다.(하지만 쿠버네티스의 probe를 사용하면 어떨까) 이때 slack으로 한번에 알림을 받는 자동화 과정을 shell로 만들어 놓으면 몸과 정신이 건강해질 수 있다. 시작하기 전에 이 포스팅에 설명하는 guide는 1개의 process로 돌아가는 application을 기준으로 설명합니다...

DevOps 2019.06.21
쿠버네티스, 물리장비에 올릴까? 가상장비에 올릴까? 머신별 장단점 알아보기.

Kubernetes Micro Service Architecture(이하 MSA) 개발방식이 유행을 타면서 이와 동시에 docker와 같은 container application들을 orchestration하는 도구인 Kuberntes(이하 k8s)의 관심도도 엄청나게 높아지고 있다. k8s에 대한 관심이 지속적으로 늘어남과 동시에 개발자들은 효율적인 machine(host)의 resource(cpu, ram등)의 사용을 위해 아래와 같은 질문이 자연스럽게 나눠지곤한다. k8s를 물리장비에 올릴까? 가상장비에 올릴까? 어디에 올렸을때 효과적일까? 상기와 같은 질문을 하기 전에 k8s의 목적에 대해 명확히 알아야 한다. k8s는 container orchestration도구일 뿐이다. container a..

젠킨스에서 plugin 설치때 jenkins Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version 에러가 날 경우

젠킨스에서 plugin을 사용시 업데이트할때 아래와 같은 오류가 날 경우가 있다. WARNING: org.jenkinsci.plugins.ghprb.GhprbTrigger.run() failed for hudson.model.FreeStyleProject@4853e929[android-phoenix-qa-emulator] java.lang.Error: org.kohsuke.github.HttpException: Server returned HTTP response code: -1, message: 'null' for URL: https://api.github.com/repos/nytm/android-phoenix/pulls?state=open at org.kohsuke.github.Requester$Pa..

DevOps/CI & CD 2019.03.07
효과적인 소프트웨어 문서를 적는 방법

『Documenting Software Architectures』를 읽고 정리, 추가 한 포스트입니다. 호랑이는 죽어서 가죽을 남기고, 개발자는 문서를 남긴다. Why? 왜 문서화 해야하나?개발자로서 협업을 하다 보면 항상 마주치는 현실이 있다. 이건 왜 이렇게 짜셨나요? 이렇게 설계한 이유는 무엇인가요? commit log를 보세요. 히스토리에 대해 알고 싶어요. 어디서 볼수 있나요? wiki를 보세요. wiki에 어디로 가야하나요? XXX page에 맨 아래쪽에 나와 있어요. 여기 wiki내용은 code에 반영된 것과 다른데요? wiki 작성할 시간이 없어요. 바빠서 작성을 못했네요. 인수인계를 할 때뿐만아니라 일상 실무에서도 많이 일어나는 개발자들 간의 커뮤니케이션 내용이다. 많은 개발자들이 히스토..

Elasticsearch와 Kibana, filebeat 를 활용한 쿠버네티스 로깅 아키텍쳐

Elasticsearch와 Kibana 그리고 filebeat를 활용하면 간단하고 효과적으로 쿠버네티스의 log를 수집하고 조회할 수 있다. 구성Log를 수집하여 데이터를 저장 및 조회하는 Elasticsearch pod쿠버네티스의 각 node에서 daemonset으로 띄워져 log를 수집하여 elasticsearch로 전송하는 Filebeat pod수집한 log를 visualize하여 확인할 Kibana pod그림. Elasticsearch와 Kibana, filebeat를 사용한 kubernetes logging 아키텍쳐 elasticsearch.yaml# 엘라스틱서치 image를 가져와서 pod으로 띄웁니다.# PVC를 사용하는 경우와 PVC를 사용하지 않는 경우로 사용할 수 있습니다. 1) PVC..

쿠버네티스 Multi-container pod 종류 및 예제

Pod은 쿠버네티스에서 배포할 수 있는 최소 모델이다. Pod은 클러스터에서 프로세스로 실행된다. Pod은 application container(혹은 containers), storage resource, unique IP, option 으로 이루어져 있다. Docker는 쿠버네티스에서 사용 가능한 가장 널리쓰이는 컨테이너이다.(다른 컨테이너 모델도 상용 가능) Pod 모델 종류 1. 1개 컨테이너 - 1개 POD 모델 "one-container-per-Pod"은 쿠버네티스에서 가장 널리 쓰이는 케이스. 한개의 pod이 1개의 container을 감싸고 있으며, 쿠버네티스가 pod을 관리. 2. 2개 이상 컨테이너 - 1개 POD 모델 2개 이상의 container가 리소스를 밀접하게 공유해야하는 상황..

쿠버네티스 kubectl 설명 및 예제 모음

kubectl은 쿠버네티스 클러스터에 명령을 내리는 CLI(command line interface)입니다. kubectl 문법(바로가기) kubectl 예제(바로가기) kubectl 문법 terminal window에서 아래와 같은 명령어로 kubectl을 동작 가능합니다. kubectl [COMMAND] [TYPE] [NAME] [FLAGS] - COMMAND : create, get, describe와 같이 하나 혹은 여러개의 리소스에 대한 operation 종류를 선언합니다. - TYPE : resource type(설명 바로가기)에 대해 선언합니다. 리소스 타입은 case-sensitive하고 아래와 같이 선언 가능합니다. $ kubectl get pod pod1 $ kubectl get pod..

쿠버네티스 로그 아키텍쳐 개요 및 방법

Logging Architecture로그들은 에러를 디버깅하거나 클러스터의 status에 대해 자세히 알 수 있다. 앞에서 말한 목적때문에 대부분의 애플리케이션들은 standard output으로 로그파일을 남기고 있다. 그러나, 컨테이너 엔진 혹은 이전의 애플리케이션의 로깅 방법은 쿠버네티스에서의 로그 확인에 적절하지 않다. 사용자는 컨테이너 crash, pod 삭제, node VM이 죽는 경우에도 로그를 확인을 원할 수 있다. 그러므로, 로그는 모니터링 하고자 하는 쿠버네티스와는 무관한(별개의) storage와 lifecycle을 가져야한다. 이러한 컨셉을 cluster-level-logging 이라고 부른다. cluster-level-logging은 각각의 분리된 저장소, 분석 솔루션, 대시보드가 ..

쿠버네티스 RBAC(Role-based Access Control) 상세 설명 및 예제

RBAC는 enterprise 쿠버네티스 환경에서 node 혹은 네트워크 리소스를 접근할때 role을 부여하는 작업이다. 특징RBAC는 rbac.authorization.k8s.io API를 사용k8s 1.8부터 RBAC mode가 stable함RBAC 활성화를 위해 --authorization-mode=RBAC 설정 필요API 살펴보기Role and ClusterRoleRole은 쉽게말하면 권한 모음이다. 직관적으로 어떤어떤 권한을 부여 가능. ClusterRole은 Role과 비슷하지만 cluster기반 권한 부여이므로, node, endpoint, 모든 namespace에 대한 권한 셋팅 가능 example : default라는 이름의 namespace에 pod 읽기권한(get, watch, lis..

[쿠버네티스 기초]spring boot rest application POD 배포하기(part2)

준비물 20min 쿠버네티스가 준비된 클러스터환경 Intellij or eclipse docker docker hub에 올라간 이미지 쿠버네티스에 배포 ※ 쿠버네티스의 kubectl 명령어에 대해서는 쿠버네티스 kubectl 설명 및 예제 모음(바로가기) 포스트 참고 1. 쿠버네티스에 docker hub 관련 secret을 등록한다. (쿠버네티스 시크릿? - OAuth token, password 등 민감 정보를 Object type으로 선언) $ kubectl create secret docker-registry my-secret --docker-server=hub.docker.com --docker-username=choco4235 --docker-password=password1234 --docke..

[쿠버네티스 기초]spring boot rest application POD 배포하기(part1)

준비물 20min쿠버네티스가 준비된 클러스터환경Intellij or eclipsedockerspring boot application 및 쿠버네티스에 올라갈 이미지 준비1. spring boot rest api application을 spring.io 예제 홈페이지(바로가기) 에서 받는다.2. Intellij 혹은 eclipse에서 실행시켜본다.3. Dockerfile 생성 FROM openjdk:8-jdk-alpine RUN apk add --no-cache curl tar bash VOLUME /tmp ADD build/libs/gs-rest-service-0.1.0.jar app.jar ENV JAVA_OPTS="" ENTRYPOINT ["java","-jar","/app.jar"] 4. Docke..

젠킨스(with 쿠버네티스 플러그인)가 쿠버네티스에서 동작하는 원리, 생명주기, 특징

기존 VM으로 운영되던 Jenkins는 master가 있고 slave(vm n대 설정)를 연결시키면 slave가 job을 master로 부터 받아서 수행했엇다. 하지만 VM으로 운영되는 Jenkins(master-slave) 구조는 아래와 같은 단점이 있다. Job에 필요한 plugin들을 master에 설치, 관리 필요Job에 비해서 slave가 많으면 비효율적임 (slave가 놀고 있음)Job에 비해서 slave가 적으면 비효율적임 (slave가 부족해서 기다리는 job이 많아짐) 즉, Job이 늘어나고 줄어듦에 따라 Jenkins slave를 늘리거나 줄여야하는(사람이 직접 설치해야하는) 단점!! Jenkins(with kubernetes plugin)가 있다면 이야기는 달라진다. Jenkins m..

쿠버네티스 yaml 선언시 어떤 apiVersion을 사용해야 할까?

쿠버네티스의 yaml을 배포할때 어떤 apiVersion을 사용해야할지 감이 잡히지 않는다. 외국의 블로그 포스팅(바로가기)에서 감사하게도 각 kind에 따른 apiVersion을 정의 해주었다.- 2018년 6월 4일 updated versionWhich apiVersion should I use?KindapiVersionCertificateSigningRequestcertificates.k8s.io/v1beta1ClusterRoleBindingrbac.authorization.k8s.io/v1ClusterRolerbac.authorization.k8s.io/v1ComponentStatusv1ConfigMapv1ControllerRevisionapps/v1CronJobbatch/v1beta1Daemon..

쿠버네티스 yaml 스펙 상세 설명

쿠버네티스의 pod, service, ingress 등을 배포하기 위해서는 아래와 같은 예시 yaml 파일을 배포한다. apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 8090특징띄어쓰기 구분을 잘해야한다. - 각 셋팅의 하위 셋팅은 종속적이기 때문에 띄어쓰기가 틀리게 되면 적용 실패된다. - tab보다는 space를 추천원하고자 하는 kind에 따라 apiVersion 종류가 달라진다. apiVersion 설명- 스크립트를 실행하기 위한 쿠버네티스 API 버젼v1쿠버네티스에서 발행한 첫 stable release API (대부분의 ap..

[Gradle]기본 클래스 org.gradle.wrapper.GradleWrapperMain을(를) 찾거나 로드할 수 없습니다. 해결법

Gradle을 사용하여 Jenkins나 혹은 기타 CI용 툴에서 build를 할 경우가 생긴다. 이때 CI툴에서 gradle wrapper을 사용하여 build를 요청하였을때 아래와 같은 오류가 생기는 경우가 있다. 기본 클래스 org.gradle.wrapper.GradleWrapperMain을(를) 찾거나 로드할 수 없습니다. 그러면 아래와 같이 살펴보자gradlew, gradlew.bat, gradle/ 파일, 폴더들이 정상적으로 프로젝트에 포함되어있는지 확인gradlew, gradlew.bat, gradle폴더가 정상적으로 들어가 있지 않은 경우 gradle wrapper 오류가 생기게 된다. End of Document

[Gradle 고급]git release 브랜치 기준으로 jar 자동 versioning하기

Git을 사용하면 여러 branch 전략이 있다. 많은 전략 중 development branch에서 지속적으로 개발후에 특정 시점에 release브랜치로 배포를 나가는 전략을 사용할 수 도 있다. 상기와 같은 전략을 사용할 경우 release/1.0.1 혹은 release/2.1.3 과 같은 이름으로 release 버젼을 따게 된다. 이 때 jar파일을 생성할때 자동으로 versioning이 가능하도록 하는 방법에 대해 설명하고자 한다. 기존 gradlebuild.gradle123456789101112131415161718192021222324252627282930313233buildscript { repositories { maven { url 'http://repo.mycompany.com/mave..

예제로 풀어보는 구독형 아키텍쳐(Subscribe architecture) for Micoro Service Architecture(MSA)

마이크로 서비스 환경에서는 서비스의 경계를 넘나드는 비즈니스 프로세스를 관리하는 문제를 적절히 느슨한 연결로 풀어나가야한다. 예제 - 쇼핑몰 회원가입 프로세스고객 회원가입welcome sms 발송welcome email 발송신규회원 쿠폰 생성완료쇼핑몰에 회원 가입을 하게 되면 3개의 비즈니스로직을 수행한다고 가정해보자. 레거시(Legacy) 아키텍쳐 방식 - 오케스트레이션(orchestration)기존 방식(not MSA)으로는 오케스트라 지휘자 처럼 한개의 프로세스가 뇌가 된듯 세부 작업을 아래와 같이 직접 method를 요청할 것이다. 123456789101112131415void registerMember(String memberName, ...){ @Autowired DispatchManager ..

개발자에게 은총알(silver bullet)은 없다.

슈퍼맨에 나오는 악당들은 성가신슈퍼맨을 물리치기 위해 크립토나이트(은탄환)를 사용한다. There is no silver bullet - 은탄환은 없다. 울버린, 늑대인간, 드라큘라와 같은 괴물들에게 은탄환(one seeks bullets of silver)은 한번에 무력화 시킬 수 있는 최고의 도구이다. - Fred Brooks, 『Silver Bullet-Essence and Accidents of Software Engineering』1986년 프레드 브룩스가 쓴 소프트웨어 공학 논문에서 은탄환의 존재에 대해 최초로 언급하였다. 이와 동시에 소프트웨어 개발의 복잡성을 한번에 해소할 마법같은 솔루션(은탄환)은 없다고 선언한다. 소프트웨어는 복잡성을 내포하고 있으며 여러가지 문제(essential co..

개발자 생산성을 200% 늘리는 git client 추천 - GitKraken

git client 외계 괴물 GitKraken Git client 비교 - 소스트리 vs 깃크라켄기승전깃크라켄 깃크라켄 만의 특징 9가지1. 특정브랜치의 커밋로그를 몰아서 볼 수있다.(soloing function) 2. fuzzy finder 기능으로 빠른 history, file 탐색이 가능하다. 3. 특정브랜치로 checkout하지 않더라도 'Pull' 버튼을 눌러 최신버젼의 브랜치를 받을 수 있다. 4. commit log graph를 보기 좋게 보여준다. 5. cmd + [+]/[-] 버튼으로 UI를 작게 혹은 크게 가능하다. 6. 이번 commit comment를 잘못적었다면? - 간단히 클릭만으로 commit comment를 수정할 수 있다. 7. 드래그&드랍을 사용해서 빠른 Pull-re..

쿠버네티스에서 POD, Node의 리스소 관리(CPU, memory, 등)

쿠버네티스에서의 리소스## 아래 예제는 unmanaged pod라고 보면됨.(실제로 이렇게 쓰지 않음) apiVersion: v1 kind: Pod metadata: name: requests-pod spec: containers: - image: busybox command: ["dd", "if=/dev/zero", "of=/dev/null"] name: main resources: requests: #미니멈 개념, 최소 X가 필요하다. cpu: 200m #200밀리코어 memory: 10Mi #10메가 ## pod A가 request설정, pod B도 request설정 pod C도 request설정 그러나 실제 usage는 너무 작다## 즉, 실제 CPU사용량은 request와는 무관하다.(작을수도,..