이번 글에서는 kubernetes의 object 중 ConfigMap과 Secret에 대해서 살펴보고자 합니다. 해당 글은 Inflearn의 '대세는 쿠버네티스 [초급~중급]' 강의를 학습하면서 작성한 글임을 미리 알려드립니다.
바로 예시를 들어 설명하겠습니다. 서비스를 운영할 때는 테스트를 진행하기 위한 개발 서버와 실제 운영을 위한 운영 서버가 존재합니다. 개발과 운영 서버에서는 보안 설정, 유저, 키 등 일부 설정들에 차이가 있습니다. 이러한 차이로 인해 개발과 운영 서버의 이미지를 각각 생성하게 된다면, 상당히 비효율적일 수 있습니다. 따라서 하나의 image로도 개발과 운영 환경에 배포할 수 있도록, 환경 변수들을 관리해 주는 object가 바로 ConfigMap과 Secret입니다. 일반적인 변수들은 ConfigMap으로 관리를 하고, 보안이 필요한 변수들은 Secret을 통해 관리합니다.
ConfigMap과 Secret은 일반적인 값들로도 넣을 수 있고, 파일의 형태로 넣는 것도 가능합니다. 우선 값의 형태로 넣는 방법부터 설명하겠습니다. ConfigMap과 Secret은 모두 key와 value 형태로 값을 넣게 됩니다. Secret의 경우에는 보안이 필요한 변수이기 때문에 Base64 Encoding을 진행한 값을 넣게 되고, pod에 연결돼서 값이 부여될 때는 decoding되어 원래의 값이 입력됩니다. 두 object 간의 또 다른 차이점은 ConfigMap과 같은 일반적인 object는 DB에 저장되지만, Secret은 memory에 저장된다는 것입니다. 이로 인해 1 Mbyte라는 용량 제한이 존재하고, 시스템 자원에도 영향을 미치게 됩니다.
아래는 ConfigMap과 Secret에 해당하는 yaml 파일에 대한 내용입니다. kind로 해당하는 object로 생성하고, data에 key와 value 형태로 값을 입력해주면 됩니다. Secret에 들어간 값은 base64로 변형된 key 값입니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-dev
data:
SSH: False
User: dev
vapiVersion: v1
kind: Secret
metadata:
name: sec-dev
data:
Key: MTlzNA==
이제 pod에서는 envFrom 속성에 생성한 ConfigMap과 Secret 이름을 입력해주면 됩니다.
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: container
image: kube/init
envFrom:
- configMapRef:
name: cm-dev
- secretRef:
name: sec-dev
다음은 파일 형태로 환경 변수를 넣는 방법입니다. 위의 방법과 큰 차이는 없고, 이 경우에는 파일명이 key가 되고, 파일 안의 내용이 value가 됩니다.
아래의 코드는 파일 형태로 환경 변수를 넣을 때의 pod 생성 yaml 파일입니다. envFrom 속성이 아닌 env 속성에 입력하며, env 내의 configMapKeyRef의 key 값으로 파일 이름을 입력하면 됩니다.
apiVersion: v1
kind: Pod
metadata:
name: pod-2
spec:
containers:
- name: container
image: kube/init
env:
- name: file
valueFrom:
configMapKeyRef:
name: cm-file
key: file.txt
마지막 방법은 파일을 volume에 mount하는 방법입니다. ConfigMap과 Secret object를 파일로 생성하는 것은 위의 방법과 유사하지만, mount 경로를 입력해줘야 합니다. Mount하는 방법은 파일의 내용을 변경했을 때 pod에 바로 반영된다는 장점이 있습니다. 반면 위의 방법은 파일의 내용을 변경하더라도 pod에 바로 반영되지는 않고, 재생성됐을 때 반영된다는 차이점이 존재합니다.
파일을 volume에 mount 하는 방법에 해당하는 yaml 파일은 아래와 같습니다. 이전 글인 Volume 기초에서 살펴봤던 yaml 파일 형태와 유사하며, 아래 volumes 속성만 ConfigMap과 Secret에 맞게 작성하면 됩니다.
apiVersion: v1
kind: Pod
metadata:
name: pod-3
spec:
containers:
- name: container
image: kube/init
volumeMounts:
- name: file-volume
mountPath: /mount
volumes:
- name: file-volume
configMap:
name: cm-file
* 강의 내용을 복습하면서 정리한 것이므로, 내용적으로 유사한 부분이 많다는 점 양해부탁드립니다.
<참고>
대세는 쿠버네티스 [초급~중급] - 인프런 | 강의
쿠버네티스는 앞으로 어플리케이션 배포/운영에 주류가 될 기술 입니다. 이 강좌를 통해 여러분도 대세에 쉽게 편승할 수 있게 됩니다., 현존 최고의 앱 운영 및 배포 기술, 쿠버네티스를 만나
www.inflearn.com
'MLOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Volume 기초 - emptyDir, hostPath, PVC/PV (2) | 2023.12.10 |
---|---|
[Kubernetes] PostgreSQL 설치 및 실행 (4) | 2023.11.29 |
[Kubernetes] Service 기초 (1) | 2023.11.25 |
[Kubernetes] Helm 설치 (1) | 2023.11.15 |
[Kubernetes] Pod 기초 (0) | 2023.11.13 |
댓글