ConfigMap
ConfigMap은 네임스페이스에 종속되며 쿠버네티스 클러스터에서 동작할 애플리케이션들의
설정 정보들을 관리해주는 오브젝트이다. 애플리케이션들은 각자 환경변수, 태그들을 가질 수 있는데
ConfigMap을 이용하면 애플리케이션단이 아닌 쿠버네티스 단에서 이러한 값들을 관리할 수 있다.
Configmap은 무엇을 해주나
예를 들어보자.
Spring Boot 애플리케이션을 개발하다보면 application.yaml에 property를 정의하게 된다.
이때의 property는 하드 코딩 방식으로 작성할수도 있지만 보통은 유연성을 위해 외부 주입형식으로 바꾸게 된다.
spring:
data:
mongodb:
uri: mongodb://${DB_HOST}
해당 property가 포함된 jar파일을 Build한 이후, 도커 이미지로 다시 Build 하는 방식으로
스프링 컨테이너를 만들 수 있다.
ConfigMap은 스프링 컨테이너를 띄울 때 DB_HOST 환경변수를 주입해줄 수 있다.
즉, 설정값을 애플리케이션 코드나 컨테이너 단이 아닌 Pod 단에서 제어할 수 있게 해준다.
또한 Environment별로 다른 환경에서, 동일한 역할을 하는 Pod를 띄울 때도 ConfigMap은 유용하게 사용된다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-spring-container
image: spring
env:
- name: tag
value: dev
---
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-spring-container
image: spring
env:
- name: tag
value: prod
위의 Pod는 dev환경, 아래는 prod환경에 필요한 Pod이다.
둘 간의 차이는 env의 tag가 다르다는것인데, 불필요한 리소스 코드의 중복이 일어나게 되며,
애플리케이션 리소스와 설정값이 분리되어 있지 않게 된다.
ConfigMap은 다음과 같이 해결해준다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-spring-container
image: spring
env:
valueFrom:
configMapKeyRef:
name: environment # 미리 생성해놓은 ConfigMap
key: tag
즉, 2개의 Pod를 정의하는 YAML이 아닌 1개의 Pod를 정의하는 YAML과 2개의 ConfigMap으로 바꿀 수 있다.
ConfigMap을 정의하는 YAML
apiVersion: v1
kind: ConfigMap
metadata:
name: dev-config
data:
tag: dev
db_uri: localhost:27017
---
apiVersion: v1
kind: ConfigMap
metadata:
name: prod-config
data:
tag: prod
db_uri: 192.168.0.1:27017
Key-Value 형식으로 Config 정보가 저장되며 직관적인 YAML 파일의 구조를 가진다.
ConfigMap을 사용하는 YAML
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-spring-container
image: spring
env:
valueFrom:
configMapKeyRef:
name: dev-config
key: tag
configMapKeyRef:
name: dev-config
key: db_uri
---
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-spring-container
image: spring
envFrom:
- configMapRef:
name: prod-config
위의 Pod는 dev-config에서 개별 Key값들을 가져왔고, 아래의 Pod는 전체 Config를 가져왔다.
ConfigMap Mount
ConfigMap을 환경변수 형태가 아닌, 볼륨에 파일로도 저장할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-spring-container
image: nginx
volumeMounts:
- name: configmap-volume
mountPath: /etc/config
volumes:
- name: configmap-volume
configMap:
name: dev-config
개별 키 마다 컨테이너내 경로 /etc/config에 파일로 저장된것을 볼 수 있다.
ConfigMap 업데이트
ConfigMap에서 관리하는 설정 값을 업데이트 해야하는 상황이 생길 수 있다.
우선, 환경변수로 주입한 ConfigMap은 업데이트 되어도 Pod 안에서는 바뀌지 않는다.
Pod를 재기동해야지만 업데이트한 내역이 반영되므로 주의해야 한다.
하지만, 볼륨을 통해서 ConfigMap을 Mount한 경우는 ConfigMap이 바뀌면 자동으로 값이 바뀌게 된다.
이때 조심해야 할점은 Pod안에서는 바뀌지만, 애플리케이션에서는 자동으로 바뀌지 않는다는 점이다.
따라서 애플리케이션 로직에 config 파일의 변화를 감지해 리로드 하는 기능을 넣어야 한다.
Sercret
Secret은 ConfigMap과 사용방법, 생김새가 매우 유사하며 마찬가지로 네임스페이스에 종속되는 오브젝트이다.
Secret은 무엇을 해주나
Secret은 ConfigMap에 담기에 부적절한 비밀번호, 인증키 등을 안전하게 저장할 수 있게 해준다.
ConfigMap은 권한만 있다면 raw 데이터 그대로 볼 수 있다.
하지만 Secret은 base64 인코딩을 통해 난독화를 시켜준다. 암호화는 아니다
Secret의 종류
Secret의 종류는 다양하지만, 자주 사용하는 3가지가 있다.
- Generic: 타입을 Opaque로 명시함으로써 사용할 수 있다. 일반적인 민감 데이터
- docker-registry : 이미지 레지스트리에 접근하기 위한 정보
- tls: TLS연결에 사용되는 키를 저장
이 외에도 다른 종류를 확인하고 싶다면 아래 document를 참고하자
https://kubernetes.io/ko/docs/concepts/configuration/secret/#secret-types
시크릿(Secret)
시크릿은 암호, 토큰 또는 키와 같은 소량의 중요한 데이터를 포함하는 오브젝트이다. 이를 사용하지 않으면 중요한 정보가 파드 명세나 컨테이너 이미지에 포함될 수 있다. 시크릿을 사용한다
kubernetes.io
Secret을 정의하는 YAML
apiVersion: v1
kind: Secret
metadata:
name: my-service-secret
type: Opaque
data:
db_password: cm9vdA==
password에 적힌 값은 실제 비밀번호를 base64로 인코딩한 결과값이다.
Secret을 사용하는 YAML
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-spring-container
image: spring
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: my-service-secret
key: db_password
사용방법은 ConfigMap과 매우 유사하다.
env.name은 실제 컨테이너에 입력되는 환경변수의 이름이다.
'Infra > Kubernetes' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 오브젝트 [ServiceAccount] (0) | 2023.07.28 |
---|---|
[Kubernetes] 쿠버네티스 오브젝트 [Namespace] (0) | 2023.07.05 |
[Kubernetes] 쿠버네티스 오브젝트 [Service] (0) | 2023.07.05 |
[Kubernetes] 쿠버네티스 오브젝트 [Deployment] (0) | 2023.07.04 |
[Kubernetes] 쿠버네티스 오브젝트 [ReplicaSet] (0) | 2023.07.03 |