[Configmap의 주요 기능]
- 명령행 인자를 통한 컨테이너에 명령어 전달
- 각 컨테이너에 대한 사용자 정의 환경 변수 설정
- 특별한 볼륨 타입을 통해 컨테이너에 설정 파일을 마운트
ㅁ 도커에서 명령어 인자 정의
- Entrypoint와 CMD
Entrypoint는 컨테이너가 시작됐을 때 호출돼야 할 실행 파일을 정의
CMD는 Entrypoint로 전달할 인자를 지정
이미지가 실행될 때 수행할 명령을 지정하기 위해 CMD 명령을 사용할 수 있지만 올바른 방법은 ENTRYPOINT를 사용해 실행 파일을 수행하고 기본 인자가 필요한 경우에만 CMD를 지정하는 것.
$docker run <image>
-->
$docker run <image> <arguments>
shell과 exec 형식간의 차이점
ㅁ shell 형식: ENTRYPOINT node app.js.
ㅁ exec 형식: ENTRYPOINT ["node", "app.js"]
[예제1. fortune 이미지에 설정 가능한 인터벌 만들기] fortune-args / fortuneloop.sh
#!/bin/bash
trap "exit" SIGINT
INTERVAL=$1
echo Configured to generate new fortune every $INTERNAL seconds
mkdir =p /var/htdocs
while :
do
echo $(date) Writing fortune to /var/htdocs/index.html
/usr/games/fortune > /var/htdocs/index.html
sleep $INTERVAL
done
[예제2. 업데이트된 fortune 이미지를 위한 도커 파일:fortune-args/Dockerfile]
FROM ubuntu:latest
RUN apt-get update ; apt-get -y install fortune
ADD fortuneloop.sh /bin/fortuneloop.sh
ENTRYPOINT ["/bin/fortuneloop.sh] #ENTRYPOINT 명령어 exel 형식
CMD ["10"] #실행을 위한 기본 인자 실행을 위한 기본 값을 갖는 인자
도커 허브에 이미지를 빌드하고 푸시, 이미지를 최신 이미지 대신 인자로 태그 지정
$ docker build -t docker.io/luksa/fortune:args
$ docker push docker.io/luksa/fortune:args
도커가 로컬에서 실행해 이미지를 테스트
$ docker run -it docker.io/luksa/fortune:args
인자를 통해 기본 슬립 간격을 재정의
$ docker run -it odcker.io/luksa/fortune:args 15
[사용자 정의 명령어와 인자를 명시하기 위한 Pod의 정의]
kind: Pod
spec:
containers:
- image: some/image
command: ["/bin/command"]
args: ["arg1", "arg2", "arg3"]
도커 | 쿠버네티스 | 설명 |
ENTRYPOINT | Command | 컨테이너 내부에서 실행되는 실행 파일 |
층 | args | 실행 파일에 전달된 인자 |
[사용자 정의 인터벌을 통해 fortune Pod 실행하기]
apiVersion: v1
kind: Pod
metadata:
name: fortune2s #Pod의 이름을 변경
spec:
containers:
- image: luksa/fortune:args # fortune:latest 대신에 fortune: args 사용
args: ["2"] #2초마다 스크립트를 생성하는 인자
name: html-generator
volumeMounts:
- name: html
mountPath: /var/htdocs
...
컨테이너의 환경 변수 설정
[환경 변수를 통해 인터벌을 설정할 수 있는 fortune 이미지 만들기]
#!/bin/bash
trap "exit" SIGINT
echo Configured to generate new fortune every $INTERNAL seconds
mkdir =p /var/htdocs
while :
do
echo $(date) writing fortuen to /var/htdocs/index.html
/usr/games/fortune > /var/htdocs/index.html
sleep $INTERNAL
done
[컨테이너 환경 변수 지정]
kind: Pod
spec:
containers:
- image: luksa/fortune:env
env:
- name: INTERNAL
value: "30"
name: html-generator
...
ㅁ ConfigMap 소개
쿠버네티스는 설정 옵션을 ConfigMap이라는 별도의 객체로 분리
이 객체는 간단한 문구부터 전체 설정 파일에 이르는 값을 갖는 키/값 쌍을 포함하는 Map
애플리케이션은 ConfigMap을 직접 읽거나 그것이 존재하는 것을 알 필요가 없음
맵의 내용은 대신 환경 변수 또는 볼륨의 파일로 컨테이너에 전달되고 환경 변수는 $(ENV_VAR)구문을 사용해 명령줄 인자에서 참조할 수 있다.
애플리케이션은 필요한 경우 쿠버네티스 REST API 엔드포인트를 통해 ConfigMap의 내용을 직접 읽을 수 있지만, 반드시 필요한 경우가 아니면 애플리케이션을 최대한 쿠버네티스에 종속적이지 않도록 유지해야 한다.
애플리케이션이 ConfigMap을 사용하는 방식에 관계없이 이와 같은 분리된 독립 실행형 객체를 설정하면 동일한 이름의 ConfigMap에 대해 각각 다른 매니페스트(개발, 테스트, QA)의 유지가 가능해짐
Pod는 이름으로 ConfigMap을 참조하기 때문에 각 환경에서 서로 다른 설정으로 사용할 수 있다.
ㅁ ConfigMap 생성
단일키가 있는 맵을 작성하고 이 맵을 사용해 이전 예제의 Interval 환경 변수를 채움
YAML을 게시하기 위해 일반적으로 사용했던 kubectl create -f 명령 대신 ConfigMap을 작성하는 전용 명령 kubectl create configmap을 사용
[kubectl create configmap 명령 사용]
$ kubectl create configmap fortune-config --from-literal=sleep-interval=25
여러개의 리터럴 엔트리를 포함하는 ConfigMap을 만들려면 --from-literal 인자를 여러개 추가
$ kubectl create configmap myconfigmap
-- from-literal=foo=bar --from-literal=bar=baz --from-literal=one=two
ㅁ CofigMap의 Yaml 디스크립터를 보는 방법
$ kubectl get configmap fortune-config -o yaml
apiVersion: v1
data:
sleep-interval: "25"
kind: ConfigMap
metadata:
creationTimestamp: 2016-08-11T2:32:08Z
name: fortune-config
namespace: default
resourceVersion: "910025"
selfLink: /api/v1/namespaces/default/configmaps/fortune-config
uid: 88c4165e-6002-11e6-a50d-42010af00237
$ kubectl create -f fortune-config.yaml
[파일 내용으로 ConfigMap 엔트리 생성]
$ kubectl create configmap my-config --from-file = config-file.conf
--> kubectl은 kubectl을 실행하는 디렉터리에서 config-file.conf 파일을 찾음
--> 이 경우 파일 이름이 map의 key로 사용
$ kubectl create configmap my-config --from-file = customkey = config-file.conf
--> 이 경우 key = customkey, value = config-file.conf
--> 리터럴과 마찬가지로 --from-file 인자를 여러번 사용해 여러 파일 추가 가능
[디렉토리에 있는 파일로부터 ConfigMap 만들기]
$ kubectl create configmap my-config --from-file=/path/to/dir
[옵션 결합]
CofigMap을 만들 때 지금까지 언급한 모든 옵션 조합 가능
$ kubectl create configmap my-config \
--from-file=foo.json \ # 단일 파일
--from-file=bar=foobar.conf \ # 사용자 정의 키 밑에 저장된 파일
--from-file=config-opts/ \ # 전체 디렉토리
--from-literal=some=thing \ # 리터럴 값
ㅁ 컨테이너의 환경 변수로 ConfigMap 엔트리 전달
[ConfigMap상의 환경 변수가 있는 포드: fortune-pod-env-configmap.yaml]
apiVersion: v1
kind: Pod
metadata:
name: fortune-env-from-configmap
spec:
containers:
- image: luksa/fortune:env
env:
- name: INTERVAL # INTERVAL이라는 환경 변수를 설정
valueFrom:
configMapKeyRef: #.고정값을 설정하는 대신에 ConfigMap 키로부터 초기화함
name: fortune-config # 참조하고 있는 ConfigMap의 이름
key: sleep-interval # ConfigMap에서 이 키에 저장된 값으로 변수를 설정
[ Pod에 존재하지 않는 ConfigMap의 참조]
Pod를 생성할 때 참조했던 ConfigMap이 없으면 존재하지 않는 ConfigMap을. 참조하는 컨테이너는 시작되지 않지만 다른 컨테이너들은 정상적으로 시작됨
그런 다음 누락된 ConfigMap을 생성하는 경우, 실패한 컨테이너는 Pod를 다시 생성할 필요 없이 시작 된다.
ㅁ ConfigMap의 모든 항목을 한번에 환경 변수로 전달
spec:
containers:
- image: some-image
envFrom: # env대신에 envFrom을 사용
- prefix: CONFIG_ # 모든 환경 변수는 CONFIG_ 의 접두어가 붙여짐
configMapRef: # my-config-map으로 불리는 ConfigMap을 참조
name: my-config-map
ㅁ ConfigMap 항목을 명령행 인자로 전달
인자로 ConfigMap 항목을 사용하기: fortune-pod-args-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
name: fortune-args-from-configmap
spec:
containers:
- image: luksa/fortune:args # 환경 변수가 아닌 첫번째 인자에서 interval을 사용하는 이미지 사용
env: # 환경 변수 정의하기
- name: INTERVAL
valueFrom:
configMapKeyRef:
name: fortune-config
key: sleep-interval
args: ["$(INTERVAL)" ] # 인자에 환경 변수를 참조하기
...
ㅁ ConfigMap 엔트리를 파일로 노출하기 위해 ConfigMap 볼륨 사용
[ConfigMap 생성] my-nginx-config.confg.conf
server {
listen 80;
server_name. www.kubia-example.com;
gzip on;
gzip_types text/plain application/xml;
location / {
root. /usr/share/nginx/html;
index. index.html index.htm;
}
}
$ kubectl create configmap fortune-config --from-file=configmap-files
[파일로부터 생성된 ConfigMap의 YAML 정의]
$ kubectl get configmap fortune-config -o yaml
apiVersion: v1
data:
my-nginx-config.conf: |
server {
listen 80;
server_name www.kubia-example.com;
gzip on;
gzip_types text/plain application/xml;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
sleep-interval; |
25
kind: ConfigMap
...
'Kubenetes > ConfigMap & Secret' 카테고리의 다른 글
Secret (Secret 으로 컨테이너에 민감한 데이터 전달하기) (0) | 2021.02.11 |
---|