Cloud/k8s-CKAD

[CKAD] 환경 변수 Configmap 과 Secret 사용하기

jinkwon.kim 2024. 1. 30. 22:30
728x90
반응형

개요

container 환경 변수를 사용하는 방법을 알아보겠습니다. 

환경 변수 사용방식

환경 변수를 사용하는 방법에는 총 3가지의 방법이 아래 와같이 존재합니다.

  • Environment Variable
  • ConfigMap
  • Secret

Environment Variable

env 필드에서 key-value 형식으로 사용됩니다. 

아래에서 밖같 박스 부분이 환견 변수를 사용한 부분이며, 환경 변수를 container 하위에서 설정하면 됩니다.

Configmap 개요

사용 이유

container에 영향을 주는 환경변수를 외부에서 관리함으로써 container의 실행 환경을 제어할 때 사용합니다.

사용 절차

1. configmap 생성

2. configmap 확인

3. configmap 사용방법

제한 사항

configmap의 개별 Object는 1 MiB의 크기 제한을 받습니다. 

즉, 2개의 Object를 합쳐서 2 MiB 일 경우에도 문제가 없습니다. 

 

configmap 생성

생성 방법은 2가지(명령어로 생성, yaml 파일로 생성)가 있습니다.

명령어로 생성

1. key : value 형식

Ex) kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

2. key : value(파일 내용) 형식

Ex)  kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt

 

/path/to/bar/file1.txt의 내용이 value가 됩니다

3. key(file 이름) : value(파일 내용) 형식

Ex) kubectl create configmap my-config --from-file=path/to/bar

 

path/to/bar 경로 하위의 "파일 명이 key"가 되고 "파일의 내용의 value"가 됩니다.

4. key(file의 key) : value(file의 value) 형식

Ex) kubectl create configmap my-config-dir3 --from-env-file=./env

 

한 개에 파일에 여러 개의 key=value를 한 번에 지정하여 configmap의 data로 만드는 방식

root@master:~/2# cat env
test1=test_1
test2=test_2

 

root@master:~/2# kubectl describe configmap my-config-dir3 
Name:         my-config-dir3
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
test1:
----
test_1
test2:
----
test_2

yaml로 생성

apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
  # 1개의 key와 value를 쌍으로 생성
  player_initial_lives: "3"
  ui_properties_file_name: "user-interface.properties"

  # 한개의 key에 여러개의 value를 입력
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true

configmap 확인

kubectl describe configmap {configmap object 이름)

root@master:~# kubectl describe configmap game-demo
Name:         game-demo
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
game.properties:
----
enemy.types=aliens,monsters
player.maximum-lives=5    

player_initial_lives:
----
3
ui_properties_file_name:
----
user-interface.properties
user-interface.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true 


BinaryData
====

Events:  <none>

configmap 사용법

container에서 configmap을 어떻게 사용할 수 있는지 알아보겠습니다. 

my-config를 기준으로 테스트가 진행됩니다.

모든 테스트 https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/ 를 기반으로 작성했습니다.

1. configmap 전체를 참조

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: config-pod
  name: config-pod
spec:
  containers:
  - image: busybox
    name: config-pod
    command: ["sleep","36000"]
    envFrom:
      - configMapRef:
          name: my-config
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

ENV 확인 방법

kubectl exec -it {POD 이름} -- sh

/ # echo $key1
config1

/ # echo $key2
config2

2. configmap의 일부 key만을 참조

configmap의 일부 key만을 사용하는 방법입니다.

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: config-pod
  name: config-pod
spec:
  containers:
  - image: busybox
    name: config-pod
    command: ["sleep","36000"]
    env:
    - name: TEST_1
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: key1
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

ENV 확인 방법

kubectl exec -it {POD 이름} -- sh

/ # echo $TEST_1

config1

3. configmap의 volume mount

configmap을 volume처럼 사용하는 방법입니다. 

다음의 yaml 파일은 /etc/config에 configmap Object를 Mount 합니다.

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: config-pod-volume
  name: config-pod-volume
