728x90
Configmap
정의
애플리케이션의 설정 데이터를 관리하기 위해 사용하는 API 리소스이다. 애플리케이션의 설정 정보를 Key-Value 형태로 저장한다.
예시
Key-Value 형태의 Configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: example-config
data:
key1: value1
key2: value2
위의 configmap를 apply 한 이후 Pod에서 아래와 같이 사용할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
image: nginx
env:
- name: EXAMPLE_KEY1
valueFrom:
configMapKeyRef:
name: example-config
key: key1
또는 ConfigMap 데이터를 파일로 마운트하여 애플리케이션이 사용할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
volumes:
- name: config-volume
configMap:
name: example-config
containers:
- name: example-container
image: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/config
또한 마운트할 때 파일명 까지 지정할 수 있다. 아래에는 Promtail 에 관해 Configmap를 활용해 /etc/promtail/promtail-config.yaml
에 지정되는 예시이다.,
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: poc
name: promtail
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: promtail
template:
metadata:
labels:
app.kubernetes.io/name:promtail
spec:
- name: promtail
image: grafana/promtail:latest
args:
- "-config.file=/etc/promtail/promtail-config.yaml"
volumeMounts:
- name: promtail-config-cicd-api-dev
mountPath: /etc/promtail
volumes:
- name: promtail-config-cicd-api-dev
configMap:
name: promtail-config-cicd-api-dev
ConfigMap 파일명 그리고 내용은 |
을 통해 이어 적으면 된다.
apiVersion: v1
kind: ConfigMap
metadata:
name: promtail-config-cicd-api-dev
namespace: poc
data:
promtail-config.yaml: |
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://poc-loki-service:3101/loki/api/v1/push
tenant_id: "service-cicd-api-dev"
scrape_configs:
- job_name: "fastapi-logs"
static_configs:
- targets:
- localhost
labels:
job: "fastapi-logs"
__path__: /app/logs/*.log
Secret
정의
민감한 데이터를 안전하게 관리하기 위해 사용하는 API 리소스이다. ConfigMap과 유사하게 Key-Value 이지만 비밀번호, API 키, TLS 인증서와 같은 민감한 정보를 저장하는데 특화되있다.
주요 특징
- Base64 인코딩 데이터:
- Secret 데이터는 Base64로 인코딩된 형태로 저장된다.
- 이는 데이터를 암호화하지는 않지만, 인코딩되어 있어 사람이 직접 읽을 수는 없다.
- 민감한 데이터 관리:
- 민감한 정보를 애플리케이션 코드나 배포 YAML 파일에 직접 포함하지 않아 보안을 강화할 수 있다.
- 다양한 사용 방법:
- 환경 변수로 주입
- 볼륨으로 마운트
- Kubernetes에서 제공하는 인증, TLS 설정 등에 사용
- 보안 관리:
- Secret 데이터는
etcd
에 저장되며, Kubernetes API 서버를 통해 암호화 옵션을 설정하여 보호할 수 있다.
- Secret 데이터는
- 네임스페이스 단위 관리:
- Secret은 생성된 네임스페이스 내에서만 사용할 수 있습니다.
예시
생성 및 적용
명령어를 통해 생성하게 되면 자동으로 base64 encoding 이 된 채로 들어가게 된다. 물론 base64 인코딩 후 데이터를 Secret
manifest를 통해 기재해도 된다.
- 단순 manifest로 평문 기재하면 평문으로 적용되기 때문에 의미가 없다.
- 물론 argocd 등으로 배포하면 이 문제도 자연스럽게 인코딩 되어 배포되긴 한다.
kubectl create secret generic example-secret \
--from-literal=username=admin \
--from-literal=password=password
생성된 파일은 아래와 같다. type
은 Opaque 말고도 다양한 타입이 있고, 필요에 따라 알맞게 사용하면 된다.
apiVersion: v1
kind: Secret
metadata:
name: example-secret
namespace: poc
type: Opaque
data:
username: YWRtaW4= # "admin"의 Base64 인코딩 값
password: cGFzc3dvcmQ= # "password"의 Base64 인코딩 값
그리고 Pod에서 사용하면 된다.
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: app-container
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: example-secret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: example-secret
key: password
Configmap
과 동일하게 볼륨 마운트를 하는 것도 가능하다.
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-pod
spec:
containers:
- name: app-container
image: nginx
volumeMounts:
- name: secret-volume
mountPath: /etc/secret
volumes:
- name: secret-volume
secret:
secretName: example-secret
Secret과 ConfigMap의 차이점
기능 | Secret | ConfigMap |
---|---|---|
목적 | 민감한 데이터 저장 | 일반적인 설정 데이터 저장 |
데이터 저장 방식 | Base64로 인코딩된 형식 | 평문으로 저장 |
보안 강화 옵션 | API 서버 암호화 및 접근 제어 가능 | 일반 보안 설정 가능 |
유형 | TLS, Docker 인증 정보 등 다양한 유형 제공 | Key-Value 데이터만 지원 |
728x90
'Engineering > K8S' 카테고리의 다른 글
NetworkPolicy (0) | 2024.12.23 |
---|---|
ResourceQuota 와 LimitRange (0) | 2024.12.23 |
RBAC (0) | 2024.12.23 |
Init Container 와 멀티 컨테이너 패턴 (1) | 2024.12.20 |
application Probe (0) | 2024.12.20 |