반응형
이 글에서는 구성 정보를 애플리케이션과 분리하는 방법을 소개한다.
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 |