[Kubernetes] ConfigMap, Secret

식빵·2025년 2월 9일
0

kubernetes

목록 보기
6/6

이 게시물은 인프런 - 쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2
강의에 대한 복습 및 정리용 게시물입니다. 그렇기 때문에 자세한 내용은 생략됐습니다.
그리고 여기에서 나오는 모든 이미지들은 해당 강의가 출처임을 미리 말씀드립니다.

App 의 설정을 위한 Object

App 을 하나 동작시키기 위해서는 필요한 설정값들이 있습니다.
이런 설정값들을 쿠버네티스에서는 크게 2가지 형태로 제공할 수 있습니다.

  1. ConfigMap
  2. Secret

그렇다면 아래 그림을 통해서 ConfigMap 과 Secret 의 사용 방식을 알아보겠습니다.

  • envFrom 을 통해서 Configmap 의 설정 내용들이 환경변수로 container 에 노출됩니다.
  • Secret 은 Volumes 를 통해서 설정값이 하나의 파일로서 들어갑니다.

이번엔 좀 더 실제로 사용할 법한 예시를 살펴볼까요?

좌측 상단 ConfigMap 의 내용을 보면 data 하단에 여러 key-value 쌍이 있습니다.
이것들이 모두 container 의 환경변수로 노출될 것들입니다.

이러면 container 실행 시에도 가져다 쓸 수 있으니 유용하겠죠?

참고로 알아두면 좋은 점이 있습니다.
ConfigMap 의 환경변수들은 Pod 가 맨 처음 한번 생성될 때에만 적용됩니다.
Pod 가 정상 기동되고 나서 ConfigMap 을 백날 수정해도 Pod 에는 영향을 주지 못합니다.


이번에는 우측 상단에 있는 Secret 을 보죠.
volume 을 통해서 하나의 파일 형태로 저장됩니다.

여기서 알아 둘 것은 파일 내용이 stringData 에 있는 문자열들이
key-value 로 저장되어 있는데, value 값들은 Base64 로 한번 인코딩 된 후에
data 라는 속성으로 들어가게 됩니다.

volume 에 실제 파일 내용도 마찬가지로 Base64 인코딩된 문자열이 보이게 됩니다.

base64 는 디코딩이 아주 쉬습니다.
딱히 보안적으로 이점은 없다는 점 명심하시기 바랍니다.
아래는 secret 정보를 쉽게 디코딩하는 장면을 보여줍니다.

이런 base64 문자열이 파일에 volume 에 저장되지만,
실제 container 안에서는 해당 파일의 문자열이 다시 디코딩되어서
내용이 정상적인 문자열로 보이게 됩니다.


Secret 의 사용 예시

위애서도 잠깐 말했지만 Secret 은 딱히 보안적이지 않습니다.
너무나도 디코딩이 쉽기 때문이죠.

뭔가 Secret 은 분명 비밀번호 같이 보안적인 요소를 숨기기 위한 것이
용도라고 소개하지만, 전혀 공감이 되지 않습니다.

이럴 때는 그냥 억지로 이해하려 하지말고,
차라리 실제 사용 예로 Secret 의 사용 방식을 알아보는 게 더 낫습니다.

Secret 에는 configMap 과 달리 type 이라는 속성이 있습니다.
type=opaque 를 쓰면 딱히 ConfigMap 과 다른 점이 없습니다.

하지만 만약에 type=docker-registery 처럼 쿠버네티스에서 정한
약속된 다른 type 을 사용하면 완전히 다른 용도로 사용됩니다.

type=docker-registery
data 에 docker-username, docker-password 와 같은 이미 약속된
key 값을 사용해서 Secret 을 사용하고 이를 Pod 설정에
ImagePullSecret 으로 연결하면, 이미지를 pull 할 때 Docker 리포지토리가
기존에 기본으로 설정되어 있는 docker hub 가 가 아닌 개인 사설 저장소로
바꿀 수 있습니다.

이렇듯 Secret 은 쿠버네티스에서 이미 지정된 설정들에 대한
커스터마이징을 쉽게 할 수 있는 템플릿을 제공하는 것입니다
.

이럴거면 그냥 Secret 이라는 이름을 쓰지 말았으면...



진짜 보안이 필요한 설정은 어떻게 설정하는가?

Secret 은 중요한 설정에 대한 보안 용도로 쓰지 않는게 좋겠죠?
그렇다면 대체안이 필요할 겁니다.

  1. Secret 을 CI/CD 배포 파이프라인에서 만들지 말고,
    Cluster 내부에서 수동으로 생성해서 넣기

  2. 미리 암호화를 시켜놓고, 실행한 App 에서 복화하시키기

  3. 서드파티 사용 (ex: Vault)



보충: Configmap 을 Volume 에 연결해서 쓰기

참고: https://cafe.naver.com/kubeops/44

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: anotherclass-123
  name: api-tester-1231-postgresql
  labels:
    part-of: k8s-anotherclass
    component: backend-server
    name: api-tester
    instance: api-tester-1231
    version: 1.0.0
    managed-by: dashboard
data:
  postgresql-info.yaml: |
    driver-class-name: "org.postgresql.Driver"
    url: "jdbc:postgresql://postgresql:5431"
    username: "dev"
    password: "dev123"
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: anotherclass-123
  name: api-tester-1231
spec:
  template:
    spec:
      nodeSelector:
        kubernetes.io/hostname: k8s-master
      containers:
        - name: api-tester-1231
          image: 1pro/api-tester:v1.0.0
          volumeMounts:
            - name: configmap-datasource
              mountPath: /usr/src/myapp/datasource/dev
      volumes:
        - name: configmap-datasource
          configMap:
            name: api-tester-1231-postgresql



참고

profile
백엔드 개발자로 일하고 있는 식빵(🍞)입니다.

0개의 댓글