emeraldgoose / kubernetes_study

Kubernetes In Action
0 stars 0 forks source link

7장. 컨피그맵과 시크릿: 애플리케이션 설정 #7

Open emeraldgoose opened 8 months ago

emeraldgoose commented 8 months ago

7.1 컨테이너화된 애플리케이션 설정

컨피그맵을 사용해 환경변수와 같이 설정 데이터를 저장할 수 있다.

emeraldgoose commented 8 months ago

7.2 컨테이너에 명령줄 인자 전달

쿠버네티스에서 컨테니어를 정의할 때 ENTRYPOINT와 CMD 둘 다 재정의할 수 있다. 보통은 사용자 정의 인자만 재정의한다.

kind: Pod
sepc:
  containers:
  - image:
    command: ["/bin/command"]
    args: ["arg1", "arg2", "arg3"]
emeraldgoose commented 8 months ago

7.3 컨테이너의 환경변수 설정

컨테니어 정의에 환경변수를 지정하는 방법은 다음과 같다.

kind: Pod
spec:
  containers:
  - image:
    env:
    - name: INTERVAL # 환경변수 INTERVAL=30을 추가한다
      value: "30"
    name:
env:
- name: FIRST_VAR
  value: "foo"
- name: SECOND_VAR
  value: "$(FIRST_VAR)bar"
emeraldgoose commented 8 months ago

7.4 컨피그맵으로 설정 분리

쿠버네티스에서는 설정 옵션을 컨피그맵이라 부르는 오브젝트로 분리할 수 있다. 컨피그맵은 키-값 쌍으로 구성된 맵이다. 컨피그맵을 생성하는 방법은 kubectl create configmap {configmap_name} --from-literal={key1}={value1} --from-literal={key2}={value2} 명령을 사용한다. 만약 설정 파일을 저장하려면 --from-file 옵션을 사용하고 --from-file={key}={file}로 키 이름을 지정할 수도 있다.

컨피그맵에 여러개의 항목이 존재할 때 파드에서 모든 항목을 환경변수로 갖게 할 수 있다. 환경변수에는 대시(dash)를 가지고 있지 말아야 제대로 인식된다.

spec:
  containers:
  - image:
    envFrom:
    - prefix: CONFIG_ # 모든 환경변수는 CONFIG_ 접두사를 가짐
    configMapRef: # my-config-map이란 이름의 컨피그맵 참조
     name: my-config-map

컨피그맵 값을 컨테이너 안에서 실행되는 인자로 전달하는 방법은 다음과 같다.

spec:
  containers:
  - image: luksa/fortune:args # 환경변수가 아닌 첫 번째 인자에서 간격(interval)을 가져오는 이미지
    env: # 컨피그맵에서 환경변수 정의
    - name: INTERVAL
      valueFrom:
        configMapKeyRef:
          name: fortune-config
          key: sleep-interval
    args: ["$(INTERVAL)"] # 인자에 앞에서 정의한 환경변수 지정

볼륨 안에 있는 컨피그맵 항목을 사용하는 방법은 다음과 같다.

apiVersion: v1
kind: Pod
metadata:
  name:
spec:
  containers:
  - image:
    name:
    volumeMounts:
    ...
    - name: config
      mountPath: /etc/nginx/conf.d # 컨피그맵 볼륨을 마운트하는 위치
      readOnly: true
    ...
  volumes:
  ...
  - name: config
    configMap: # 이 볼륨은 fortune-config 컨피그맵을 참조한다
      name: fortune-config
...

컨피그맵 볼륨 안에 파일로 노출될 항목을 정의하려면, 다음과 같이 items 속성을 이용한다.

volumes:
- name: config
  configMap:
    name: fortune-config
    items: # 볼륨에 포함할 항목을 조회해 선택
    - key: my-nginx-config.conf # 해당 키 아래에 항목 포함
      path: gzip.conf # 항목 값이 지정된 파일에 저장

전체 볼륨을 마운트하는 대신 volumeMount에 subPath 속성으로 파일이나 디렉터리 하나를 볼륨에 마운트할 수 있다.

spec:
  containers:
  - image:
    volumeMounts:
    - name: myvolume
      mountPath: /etc/someconfig.conf # 디렉터리가 아닌 파일을 마운트
      subPath: myconfig.conf # 전체 볼륨을 마운트하는 대신 myconfig.conf 항목만 마운트

기본적으로 컨피그맵 볼륨의 모든 파일 권하는 644(-rw-r-r--)로 설정된다. 볼륨 정의 안에 있는 defaultMode 속성을 설정해 변경할 수 있다.

volumes:
- name: config
  configMap:
    name:
    defaultMode: "6600" # -rw-rw-----로 설정

한 가지 주의 사항은 전체 볼륨 대신 단일 파일을 컨테이너에 마운트한 경우 파일이 업데이트되지 않는다. 만일 개별 파일을 추가하고 원본 컨피그맵을 업데이트할 때 파일을 업데이트해야 하는 경우 전체 볼륨을 다른 디렉터리에 마운트한 다음 해당 파일을 가리키는 심볼릭 링크를 생성하는 것이다. 컨테이너 이미지에서 심볼릭 링크를 만들거나, 컨테이너를 시작할 때 심볼릭 링크를 만들 수 있다.

emeraldgoose commented 8 months ago

7.5 시크릿으로 민감한 데이터를 컨테이너에 전달

시크릿은 키-값 쌍으로 가진 맵으로 메모리에만 저장되어 환경변수를 컨테이너에 전달하거나 시크릿 항목을 볼륨 파일로 노출하고 싶을 때 사용한다. 보통 민감하지 않은 일반 설정 데이터는 컨피그맵을 사용하고 민감한 데이터는 시크릿을 사용해 보관한다. 만약 설정파일이 민감하거나 민감하지 않은 정보를 모두 갖고 있다면 시크릿 안에 저장해야 한다. 시크릿은 kubectl create secret 명령을 통해 생성할 수 있다. --from-file옵션을 사용하여 디렉터리 전체를 포함할 수도 있다.

파드에서 시크릿을 마운트하려면 다음과 같이 정의한다.

apiVersion: v1
kind: Pod
metadata:
  name:
spec:
  containers:
    ...
  volumes:
    ...
    - name: certs
      secret: # fortune-https 시크릿을 참조하도록 시크릿 볼륨을 정의한다
        secretName: fortune-https

시크릿의 항목을 환경변수로 노출하려면 다음과 같이 정의한다.

env:
- name: FOO_SECRET
  valueFrom:
     secretKeyRef:
       name: fortune-https # 키를 갖고 있는 시크릿 이름
       key: foo # 노출할 시크릿의 키