Kubernetes

Kubernetes - configmap, secret

rygus 2025. 10. 5. 19:17
728x90

안녕하세요. 

오늘은 "configmap"과 "secret"에 대해 알아보겠습니다. 

# configmap 이란?

configmap환경 설정값(configuration data) 을 관리하기 위한 리소스입니다. 

예를 들어,

DB와 연결이 필요한 파이썬 앱을 Pod로 띄웠을 때 
ConfigMap이 없다면,
매번 Pod 안에 들어가서 DB 주소나 포트 번호 같은 값을 직접 입력해야 합니다.

 

하지만 configmap을 사용하면 

이런 설정값들을 한 곳에 모아서 관리할 수 있게 됩니다. 

Pod는 그 값을 불러와서 사용하기만 하면 됩니다. 

 

이렇게 configmap으로 저장된 값은 etcd 내부에 평문으로 저장됩니다.

# 환경 구성

Flask를 이용하여 웹페이지에 접속하는 IP를 supabase에 저장하는 환경을 구축해 보겠습니다.

참고로 supabase는 postgre 기반 서버리스 DB입니다. 

간단하게 환경에 대해 설명하면 유저가 node port로 접속하면 flask 파드에 연결이 되고 flask는 ip 정보를 DB에 저장하는 로직입니다. 

 

# Supabase 가입하기

https://supabase.com/

 

Supabase | The Postgres Development Platform.

Build production-grade applications with a Postgres database, Authentication, instant APIs, Realtime, Functions, Storage and Vector embeddings. Start for free.

supabase.com

위 사이트에 접속하여 가입을 진행합니다. 

 

가입을 완료하면 위와 같이 프로젝트가 보일 텐데요. 

오른쪽에 New project를 클릭합니다. 

위와 같이 간단히 설정 후 프로젝트를 생성합니다. 

프로젝트에서 위 경로로 들어가 api key를 복사 후 따로 메모장에 저장해 둡니다. 

위 경로로 들어가 URL을 저장합니다. 

URL과 API Key는 configmap에 넣어줘야 하는 정보입니다. 

 

create table visitor_logs (
  id bigint generated by default as identity primary key,
  ip_address text,
  visited_at timestamp default now()
);

이제 테이블을 하나 생성해주어야 하는데요. 

위 명령어를 이용하여 테이블을 하나 생성하겠습니다. 

 

정상적으로 테이블이 배포가 되었으면 성공

 

# configmap 배포하기

apiVersion: v1
kind: ConfigMap
metadata:
  name: supabase-config
data:
  SUPABASE_URL: "<my-supabase-url>"
  SUPABASE_KEY: "<my-supabase-key>"

먼저 configmap을 배포해야 합니다. 

위 yaml 파일을 이용하여 배포할 것인데요. 

data에 SUPABASE_URL 부분과 SUPABASE_KEY 부분은 아까 저장한 값을 그대로 넣어줍니다. 

`kubectl apply -f configmap.yml` 명령어로 배포합니다. 

 

`kubectl describe configmap supabase-config` 명령어로 정상적으로 설정이 되었는지 확인합니다. 

 

# 파드 배포

이제 파드를 배포하겠습니다. 

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-test-pod
  labels:
    app: kubernetes-test
spec:
  containers:
  - name: kubernetes-test-container
    image: hoshinoruby/kubernetes-test:latest
    ports:
    - containerPort: 8080
    envFrom:
    - configMapRef:
        name: supabase-config

configMapRef 를 통해서 configmap을 지정해 줍니다. 

참고로 이미지는 제가 도커 허브에 배포한 이미지로 간단하게 접속한 IP를 화면에 띄워주는 애플리케이션입니다. 

 

`kubectl apply -f flasktest.yml` 명령어로 배포합니다. 

 

# 서비스 배포

이번에는 연결을 위해 nodeport를 배포하겠습니다. 

apiVersion: v1
kind: Service
metadata:
  name: kubernetes-test-service
spec:
  type: NodePort
  selector:
    app: kubernetes-test
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30080

 

`kubectl apply -f node-port.yml`로 배포합니다. 

 

# 접속 테스트

이제 접속 테스트를 진행해 보겠습니다.

 

정상적으로 접속이 된 것을 확인 가능합니다. 

 

supabase의 테이블에서 확인하면 정상적으로 ip가 찍히는 것을 확인 가능합니다. 

참고로 저 ip는 노드의 ip입니다. 

 

# secret 이란? 

secret도 사실 configmap과 비슷합니다. 

다만 secret는 저장할 때 etcd에 저장될 때 평문으로 저장하는 것이 아닌 base64로 인코딩 되어 저장되게 됩니다. 

그래서 API_KEY, password 등 민감한 정보는 secret로 저장하고 관리하는 것이 일반적입니다. 

 

# secret 배포 

바로 secret 배포 후 같은 테스트를 진행해보겠습니다. 

apiVersion: v1
kind: Secret
metadata:
  name: supabase-secret
stringData:
  SUPABASE_URL: "<my-supabase-url>"
  SUPABASE_KEY: "<my-supabase-key>"

 

사실 secret를 선언할 때도 base64로 인코딩된 값을 넣어주어야 하지만 "stringData"를 사용하면 그냥 평문으로 넣어도 알아서 암호화가 됩니다. 

 

'kubectl apply -f secret.yml' 명령어를 이용하여 배포해줍니다. 

 

배포된 것을 확인하면 configmap과는 다르게 값들은 나오지 않고 크기만 나와있습니다. 

 

# 파드 배포

기존 파드는 configmap을 참조하고 있기 때문에 이것을 secret로 바꿔 주어야합니다. 

apiVersion: v1
kind: Pod
metadata:
  name: kubernets-test-pod
  labels:
    app: kubernetes-test
spec:
  containers:
  - name: kubernetes-test-container
    image: hoshinoruby/kubernetes-test:latest
    ports:
    - containerPort: 8080
    envFrom:
    - secretRef:
        name: supabase-secret

configMapRef 를 secretRef로 바꿔주었습니다.

`kubectl apply -f pod.yml` 명령어로 배포해줍니다. 

 

이제 다시 테스트를 진행해보겠습니다. 

정상적으로 DB에 저장되는 것을 확인 가능합니다. 

 

 

감사합니다.