docker run에 환경 변수를 전달할 때 


주의해야 할 사항이 있다.  순서이다.



동작 안하는 예시이다. -it 뒤에 -e을 사용하면 적용이 안된다.

docker run -p 80:80  -it -e PHASE="sandbox" voucher-renderer


-it 플래그와 -e 플래그를 분리해야 한다.

docker run -p 80:80 -e PHASE="sandbox" -it voucher-renderer


Posted by '김용환'
,



 kubernetes 에서 tls 정보를  namespace별로 저장한다.




#!/usr/bin/env bash

root="$(cd "$( dirname "${BASH_SOURCE[0]}")/.." && pwd )"
source $root/.env
cd $root

kubectl config use-context google-production-context

declare -a phases=("sandbox" "beta" "production")
for phase in "${phases[@]}"
do
echo "$phase"
## google.com secret 생성하기
kubectl create secret tls google-com --key $root/cert/google.com.key --cert $root/cert/google.com.crt -n $phase

## kakao.com secret 확인하기
kubectl describe secret google-com -n $phase
done

## 인증서 확인하기
kubectl get cm -n ingress-nginx ingress-nginx -o yaml


인증서를 tls 정보로 변경할 때 유의할 점은 namespace 별로만 인증서를 인식한다.


즉 production namespace에서 default에 저장된 tls 인증서를 찾지 못한다. 

Posted by '김용환'
,





https://news.v.daum.net/v/20190909150742971


크루그먼 교수는 홍남기 경제부총리 겸 기획재정부 장관과 면담에선 과거 일본 경제를 예로 들며 “현재 경제가 나쁜 만큼 한국은 단기적인 대응을 취해야 하며 그럴 여력도 있다”면서 “디플레이션이 한국경제에서 나타나는 것을 막아야 하므로 장기적 전망보단, 정부의 과감하고 즉각적인 조치가 필요하다”고 조언했다. 그가 말하는 대응은 한국 정부가 최근 추진하고 있는 확장적 재정을 통한 경기부양과 맥을 같이 한다. 기재부는 내년도 예산을 올해 대비 9.3% 인상된 514조원 규모의 초슈퍼로 편성했다.



최저임금을 놓고는 “최저임금 인상은 소비자들의 지출 여력을 높이고 돈을 더 많이 쓸 수 있도록 이끌어주기에 경제에 긍정적”이라면서도 “지금과 같이 세계 경기 전망이 어두워지는 시기엔 무엇보다 정부 예산을 통해 공공 지출을 늘려 경기를 부양하는 것이 훨씬 더 큰 효과가 있다"고 평가했다.





https://eiec.kdi.re.kr/material/conceptList.do?idx=150


재정정책과 구축효과
정부가 지출을 늘리는 확장적 재정정책을 실시하면 총수요가 증대되고 경제의 움직임은 활발해진다. 경제활동이 활발해지고 소득이 증가하면 사람들은 더 많은 화폐를 필요로 한다. 돈을 필요로 하는 사람이 늘어나면 돈을 구하기 어려워지고 이자율이 올라간다. 한편, 정부가 지출을 늘리려면 예산보다 돈이 더 필요해진다. 정부는 부족한 돈을 자금시장에서 빌리게 되며, 이것은 자금의 수요가 증가하는 효과를 가져 오기 때문에 이자율이 올라간다. 정부가 지출을 위해 필요한 돈을 국채를 발행해서 조달하면, 채권공급이 늘어나면서 채권가격이 떨어지고, 이자율은 올라가는 것이다. 이자율이 올라가면 돈을 빌리는 비용이 커지기 때문에 기업은 투자를 줄인다. 기업이 돈을 빌리지 않고 자기 돈으로 투자해도 마찬가지다. 돈의 투자에 지출하는 기회비용이 커졌기 때문이다. 이처럼 정부지출이 늘어나면 총수요가 늘어나지만 이자율이 올라가기 때문에 기업 투자가 위축되어 총수요는 다시 감소하는 것을 구축효과(crowding-out effect)라고 한다.

Posted by '김용환'
,

kube-prompt

카테고리 없음 2019. 9. 9. 13:45



https://github.com/c-bata/kube-prompt 는 쿠버네티스 커맨드 자동 완성기이다.



macOS 설치 방법은 다음과 같다. 


 brew install c-bata/kube-prompt/kube-prompt



사용 방법은 간단하게 kube-prompt를 실행하고 kubectl 다음의 하위 커맨드를 사용한다.




Posted by '김용환'
,


이번에 회사에서 동료들의 if kakao 2019 발표 프레젠테이션을 도운 내용(컨설팅?) 을 정리해 본다.


사실 나도 잘 못해서 늘 부끄럽다. 그래도 처음 발표하는 사람들 입장에서는 두렵고 떨리고 도움 받고 싶을 것 같아서. 기록차원에서 남겨둔다.




(예전에 발표했던 사진이다. 허접함이 넘친다. 배울 것이 많던 시절이다)





1. 업무하면서 발표준비하기 때문에 건강을 잘 챙기면서 간다.

