(이미지만 참고) Refernece : https://www.youtube.com/watch?v=TFAASAfO_gg





외부 또는 중요한 내부 서버와 통신할 때 ACL을 뚫어서 통신할 때가 있다.


현재 kubernetes 클러스터의 서버(node)만 보고 ACL을 뚫으면 나중에 새로운 서버가 추가되고 새로운 장비에 실행된 pod에서는 막힌 부분 때문에 에러가 발생할 것이다.



특정 장비(node)에만 pod를 배포하면 이슈가 없을 것이다.



이에 대한 2가지 방법이 있다.


1. pod 적용


이 방식은 공식 문서에 있는 방식이다. 



https://kubernetes.io/docs/concepts/configuration/assign-pod-node/






2. deployment 적용




$ kubectl label nodes google-k8s-worker001 server=google-config

$ kubectl label nodes google-k8s-worker002 server=google-config



$ kubectl get nodes -l server=google-config
NAME               STATUS   ROLES   AGE   VERSION
google-k8s-worker001   Ready    node    14d   v1.11.5

google-k8s-worker002   Ready    node    14d   v1.11.5
 


apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: google-config
namespace: production
spec:
selector:
matchLabels:
app: google-config
replicas: 2
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 3
maxUnavailable: 3
template:
metadata:
labels:
app: google-config
spec:
nodeSelector:
server: google-config

containers:
- name: google-config
image: dockerhub-url
imagePullPolicy: Always


테스트 방법은 다음과 같다. 

google-config를 1번 2번 장비에서만 실행되게 했다.


$ kubectl delete pod $(kubectl get pods | grep config | awk '{print $1}') 


삭제된 pod가 계속 1번 2번 장비에서 실행되는지 확인한다.




Posted by 김용환 '김용환'

댓글을 달아 주세요



도커 컨테이너가 시작될 때 사용되는 커맨드로 CMD와 ENTRYPOINT가 있다. 



<CMD >

도커 컨테이너가 시작될 때 실행된다. 

CMD를 사용해야 ARG와 ENV를 쉽게 사용한다.

CMD ["Executable", "매개 변수"...] 
CMD의 매개 변수는 docker run에 사용된 매개변수로 덮어쓰인다




<ENTRYPOINT>

도커 컨테이너가 시작될 때 실행된다. 

CMD의 매개 변수는 docker run에 사용된 매개변수로 덮어쓰지 않는다. 즉 그대로 실행된다.



Posted by 김용환 '김용환'

댓글을 달아 주세요



코딩으로 따지면 컴파일 타임(compile-time), 런타임(run-time)처럼..

도커 파일에는 이에 해당하는 ARG(build-time)와 ENV(run-time)가 존재한다. 




<ARG>


표현식 : ${변수:+값}, ${변수:-값} 

빌드 시점에 사용한다

도커 파일에서 ARG 변수 혹은 ARG 변수=값 형태로 표현할 수 있다. 

docker build 커맨드에 --build-arg 옵션을 사용해 매개 변수를 전달하거나 덮어쓸 수 있다. 




<ENV>

표현식 : ${변수:+값}, ${변수:-값} 

런타임 환경변수이다

docker run 커맨드 --e 옵션을 활용해 매개 변수를 전달하거나 덮어쓸 수 있다.





개인적으로 ARG보다는 ENV를 사용해 docker run을 사용하는 편이다. 






Posted by 김용환 '김용환'

댓글을 달아 주세요



도커 파일에서 env를 사용할 때 항상 env를 사용할 수 없다.

RUN, CMD, ENTRYPOINT에만 사용할 수 있다.


나 같은 경우는 k8s를 사용하고 런타임에 PHASE를 사용할 것이라 ENTRYPOINT에 추가했다.


ENV PHASE production
...
ENTRYPOINT /usr/src/app/docker-entrypoint.sh "$PHASE"


실제 docker-entrypoint.sh 를 다음과 같이 구성했다.


#!/bin/sh

ln -sf /etc/nginx/$1.nginx-vhost.conf /etc/nginx/nginx-vhost.conf

service nginx start

phantomjs --ssl-protocol=any rasterize.js



빌드는 다음과 같이 해서 테스트할 수 있다.


docker build -t voucher-renderer .

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


Posted by 김용환 '김용환'

댓글을 달아 주세요


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 김용환 '김용환'

댓글을 달아 주세요