현업에서 Kubernetes 환경에 서버를 띄운다면
Configuration의 외부화는 필수적입니다.
당장에 생각나는건 아래와 같은 측면에서 유리하다고 볼 수 있을 것 같습니다.
- 민감 정보에 대한 보안 유지
- 환경마다 다른 변수와 애플리케이션 코드 디커플링
- 빠른 로컬 환경 구성
이번 포스팅에서는 쿠버네티스의 ConfigMap을 활용하여
애플리케이션의 환경변수를 외부화 하는 방법을 정리합니다.
목차
1. 기본 사용법
# configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: api-server-config
data:
DATASOURCE_USERNAME: "root"
DATASOURCE_PASSWORD: "1234"
먼저 ConfigMap은 위와 같이 구성해 볼 수 있습니다.
적용 해봅시다.
~ kubectl apply -f configmap.yml
그리고 아래와 같이 Deployment를 구성해봅시다.
여기서는 Volume Mount를 추가로 사용하였습니다.
# deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
spec:
template:
metadata:
name: api-server
spec:
containers:
- name: api-server
image: api-exam:0.0.1
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: dev
volumeMounts:
- name: config-vol
mountPath: /etc/config
restartPolicy: Always
volumes:
- name: config-vol
configMap:
name: api-server-config
확인해봅시다.
~ kubectl exec -it [파드명] -n [네임스페이스] -- /bin/bash
bash-4.2# cd /etc/config/
bash-4.2# cat DATASOURCE_USERNAME
root
위와 같이 정상적으로 ConfigMap 오브젝트가 Pod에 정상적으로 마운팅 된 것을 확인 할 수 있습니다.
이를 활용해서 Application에서 해당 값을 읽어 사용 할 수 있습니다.
2. json 파일로 마운팅
만약 json파일로 volume mount 및 사용하려면 아래와 같이 기입해주면 됩니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: api-server-config
data:
config.json: |
{
"DATASOURCE_USERNAME": "root",
"DATASOURCE_PASSWORD": "1234"
}
그러면 아래와 같이 json 파일로 mount되어 있는 것을 확인 할 수 있습니다.
bash-4.2# cat config.json
{
"DATASOURCE_USERNAME": "root",
"DATASOURCE_PASSWORD": "1234"
}
3. 환경변수로 사용
Volume mount 없이 컨테이너 내에 환경변수로 만들어 사용 할 수도 있습니다.
Springboot 어플리케이션은 아래와 같이 환경 변수의 값을 application.yml 에서 활용 할 수 있습니다.
# application.yml
k8sConfig:
app:
datasourceUsername: ${DATASOURCE_USERNAME}
datasourcePassword: ${DATASOURCE_PASSWORD}
테스트를 위해 아래와 같이 컨트롤러 코드를 추가해줬습니다.
@RestController
@RequestMapping("/api")
class HelloController (
@Value("\${k8sConfig.app.datasourceUsername}") val datasourceUsername: String,
) {
@GetMapping("/test")
fun test(): ResponseEntity<*> {
return ResponseEntity.ok(datasourceUsername)
}
}
ConfigMap은 아래와 같이 작성합니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: api-server-config
data:
DATASOURCE_USERNAME: "root"
DATASOURCE_PASSWORD: "1234"
그리고 Deployment에서 아래와 같이 envFrom을 기입해줍니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
spec:
template:
metadata:
name: api-server
spec:
containers:
- name: api-server
image: api-exam:0.0.1
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: api-server-config
아래와 같이 정상적으로 환경변수가 스프링 애플리케이션 프로퍼티에 의해 적용 되었음을 확인 할 수 있습니다.
bash-4.2# curl localhost:8080/api/test
root
'개발 이야기 > Kubernetes' 카테고리의 다른 글
unknown service telepresence.pro.manager.ProManager 대처 (3) | 2024.11.03 |
---|---|
우분투에 k3s 설치하는 방법 (0) | 2024.10.03 |
Telepresence 사용해보기 (0) | 2024.04.03 |
Kubernetes CronJob 실행 해보기 (0) | 2024.03.30 |
Kubernetes HPA 설정하기 (0) | 2024.03.30 |