spec:
  containers:
  - image: busybox
    name: config-pod-volume
    command: ["sleep", "36000"]
    volumeMounts:
      - mountPath: /etc/config
        name: my-config
  volumes:
    - name: my-config
      configMap:
        name: my-config
      
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

ENV 확인 방법

key를 파일명으로 configmap이 mount가 됩니다.

 

kubectl exec -it {POD 이름} -- sh

/ # cd /etc/config

 

4. configmap의 일부 key를 volume mount 

configmap에서 일부 key만 volume처럼 사용하는 방법입니다. 

다음의 yaml 파일은 /etc/config에 configmap Object를 Mount 합니다.

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: config-pod-volume-key
  name: config-pod-volume-key
spec:
  containers:
  - image: busybox
    name: config-pod-volume-key
    command: ["sleep", "36000"]
    volumeMounts:
      - mountPath: /etc/config
        name: my-config
  volumes:
    - name: my-config
      configMap:
        name: my-config
        items:
          - key: key1
            path: key1_data
      
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

ENV 확인 방법

key를 파일명으로 configmap이 mount가 됩니다.

 

kubectl exec -it {POD 이름} -- sh

/ # cd /etc/config

Secret 개요

사용 이유

configmap이 평문으로 저장이 되는데 이걸 encoding 하여 살짝 안전하게 사용하기 위해서 사용 됩니다.

그러나 encrytion된것이 아니기때문에 안전하지 않습니다. 그래서 개인적으로 왜 사용하는지 아직도 잘모르겠음.. 그나마 정보가 tmpfs 에 저장되기 때문에 node의 storage에 저장되지 않는 점이 조금 괜찮은거 같습니다.

secret 생성

configmap 생성과 동일합니다. 

딱 한가지 차이 점이 있다면 --from-env-file 옵션 을 지원 하지 않습니다. 

명령어 생성

Configmap과 비교하여 설명 하겠습니다. 

주황색 부분이 다른 부분 입니다. 

1. key : value 형식

kubectl create configmap              my-config --from-literal=key1=config1 --from-literal=key2=config2

kubectl create secret generic        my-secret --from-literal=key1=supersecret --from-literal=key2=topsecret

2. key : value(파일 내용) 형식

kubectl create configmap       my-config --from-file=key1=/path/to/bar/file1.txt

kubectl create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa

secret 사용법

1. secret 전체를 참조

configmap과 유사 하며, configMap 부분이 secret으로 변경되면 됩니다.

configmap 설정

    envFrom:
      - configMapRef:  -> secretRef
          name: my-config

Secret 설정

apiVersion: v1
kind: Pod
metadata:
  name: envfrom-secret
spec:
  containers:
  - name: envars-test-container
    image: nginx
    envFrom:
    - secretRef:
        name: test-secret

2. secret의 일부 key만을 참조

configmap과 유사 하며, configMap 부분이 secret으로 변경되면 됩니다.

configmap 설정

    env:
    - name: TEST_1
      valueFrom:
        configMapKeyRef:  -> secretKeyRef
          name: my-config
          key: key1

secret 설정

apiVersion: v1
kind: Pod
metadata:
  name: envvars-multiple-secrets
spec:
  containers:
  - name: envars-test-container
    image: nginx
    env:
    - name: BACKEND_USERNAME
      valueFrom:
        secretKeyRef:
          name: backend-user
          key: backend-username
    - name: DB_USERNAME
      valueFrom:
        secretKeyRef:
          name: db-user
          key: db-username

3. secret의 volume mount

configmap의 설정을 secret으로 변경하면됩니다. 

4. secret의 일부 key를 volume mount 

configmap의 설정을 secret으로 변경하면됩니다.

정리

k8s에서 환경 변수를 관리하기 위해서 configmap을 지원하며 configmap을 container서 사용하는 방법은 

기본 적으로 2가지 방법이 존재합니다.

1. configmap을 직접 Pod에서 사용

2. configmap을 volume으로 mount해서 사용

728x90
반응형