발표일까지 마라톤이라 생각하고 1달 정도부터는 잘 진행한다.

발표 일주일 동안은 문서 생각은 뒤로 하고 즐겁게 다니고 건강을 잘 챙긴다. 많이 초조해지는 시기..



2. 스토리텔링 위주로 정리하는 것이 좋다. (기억이 잘 나게 한다)

의도를 명확히 하기 위해 그림을 잘 사용한다.



3. 논란이나 오해할 만한 내용은 자세하게 그리지 말고

말로 중요만 찍고 넘어 간다. 발표 프레젠테이션의 목표만 살펴본다.



4. 발표 자료의 오타, 자간, 필요없는 부제목, 연관없는 내용이 없게 한다.

글자 폰트는 너무 작게 하면 뒤에서 안 보인다.  한 장에 너무 많은 내용을 품으면 청중이 잘 이해를 못한다. 발표 자료를 한 장에 꽉 채우지 않게 하고 하단 20%는 버려야 한다. 뒤에 있는 청중이 잘 볼 수 있게 한다.

(이 부분이 발표자의 감정을 상하게할까봐 조심스러웠다. 질문과 답 형태로 정말 이 발표 프레젠테이션이 잘되면 좋겠다는 마음으로 진행한다)



5. 수치(성능) 자료가 있을 때는 명확한 내용이 나오게 한다. 

애매하다면 차라리 뺀다. 



6. 발표 프레젠테이션의 그림 자료는 중요하다.

캡쳐한 것은 의외로 화질이 안좋고, 기본 제공하는 이미지나 박스는 그렇게 예쁘지 않다.


구글에서 "free icon 단어"로 검색해서 저작권 없는 이미지가 있으니 일관성 있는 느낌이 되도록 그림을 추가한다.


ex) "free icon corn" 검색

"카카오톡 프레젠테이션" 검색



7. 발표 내용은 모두 외우는 것이 좋다. 그래서 스토리텔링 위주가 좋다는 게 그 배경이다.

(예전에 삼성전자에서 발표하다가 프레젠테이션이 문제가 있어서 컴퓨터가 아예  작동이 안된 적이 있었다. 그때 도움이 되었다)



8. 발표가 끝날 때까지 끝난게 아니다.  실수하면 당황할 수 있는데..  만회하면 된다. 편하게 즐겁게 한다.



9. 발표 끝나면 짧으면 몇 시간, 길면 한 달동안  여러 감정(공허감, 인정, 자존감, 인정받고 싶은 감정)이 왔다 갔다 한다.. 나는 나름 훈련할 때. 이런 생각을  했다 "나는 특별한 사람이 아니다. 그냥 발표 한 번 한 것이다." 이렇게 생각하고 현업에 잘 집중하려고 노력한다. 




이외..


진지한게 좋을까? 농담하는 것이 좋을까?(분위기 업)





진지/농담에 대한 부분은 정답은 없는데..  


경험한 내용으로 봤을때


어설픈 농담보다는 그냥 진지한게 100~1000배 낫다. 청중의 관심을 끄는 데 도움이 되겠지만 주제에 부합되는 부분이 아닌 농담은 안하는 게 낫다. (발표 내용이 아니라 자신을 더욱 돋보이려는 의도가 있을 때.. 언젠가 안 좋은 쪽으로 돌아왔다)




유머는 발표 목적에 부합될 때 사용하는 것이 좋다. 본인의 경험한 얘기를 얘기하고 어떻게 이겨냈는지 자신의 얘기를 하면서 즐겁게 얘기하는 수준도 좋다. 수백번 말로 설득하는 것보다 경험한 하나의 얘기가 청중을 사로 잡는다. 



긴장감없고 자연스러울 때 유머가 자연스럽게 나온다 .



안좋은 상황 또는 진지한 상황에서 유머하면 먹히지 않는다. 더 싸해진다. 그 때는 발표 목적에만 집중한다. 진지한 분위기를 억지로 띄울 필요가 없다. 



공격할 목적으로 유머는 하지 않아야 한다(반성 중..) 






그 다음에는 그림 자료를 보여줄 때 잠깐 기다려주는(멈추는) 것이 좋을까?  아니면 바로 그림 설명을 할까? 에 대한 내용이다.


침묵은 청중을 한 번에 집중하는 효과를 갖는다. 중요한 내용, 정말 하고 싶었던 내용, 중요한 그림, 고민이 필요한 내용에 잠깐 2-3초 쉬어주면 청중 모두가 발표자를 쳐다본다.


그 때 하고 싶은 말을 진행한다. 그러나 너무 오래 남발해서 의미 없는 발표 자료까지 집중시키려 하면 더 이상 쳐다보지 않는다. 경험상 2-3번 정도가 좋은 것 같다. 









Posted by '김용환'
,



패킷 손실과 대역폭을 테스트할 수 있는 툴이다.


https://github.com/tylertreat/Comcast


comcast --device=eth0 --latency=250 --target-bw=1000 --default-bw=1000000 --packet-loss=10% --target-addr=8.8.8.8,10.0.0.0/24 --target-proto=tcp,udp,icmp --target-port=80,22,1000:2000




