반응형

이 글에서는 구성 정보를 애플리케이션과 분리하는 방법을 소개한다.

ConfigMap 과 secret 을 통해서 애플리케이션과 환경 정보를 분리할 수 있다.
ConfigMap 은 민감하지 않은 데이터를 관리한다.
secret은 증명서같은 민감한 데이터를 관리한다.

 

ConfigMap

  • 속성을 key/value 형식으로 가능하다.
  • 속성으로 파일도 가능하다.
  • 최대 1MB이다.

 

ConfigMap - Demo

#01-simple-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-properties
data:
  appUrl: "http://my-app-service"
  timeout: "30"



kubectl apply -f 01-simple-configmap.yaml


파일을 생성하고 적용하고 kubectl get all로 확인해도 아무것도 없는것을 볼 수 있다.
아래 명령어로 확인해보자

kubectl get configmap
# 위와 동일
kubectl get cm

# 결과
NAME               DATA   AGE
app-properties     2      60s
kube-root-ca.crt   1      3h9m

 

자세하게 보려면 아래처럼 할 수 있다.

kubectl describe cm app-properties

#결과
Name:         app-properties
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
appUrl:
----
http://my-app-service

timeout:
----
30


BinaryData
====

Events:  <none>

 

ConfigmMap - 환경변수 주입

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-properties
data:
  appUrl: "http://my-app-service"
  timeout: "30"
---
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  restartPolicy: Never
  containers:
    - name: ubuntu
      image: ubuntu
      env:
        - name: "request.timeout"
          valueFrom:
            configMapKeyRef:
              name: app-properties
              key: timeout
        - name: "application.url"
          valueFrom:
            configMapKeyRef:
              name: app-properties
              key: appUrl
      args:
        - env


위 파일을 생성하고 적용해보자
로그를 확인해보면 환경변수가 제대로 적용된걸 확인할 수 있다.

kubectl logs my-pod

# 결과
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=my-pod
request.timeout=30
application.url=http://my-app-service
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
HOME=/root
# 02-inject-cm-as-env.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-properties
data:
  appUrl: "http://my-app-service"
  timeout: "30"
---
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  restartPolicy: Never
  containers:
    - name: ubuntu
      image: ubuntu
      envFrom:
      - configMapRef:
          name: app-properties
      args:
        - env

 

새로운 파일 생성 후 이전 파일들을 지우고 로그를 확인해보자

# 기존 정보 삭제
kubectl delete  -f 01-simple-configmap.yaml
configmap "app-properties" deleted
pod "my-pod" deleted

# 새로 적용
kubectl apply -f 02-inject-cm-as-env.yaml
configmap/app-properties created
pod/my-pod created

# 로그확인
kubectl logs my-pod

#결과
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=my-pod
appUrl=http://my-app-service
timeout=30
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOME=/root

 

ConfigMap - 파일 삽입

이전 정보를 삭제하고 파일을 생성한 후 적용해보자

# 03-inject-cm-as-file.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-properties
data:
  application.properties: |
    appUrl=http://my-app-service
    timeout=30
    a.b.c=something
    username=sy



kubectl delete -f 02-inject-cm-as-env.yaml
kubectl apply -f 03-inject-cm-as-file.yaml


이제 확인해보면 잘 생성된것을 볼 수 있다.

kubectl get cm app-properties -o yaml

# 결과
apiVersion: v1
data:
  application.properties: |
    appUrl=http://my-app-service
    timeout=30
    a.b.c=something
    username=sy
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"application.properties":"appUrl=http://my-app-service\ntimeout=30\na.b.c=something\nusername=sy\n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"app-properties","namespace":"default"}}
  creationTimestamp: "2024-12-16T07:54:03Z"
  name: app-properties
  namespace: default
  resourceVersion: "18713"
  uid: 7fbc03a8-8bc4-45d1-847c-be46a1e2878e


아래처럼 파일을 수정해보자

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-properties
data:
  application.properties: |
    appUrl=http://my-app-service
    timeout=30
    a.b.c=something
    username=sy
---
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  terminationGracePeriodSeconds: 1
  restartPolicy: Never
  containers:
  - name: ubuntu
    image: ubuntu
    volumeMounts:
      - name: config-volume
        mountPath: /user/share/props
    args:
      - sleep
      - "3600"
  volumes:
  - name: config-volume
    configMap:
      name: app-properties


적용하고 컨테이너에 진입해서 확인해보자

kubectl apply -f 03-inject-cm-as-file.yaml

# 결과
configmap/app-properties created
pod/my-pod created

# 컨테이너 접속
kubectl exec -it my-pod -- bash
root@my-pod:/# cd /usr/share/props
root@my-pod:/usr/share/props# ll

# 결과
drwxrwxrwx 3 root root 4096 Dec 16 08:03 ./
drwxr-xr-x 1 root root 4096 Dec 16 08:03 ../
drwxr-xr-x 2 root root 4096 Dec 16 08:03 ..2024_12_16_08_03_44.82811588/
lrwxrwxrwx 1 root root   30 Dec 16 08:03 ..data -> ..2024_12_16_08_03_44.82811588/
lrwxrwxrwx 1 root root   29 Dec 16 08:03 application.properties -> ..data/application.properties

# 확인
cat application.properties

# 결과
appUrl=http://my-app-service
timeout=30
a.b.c=something
username=sy

 

파일이 잘 들어간것을 확인할 수 있다.






반응형

'Kubernetes' 카테고리의 다른 글

[Kubernetes] Persistent Volume & StatefulSet  (0) 2024.12.30
[Kubernetes] Secret  (0) 2024.12.19
[Kubernetes] Probes  (0) 2024.12.19
[Kubernetes] Namespace  (0) 2024.12.19
[Kubernetes] Service  (0) 2024.12.17
얼은펭귄