반응형

목차

  1. 환경변수로 이미지 안에 간격 설정
  2. 컨테이너 정의에 환경변수 지정
  3. 변숫값에서 다른 환경변수 참조
  4. 하드코딩된 환경변수의 단점

 

환경변수로 이미지 안에 간격 설정

컨테이너화된 애플리케이션은 종종 환경변수를 설정 옵션의 소스로 사용합니다. 쿠버네티스는 파드의 각 컨테이너를 위한 환경변수 리스트를 지정할 수 있습니다. 파드 수준에서 환경변수를 설정하고 컨테이너에서 상속받는 것도 유용하지만 안타깝게도 이러한 옵션은 지원하지 않습니다. 컨테이너 명령이나 인자와 마찬가지로 환경변수 목록또한 파드 생성 후에는 업데이트할 수 없다는 점도 명심해야 합니다.

 

fortuneloop.sh 스크립트를 다음 예제처럼 수정해서 환경변수로 애플리케이션을 설정하는 방법을 살펴봅시다.

#!/bin/bash
trap "exit" SIGINT
echo Configured to generate new fortune every $INTERVAL 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

INTERVAL 변수를 초기화하는 행을 제거하면 됩니다. 파드의 애플리케이션app은 간단한 bash 스크립트이기 때문에 다른 작업을 할 필요가 없습니다. 애플리케이션이 자바로 작성된 경 우에는 System.getenv("INTERVAL"), NodeJS로 작성된 경우에는 process.env.INTERVAL, 파이썬으로 작성된 경우에는 os.environ['INTERVAL']을 사용하면 됩니다.


컨테이너 정의에 환경변수 지정

새로운 이미지(luksa/fortune: env 태그를 붙인 이미지)를 생성한 뒤에 도커 허브로 푸시한 후, 새 파드를 만들 때 예제 7.6처럼 환경변수를 컨테이너 정의에 포함해 스크립트에 전달할 수 있습니다.

kind: Pod
spec:
  containers:
  - image: luksa/fortune:env
    env:                                                     >  환경변수 목록에 단일 변수 추가
    - name: INTERVAL
      value: "30"
    name: html-generator
...

이 때 환경변수는 파드 레벨이 아닌 컨테이너 정의 안에 설정합니다. 각 컨테이너를 설정할 때, 쿠버네티스는 자동으로 동일한 네임스페이스에 안에 있는 각 서 비스에 환경변수를 노출합니다는 것을 잊지 말아야 합니다. 이러한 환경변수는 기본적으로 자동 주입식 (auto-injected) 설정입니다.


변숫값에서 다른 환경변수 참조

이전 예에서는 환경변수에 고정 값을 설정했지만, $(VAR) 구문을 사용해 이미 정의된 환경변수나 기타 기존 변수를 참조할 수도 있습니다. 두 개의 환경변수를 정의할 때, 두 번째 환경변수는 다음 예제와 같이 첫 번째 변숫값을 포함할 수 있습니다.

env:
- name: FIRST_VAR
  value: "foo"
- name: SECOND_VAR
  value: "$(FIRST_VAR)bar"

이 경우 SECOND_VAR의 값은 "foobar"가 됩니다. 마찬가지로 이전 포스팅에서 다룬 command와 args 속성 모두 이렇게 환경변수를 참조할 수 있습니다. 이후 컨피그맵을 다룰 때에도 이 방법을 알려드릴 것입니다.


하드코딩된 환경변수의 단점

파드 정의에 하드코딩된 값을 가져오는 것은 효율적이지만, 이는 프로덕션과 개발을 위해 서로 분리된 파드 정의가 필요하다는 것을 뜻합니다. 여러 환경에서 동일한 파드 정의를 재사용하려면 파드 정의에서 설정을 분리하는 것이 좋습니다. 다행히 컨피그맵 리소스를 이런 목적으로 사용할 수 있고, value 필드 대신 valueFrom으로 환경변수값의 원본 소스로 사용할 수 있습니다.

 

반응형