Open engal1991 opened 2 years ago
349 ~
컨피그맵은 네임스페이스에 종속되는 오브젝트입니다. ( = 네임스페이스별로 존재 ) 컨피그맵은 말그래도 설정값들을 가지고 있는 맵이라고 생각하시면 됩니다. ( key : value )
여러가지 사용할 떄의 장점이 있겠지만, 가장 큰 이유는 애플리케이션과 설정값을 분리해서 관리 할 수 있습니다. ( + 환경별로 분리 가능 )
컨피그맵은 2가지의 사용방법이 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: container-env-example
spec:
containers:
- name: my-container
image: busybox
args: ['tail', '-f', '/dev/null']
envFrom:
- configMapRef:
name: log-level-configmap -- [ 1 ]
- configMapRef:
name: start-k8s -- [ 2 ]
[1], [2]번과 같은 방식으로 yaml파일에 각각 log-level-configmap 파일, start-k8s파일 의 컨피그맵에서 모든
key-value형식으로 환경변수로 세팅해서 사용할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: container-selective-env-example
spec:
containers:
- name: my-container
image: busybox
args: ['tail', '-f', '/dev/null']
env:
- name: ENV_KEYNAME_1 # (1.1) 컨테이너에 새롭게 등록될 환경 변수 이름
valueFrom:
configMapKeyRef:
name: log-level-configmap
key: LOG_LEVEL
- name: ENV_KEYNAME_2 # (1.2) 컨테이너에 새롭게 등록될 환경 변수 이름
valueFrom:
configMapKeyRef:
name: start-k8s # (2) 참조할 컨피그맵의 이름
key: k8s # (3) 가져올 데이터 값의 키
# 최종 결과 -> ENV_KEYNAME_2=$(k8s 키에 해당하는 값)
# ENV_KEYNAME_2=kubernetes
위와 같이 특정 컨피그맵 파일에서 가져올 key값을 지정해서 환경변수로 사용할 수 있습니다.
이때 모든 key-value를 가져오는 yaml에는 envForm
이, 특정 key만 가져오는 설정은 valueFrom
이 사용됩니다.
또한 모든 key-Value를 가져오는 설정은 key:value 가 파일값 그대로가 들어가지만, 특정 key만을 가져오는 설정은 env.name에 정의된 이름으로 value가 들어갑니다.
LOG_LEVEL=DEBUG
k8s=kubernetes
ENV_KEYNAME_1 = DEBUG
ENV_KEYNAME_2 = kubernetes
apiVersion: v1
kind: Pod
metadata:
name: configmap-volume-pod
spec:
containers:
- name: my-container
image: busybox
args: [ "tail", "-f", "/dev/null" ]
volumeMounts:
- name: configmap-volume # volumes에서 정의한 컨피그맵 볼륨 이름
mountPath: /etc/config # 컨피그맵의 데이터가 위치할 경로
volumes:
- name: configmap-volume # 컨피그맵 볼륨 이름
configMap:
name: start-k8s
위 정의는 configmap-volume이라는 volume안에 start-k8s를 파일화 ( 파일이름 : key, 내용 : value ) 하여 파드 내에 마운트 한다는 의미입니다.
컨피그맵이 아래와 같을 떄 포드 내부에서는 이처럼 변화됩니다.
컨피그맵 이름 : start-k8s 키-값 : k8s-kubernetes, container-docker
마운트 후에는
/etc/config/k8s -> 내용 : kubernetes /etc/config/container -> 내용 : docker
이처럼 마운트 됩니다.
환경변수로 컨피그맵을 사용하는 방식과 마찬가지로 파일 전체가 아닌 선택적으로 사용할 key-value만 가져올수있습니다.
apiVersion: v1
kind: Pod
metadata:
name: selective-cm-volume-pod
spec:
containers:
- name: my-container
image: busybox
args: [ "tail", "-f", "/dev/null" ]
volumeMounts:
- name: configmap-volume
mountPath: /etc/config # 마운트되는 위치는 변경되지 않았습니다.
volumes:
- name: configmap-volume
configMap:
name: start-k8s
items: # 컨피그맵에서 가져올 키-값의 목록을 나열합니다.
- key: k8s # k8s라는 키에 대응하는 값을 가져옵니다.
path: k8s_fullname # 최종 파일 이름은 k8s_fullname이 됩니다
이게 진짜라고 볼수있습니다. 보통 웹서버 설정이나 기타 어플리케이선들은 config파일이 분리되어있기에, 이를 관리하는 데 유용한 기능일 겁니다.
$ kubectl create configmap <컨피그맵 이름> --from-file <파일이름>
$ kubectl create configmap my-configmap \ --from-literal mykey=myvalue --dry=run -0 yaml > my-configmap.yaml
이렇게 하면 yaml파일로 생성이 되는데,, key-value 가 너무 많다..? 그러면 kustomize 방법 사용 ㄱ
시크릿 사용 방법 익히기
시크릿은 말그대로, 외부에 노출이 되면 안되는 패스워드나 hmac key 등이 포함된다. 사용방법은 위에 적인 configure 맵과 너무 동일... = 생략..
시크릿을 주로 사용하게 될 곳은 이미지 레지스트리에 접근할 때입니다.
reg 인증을 위한 시크릿 방법은 2가지가 있습니다.
$ kubectl create secret docker-registery registry-auth-by-test \ --docekr-username=test \ --docker-password=1234
이렇게 만들어진 시크릿은 아래와 같이 deployment에서 활용됩니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-from-prvate-repo
spec:
selector:
matchLabels:
app: myapp
template:
metadata:
name: mypod
labels:
app: myapp
spec:
containers:
- name: test-container
image: alicek106.ipdisk.co.kr/busybox:latest
args: ['tail', '-f', '/dev/null']
imagePullSecrets:
- name: registry-auth-registry
crt, key 파일이 필요
kubectl create secret tls my-tls-secret \ --cert cert.crt --key cert.key
컨피그맵이나 시크릿은 kustomize 기능과 함께 사용됩니다. kustomize는 명령어 버전 1.14부터 사용할 수 있습니다.
tls 시크릿 생성 예시
secretGenerator: # 시크릿을 생성하기 위한 지시문
- name: kustomize-secret
type: kubernetes.io/tls # tls 타입의 시크릿을 생성
files:
- tls.crt=cert.crt # tls.crt 라는 키에 cert.crt 파일의 내용을 저장
- tls.key=cert.key # tls.key 라는 키에 cert.key 파일의 내용을 저장
컨피그 맵도 다르지 않습니다.
configMapGenerator:
- name: kustomize-configmap
files:
- tls.crt=cert.crt
- tls.key=cert.key
제일 궁금한 이것
앞에서 컨피그맵이나 시크릿을 포드에 반영하는 방법 2가지가 있었습니다.
1번은 아예 박혀있는 것이라 디플로이먼트의 포드를 다시 생성해서 반영해야합니다. ( = 서버 재시작 ) 2번은 자동적으로 반영될 수 있게끔 처리할 수 있습니다. 다만, 개발자의 영역이라는 점.. 직접 구현...
7.2.1 컨피그맵(Configmap)
7.2.2 시크릿(Secret)