[애플리케이션 스케줄링과 라이프사이클 관리] 컨테이너 환경 변수 전달 방법

IMKUNYOUNG·2023년 8월 3일
0

쿠버네티스

목록 보기
45/64

도커 컨테이너의 환경 설정

  • 쿠버네티스의 환경 변수는 YAML 파일이나 다른 리소스로 전달
  • 하드 코딩된 환경 변수는 여러 환경에 데이터를 정의하거나 유지, 관리가 어려움
  • ConfigMap를 통해 외부에 컨테이너 설정을 저장할 수 있음



환경변수를 파드에 저장하는 방법

node-env.yaml

apiVersion: v1
kind: Pod
metadata:
  name: envar-demo
  labels:
    purpose: demonstrate-envars
spec:
  containers:
  - name: envar-demo-container
    image: gcr.io/google-samples/node-hello:1.0
    env:
    - name: DEMO_GREETING
      value: "Hello from the environment"
    - name: DEMO_FAREWELL
      value: "Such a sweet sorrow"


환경변수를 ConfigMap에 저장하는 방법

kubectl create configmap <map-name> <data-source>

  • ex) test 파일을 생성하고 그 파일을 환경 변수로 저장
imkunyoung@cloudshell:~/config (k8s-inflearn)$ vim test

imkunyoung@cloudshell:~/config (k8s-inflearn)$ cat test
1234

imkunyoung@cloudshell:~/config (k8s-inflearn)$ kubectl create configmap map-name --from-file=test
configmap/map-name created

imkunyoung@cloudshell:~/config (k8s-inflearn)$ kubectl get configmap map-name -o yaml
apiVersion: v1
data:
  test: |
    1234
kind: ConfigMap
metadata:
  creationTimestamp: "2023-09-04T09:58:57Z"
  name: map-name
  namespace: default
  resourceVersion: "31764217"
  uid: 812923aa-ecda-4742-9781-f5ce36275a1a


YAML을 사용하여 환경변수를 ConfigMap에 저장하는 방법


node-env-configmap.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.how

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO


환경변수를 Secret에 저장하는 방법

  • 비밀번호, OAuth 토큰 및 ssh 키와 같은 민감한 정보

  • kubectl 명령어로 secret 설정하는 예시
imkunyoung@cloudshell:~/secret (k8s-inflearn)$ cat password username
1f2d1e2e67df
admin

imkunyoung@cloudshell:~/secret (k8s-inflearn)$ kubectl create secret generic db-user-pass --from-file=./username --from-file=./password --dry-run=client -o yaml
apiVersion: v1
data:
  password: MWYyZDFlMmU2N2RmCg==
  username: YWRtaW4K
kind: Secret
metadata:
  creationTimestamp: null
  name: db-user-pass

imkunyoung@cloudshell:~/secret (k8s-inflearn)$ kubectl create secret generic db-user-pass --from-file=./username --from-file=./password
secret/db-user-pass created

imkunyoung@cloudshell:~/secret (k8s-inflearn)$ kubectl get secret
NAME           TYPE                DATA   AGE
db-user-pass   Opaque              2      8s
gasbugs-tls    kubernetes.io/tls   2      34d
apiVersion: v1
data:
  password: MWYyZDFlMmU2N2RmCg==
  username: YWRtaW4K
kind: Secret
metadata:
  creationTimestamp: null
  name: db-user-pass
  • secret 에는 DB의 user와 password와 같이 민감한 파일들이 base64 인코딩돼서 저장됨
  • 이 값이 안전한 것은 아니지만 공격자에게 혼란줄 수 있다.



YAML 파일로 환경변수 Secret에 저장하는 방법

  • 수동으로 데이터를 만들어야 하는 경우에는 base64 인코딩을 수동으로 해주어야 한다.
imkunyoung@cloudshell:~/secret (k8s-inflearn)$ echo -n 'admin' | base64
YWRtaW4=
imkunyoung@cloudshell:~/secret (k8s-inflearn)$ echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
apiVersion: v1
kind: Secret
metadata:
  name: db-user-pass
data:
  password: MWYyZDFlMmU2N2RmCg==
  username: YWRtaW4K

0개의 댓글