Comcast를 래핑해서 도커로 말아서 사용할 수 있다. 


https://github.com/docker-in-practice/docker-comcast




$ docker pull dockerinpractice/comcast


$ alias comcast="docker run --rm --pid=host --privileged -v /var/run/docker.sock:/var/run/docker.sock dockerinpractice/comcast"

Posted by '김용환'
,



(쿠버네티스를 처음 공부하고 테스트하는 사람에게 도움이 된다)


간단하게 kubernetes 앱을 실행할 때는 apply를 사용하는 것이 가장 쉽다. 


kubectl apply -f kubernetes.yml



반대로 자원/실행 종료는 다음과 같다.


kubectl delete -f kubernetes.yml


기억이 나지 않을 때는 아래와 같이 delete를 직접 해도 된다.


kubectl delete deployment {deployment_name} 



kubectl delete 를 진행할 때 주의해야 하는 부분이 있다. 





만약 namespace를 정하면 부분이 yaml에 있는데 kubectl delete를 실행하면 namespace의 모든 deployment도 삭제되니. 주의해야 한다.


Posted by '김용환'
,


애플리케이션을 하나만 사용할 때는 대충 아래와 같이 사용할 수 있으나. 


$ kubectl get pod,service,deployment  -n production



엄청나게 많은 애플리케이션이 실행 중이라면 잘 눈에 들어오지 않는다.


service/selector를 이용해 상태를 확인할 수 있다. 



$ kubectl get pod,service,deployment --selector app=in-config -n production

NAME                            READY   STATUS    RESTARTS   AGE

pod/in-config-b6c89f44b-2mpr8   1/1     Running   0          32m

pod/in-config-b6c89f44b-fd58c   1/1     Running   0          44m

....


Posted by '김용환'
,



커맨드 기록 저장하기. 


$ kubectl apply -f kubernetes.yml  --record



커맨드 히스토리 보기

$ kubectl rollout history deployment in-config -n production

deployment.extensions/google-config

REVISION  CHANGE-CAUSE

1         kubectl apply --filename=kubernetes.yml --record=true




history의 revision 1으로 롤백도 할 수 있다. 


$ kubectl rollout history deployment in-config -n production --revision=1

deployment.extensions/in-config with revision #1

Pod Template:

  Labels: app=google-config

pod-template-hash=627459006

  Annotations: kubernetes.io/change-cause: kubectl apply --filename=kubernetes.yml --record=true

  Containers:

   google-config:

    Image: ..

    Port: 8080/TCP

    Host Port: 0/TCP

    Requests:

      cpu: 1

      memory: 1000Mi

    Liveness: http-get http://:8080/actuator/health delay=3s timeout=1s period=3s #success=1 #failure=3

    Environment: <none>

    Mounts: <none>

  Volumes: <none>



비슷하게 바로 직전으로 롤백할 수 있다.


$ kubectl rollout undo deployment  in-config -n production


Posted by '김용환'
,


spring cloud config를 살펴보니..  4가지 정도가 주의하면 좋을 것 같다.


1. 
Spring Cloud(Boot) 주요 클래스에 @EnableConfigServer를 붙이기


@RestController
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

@RequestMapping(value = "/")
public @ResponseBody String root() {
return "Global Config Server";
}

public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}



2. 

설정 이름 주의하기

yaml 파일의 이름을

${ApplicationName}-${EnvironmentName}.yml로 설정해야 한다.


즉 아래와 같은 형태로 되어야 spring cloud config 설정을 확인할 수 있다. 

global-beta.yml

order-alpha.yml


따라서


http://localhot:8080/global/beta 

http://localhot:8080/order/alpha 이렇게 접근할 수 있다.




3. 

private 저장소의 경우 암호를 넣어야 한다.

spring.cloud.config.server.git.username=google-lab
spring.cloud.config.server.git.password=lab1234



4. 

spring cloud git url을 설정할 때 root 주소로 접근해야지 git 저장소의 sub directory에 접근하려고 하면 파싱 에러(org.eclipse.jgit.api.errors.TransportException: invalid advertisement of) 가 난다. 


이렇게 하지 말고

spring.cloud.config.server.git.uri=https://github.com/google/internal-config/config


아래와 같이 저장소 로 접근해야 한다.

spring.cloud.config.server.git.uri=https://github.com/google/internal-config


runtime 에러에서 final int tab = line.indexOf('\t'); 부분에서 에러가 발생한 것을 확인할 수 있다.

package org.eclipse.jgit.transport;

public class TransportHttp extends HttpTransport implements WalkTransport,

PackTransport {


Map<String, Ref> readAdvertisedImpl(final BufferedReader br)

throws IOException, PackProtocolException {

final TreeMap<String, Ref> avail = new TreeMap<>();

for (;;) {

String line = br.readLine();

if (line == null)

break;


final int tab = line.indexOf('\t');

if (tab < 0)

throw invalidAdvertisement(line);




git 저장소 대신 로컬 파일 시스템에서 테스트하려면 spring.cloud.config.enabled=false을 사용한다. 




Posted by '김용환'
,