전체 글 477

spring boot scheduler의 cron은 UNIX의 cron과 다르다!

결론 : Spring boot scheduler의 cron과 unix의 cron은 다르다! spring boot scheduler의 cron에 대한 설명을 살펴보자 @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(Schedules.class) public @interface Scheduled { /** * A cron-like expression, extending the usual UN*X definition to include * triggers on the second as well as minute, hour, day of month,..

컨트리뷰터가 되기 위해 opensource에 pull request날린 후기 #2 - pull request 날리기

pull request를 날릴 repository를 정했으니 이제 pull request를 만들어 날려보자! 해당 repository를 내 계정으로 fork정상적으로 fork되었는지 확인fork한 repository를 내 local에 clone하여 작업어느 브랜치 이든 상관없다. 수정할 부분을 수정하고,나는 master branch에 바로 commit & push!fork 한 repository에서 처리가 다 되었다면, 다시 원본 repository로 가서 New pull request 클릭!compare across forks를 누르게 되면 해당 repository가 아닌 다른 계정의 repository에서가져와서 pull request가 가능하다.내 계정의 repository를 클릭pull reque..

개발이야기 2018.07.19
컨트리뷰터가 되기 위해 opensource에 pull request날린 후기 #1 - 어떤 프로젝트에 기여할까?

오픈소스에 기여하여 컨트리뷰터가 되는 것은 많은 초보개발자들에게 꿈만 같은(?) 일이다. 하지만 github의 opensource들에 기여하는 법은 생각보다 간단하고 놀라울만큼 쉽다. 아래 목록에 해당되는 개발자라면 오픈소스에 기여할 준비가 되었다는 증거이다. 오픈소스 준비물java, c, c++ 셋중 하나라도 사용할줄 안다.주석을 달고 읽을 줄 안다.(영어)git을 사용할 줄 안다. 이제 어떤 오픈소스 repository에 pull request를 날려볼까? 아래는 대표적인 오픈소스 repository들이다.(아무래도 유명한 오픈소스에 기여해야 뽀대가 난다.)(저는 텐서플로우 컨트리뷰터입니다^^ 같은..) 쿠버네티스 https://github.com/kubernetes/kubernetes엘라스틱서치 h..

개발이야기 2018.07.19
쿠버네티스 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..

구글 search engine에 내 블로그 상위에 검색되게 하기

구글 웹마스터도구 : https://www.google.com/webmasters/tools/home?hl=ko 구글 웹마스터도구에서 fetch as google을 사용하여 google의 크롤러인 GoogleBot이 크롤링을 요구하여 인덱스를 촉진시킬 수 있는 도구 중 하나이다. 먼저 google web master도구로 접속하여 대상 블로그를 등록한다. 왼쪽 메뉴에서 크롤링 > Fetch As Google을 클릭한다. 자신의 사이트 중 크롤링이 필요한(혹은 상위로 노출되기 원하는) page를 입력, 가져오기 버튼을 누른다. 색인이 완료되면 추후에 구글 크롤링봇에 의해 크롤링되면서 해당 포스트가 구글 검색 상단에 노출되게 된다.

[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..

R을 활용하여 구글 지도에 데이터 나타내기

R언어를 사용해서 구글지도에 데이터를 나타내보자 - 만들것 : freq column에 대해서 값이 200 이상이면 빨강색(크기 8), 이하이면 파랑색(크기 3) - 준비물 : Macbook, R studio 데이터 - 첨부파일 다운 : 123456789101112131415161718NAME , FREQ ,LAT,LON해운대해수욕장 , 580,35.158670, 129.160365국제시장 , 209,35.100728, 129.029123광안리해수욕장 , 229,35.153035, 129.118630광안대교 , 156,35.147633, 129.130206태종대 , 164,35.053070, 129.087213달맞이고개 , 130,35.16242 , 129.1783자갈치시장 , 182,35.096739, ..

예제로 풀어보는 구독형 아키텍쳐(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..

Golang backend programming - Http get 호출 + timeout 처리

약간 멍청하게 생긴 golang 마스코트 Golang의 백엔드 프로그래밍을 하기 위해 아래 조건을 갖춘 프로그램을 개발하기로 했다.5초 마다 http get 호출1초 이상 http get이 지연되었을 경우 timeout 발생Golang의 timeout을 사용 - select와, channel 활용 (Golang의 특징, timeout 설명 페이지 바로가기) 코드 123456789101112131415161718192021222324252627282930313233343536373839package main import ( "fmt" "time" "net/http" "io/ioutil") func main(){ for { fmt.Println("Http request start") c1 := make(ch..

Golang의 독특한 특징 3가지 - A declared are not used, Multiple return values, Timeout

기존 java 개발에서는 볼 수 없었던 독특한 golang만의 특징 몇가지를 소개하고자 한다. - 아래 내용들은 Jetbrains사의 GoLand IDE를 사용하였습니다. - Jetbrains사의 GoLand IDE사용하여 Golang 실행하기 포스트 바로가기 A declared are not used - Golang은 variable을 선언해놓고 쓰지 않으면 compile이 불가하다. Multiple return values - Java에서는(적어도 java 8 이전) 1개의 method 혹은 function에 대해서 return은 1개의 값만 가능하다. private int sum(int a, int b){ return a + b; } private int multiple(int a, int b){ ..

Jetbrains사의 GoLand로 Go언어 시작하기

Go언어는 2009년에 만들어져서 현재까지 활발히 발전되고 사용되는 언어이다. 간단하게 golang을 개발하자면 terminal, sublimetext로 개발할 수 있지만 좀더 나은 편의성을 사용하기 위해 Intellij를 만든 제작사인 jetbrains사의 Golang전용 컴파일러인 GoLand(사이트 바로가기)를 사용하는 것도 좋은 방안이다. JetBrains사에서 소개하는 Go IDE(GoLand) 준비물3분맥북터미널인터넷환경homebrew 설치GoLand 공식사이트에서 환경에 맞는 버젼을 고른 후 설치한다. 수행GoLand를 실행한다.src 이하에 main package를 생성하고 적절한 경로에 프로젝트 경로를 정한다. 우클릭을 통해 new > Go file, main.go를 생성한다. (case..

쿠버네티스에서 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와는 무관하다.(작을수도,..

쿠버네티스 Deployment를 통한 배포 및 롤백

쿠버네티스 롤백$ k rollout status deployment kubia## deployment 확인하여 error가 있는지 확인 $ k rollout undo deployment kubia## 이전 버젼으로 deploynment 배포(롤백) 특정버젼으로 롤백하기$ k rollout undo deployment kubia --to-revision=1## revision 숫자로 돌아감. 배포관련 옵션 설정spec: strategy: maxSurge: 1 ## 최대 신규 버젼 배포추가 가능건 maxUnavailable: 0 type: RollingUpdate ## rolling update에 있어서 새버젼을 먼저 배포하고 기존 배포건을 지울 것인지, 혹은 기존배포건을 지우고 새버젼을 배포할 것인지 설정..

쿠버네티스를 통한 지속적 배포 전략(rolling, blue green) 실습

쿠버네티스 배포 ## pod들이 배포되어있을때 어떻게 배포할까? ## green blue전략 : 똑같은 수의 pod을 추가로 만들어서 service가 바라보는 쪽을 변경하는 전략. 그러나 리소스가 제한적일 때는 적용 힘듦. ## Rolling update전략 : scale out하면서 기존의 version1 pod들을 제거하는 전략. zero down time, 리소스가 적더라도 적용 가능. 그러나 일정시간에는 고객에게 version1, version2가 혼재함. ※ update version마다 rc가 만들어져야함 중요!! 그러므로 name에 version명을 적어주는게 좋음. apiVersion: v1 kind: ReplicationController metadata: name: kubia-v1 sp..

쿠버네티스 배포를 하기 위한 준비 readinessProbe, livenessProbe

쿠버네티스의 배포 ## 쿠버네티스의 배포는 아래와 같이 진행됨## pod 삭제(kill) -> restart(redeploy) -> okReadiness probes## probe check, 응답이 없으면 end point로 보내지 않는다.(해당 pod정보를 유효하지 않는다고 판단한다.) ## liveness probe : 응답없으면 kill, 정상적인 image인지 판단## readiness probe : 대기, 기다리다가 사용자 connection가능하면 연결시켜줌 ## 보통 2개를 동시에 사용한다. 서로 보완하는 관계## tcp socket, http health 등 사용가능 nginx-ingress-controller.yml apiVersion: extensions/v1beta1 kind: De..

INGRESS를 사용한 쿠버네티스 네트워크 심화(sticky session, ssl connection)

Annotation## label(key=value)이랑 비슷하지만 annotation은 label로 적합하지 않은 값 컨트롤 가능## ingress controller에 추가할 기능들을 annotation으로 설정 하면 좋음 Ingress sticky Session## clientIP의 ip로 부터 호출이 오면 해당 호출을 받은 pod에만 지속적으로 가도록(설정하지 않으면 round robin으로 pod이 계속 바뀐다.## NGINX는 cookie만 가능 - cookie로 같은 컴퓨터로 부터 호출인지 판단함. apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/affinity: "co..

INGRESS를 사용한 쿠버네티스 네트워크 설치 및 연결

## nginx와 INGRESS를 사용하여 쿠버네티스 내부의 어떤 Node에 해당하는 Service로 보낼지 규칙을 정할 수 있다. 예를 들면 zuul 처럼 ## 기본적으로 host기반 그 뒤에 path 기반 ex) kubia.example.com/kubia -> service 1ex) kubia.example.com/foo -> service 2ex) foo.exmple.com -> service3 Namespace 생성하기namespace.yml apiVersion: v1 kind: Namespace metadata: name: ingress-nginx $ k create -f namespace.yml Namespace안에 서비스 생성하기default-backend.yaml apiVersion: ex..