2020. 4. 4. 22:15ㆍ[정리] 기능별 개념 정리/Kubernetes
컨피그맵
컨테이너에 필요한 환경설정을 분리해서 저장할 수 있다.
클라우드 네이티브 아키텍쳐에서 컨테이너는 템플릿에 맞춰 변하지 않는 자원이여야한다.
그런데 개발용과 프로덕션용 서비스를 다르게 설정해야하는 경우가 생긴다. (ex. DB 설정, 로그 출력 레벨...)
이럴때 컨피그맵을 사용한다.
컨피그맵 샘플
configmap-dev.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: config-dev
namespace: default
data:
DB_URL: localhost
DB_USER: myuser
DB_PASS: mypass
DEBUG_INFO: debug
configmap-prod.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: config-prod
namespace: default
data:
DB_URL: prodhost
DB_USER: produser
DB_PASS: produser
DEBUG_INFO: production
시크릿
시크릿은 컨피그맵으로 저장하기에는 민감한 정보를 저장하는 용도다. (ex. 비밀번호, OAuth 토큰, SSH 키)
시크릿은 내장 시크릿과 사용자 정의 시크릿이 있다.
내장 시크릿은 쿠버네티스 클러스터 안에서 쿠버네티스 API 에 접근할 때 사용한다.
시크릿은 명령어로도 만들 수 있는데 이때 필드 값으로 들어가는 값은 base64인코딩 되서 들어간다.
kubectl create secret generic mySecret --from-literal=username=kok202 --from-literal=password=123456
시크릿의 타입은 다음과 같은 것들이 있다.
- Opaque : key - value 데이터
- kubernetes.io/service-account-token : 쿠버네티스 인증 토큰을 저장한다.
- kubernetes.io/dockerconfigjson : 도커 저장소 인증 정보를 저장한다.
- kubernetes.io/tls : tls 인증서를 저장한다.
시크릿의 최대 용량은 1MB이다.
시크릿은 etcd 에 암호화되지 않은 텍스트로 저장된다.
만약 중요한 서비스에서 쿠버네티스를 사용중이라면 etcd 를 관리해야한다.
- etcd 은 기본적으로 인증서 있는 사용자만 접근할 수 있다. (kube-apiserver 는 tls 인증이 되어있다.)
- etcd 가 실행중인 마스터에 들어가서 데이터를 접근할 수도 있는데, 따라서 접근 가능한 사용자, IP 를 화이트 리스트로 관리해야한다.
- 혹은 쿠버네티스 클러스터를 직접 설치하는 경우 별도로 암호화하는 옵션을 사용해야한다.
시크릿 샘플
apiVersion: v1
kind: Secret
metadata:
name: mySecret
type: Opaque
data:
username: a29rMjAy
password: MTIzNDU2
.type : 시크릿의 타입
컨피그맵과 시크릿의 사용
apiVersion: apps/v1
kind: Deployment
metadata:
name: configapp
labels:
app: configapp
spec:
replicas: 1
selector:
matchLabels:
app: configapp
template:
metadata:
labels:
app: configapp
spec:
containers:
- name: testapp
image: arisu1000/simple-container-app:latest
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: config-dev
# name: config-prod
.spec.env[].name : 환경 변수의 이름
.spec.env[].value : 환경 변수의 값
.spec.env[].valueFrom : 환경 변수의 값을 ~에서 불러온다.
.spec.env[].valueFrom.configMapKeyRef : 환경 변수의 값을 컨피그맵에서 불러온다.
.spec.env[].valueFrom.configMapKeyRef.name : 환경 변수의 값을 ~ 이름의 컨피그맵에서 불러온다.
.spec.env[].valueFrom.configMapKeyRef.key : 환경 변수의 값을 ~ 이름의 컨피그맵에서 ~ 키를 가진 값을 불러온다.
.spec.envFrom : ~ 에서 환경변수 전체를 불러온다.
.spec.envFrom.configMapRef : 컨피그 맵에서 환경변수 전체를 불러온다.
.spec.envFrom.configMapRef.name : ~ 이름을 가진 컨피그 맵에서 환경변수 전체를 불러온다.
* 여기서 configMapRef를 secretKeyRef 로 치환하면 컨피그 맵이 아니라 시크릿에서 값을 불러온다는 의미다.
컨피그맵과 시크릿을 볼륨에 마운트 시키기
apiVersion: apps/v1
kind: Deployment
metadata:
name: configapp
labels:
app: configapp
spec:
replicas: 1
selector:
matchLabels:
app: configapp
template:
metadata:
labels:
app: configapp
spec:
volumes:
- name: config-volume
configMap:
name: config-dev
containers:
- name: testapp
image: arisu1000/simple-container-app:latest
ports:
- containerPort: 8080
volumeMounts:
- name: config-volume
mountPath: /etc/config
.spec.volumes[] : 볼륨을 만든다.
.spec.volumes[].configMap : 컨피그맵을 사용하는 볼륨을 만든다.
.spec.volumes[].configMap.name : 어떤 이름을 사용하느 컨피그맵을 사용하는 볼륨을 만든다.
.spec.containers[].volumeMounts[] : 만들어진 볼륨들을 마운트 시킨다.
.spec.containers[].volumeMounts[].mountPath : 만들어진 볼륨들을 어느 경로에 마운트 시킨다.
.spec.containers[].volumeMounts[].readOnly : 마운트된 파일을 읽기 전용으로 사용한다.
위의 예시에서는 config-dev 컨피그 맵을 가져와 config-volume 이라는 볼륨을 만들고, 해당 볼륨을 각 파드의 /etc/config 파일로 저장한다는 의미다.
도커 이미지가 프라이빗인 경우 시크릿 사용하기
kubectl create secret docker-registry myDockerSecret --docker-username=kok202 --docker-password=123456 --docker-email=kok202@naver.com --docker-server=https://index.docker.io/v1/
이후 .spec.imagePullSecrets[].name 필드로 myDockerSecret 을 가져다 사용하면된다.
'[정리] 기능별 개념 정리 > Kubernetes' 카테고리의 다른 글
쿠버네티스 입문 - 08 - 볼륨 (0) | 2020.04.08 |
---|---|
쿠버네티스 입문 - 07 - 파드 스케줄링 (0) | 2020.04.05 |
쿠버네티스 입문 - 05 - 레이블, 셀렉터, 어노테이션 (0) | 2020.04.04 |
쿠버네티스 입문 - 04 - 인그레스 (0) | 2020.04.04 |
쿠버네티스 입문 - 03 - 서비스 (0) | 2020.04.04 |