engal1991 / Docker-Kubernetes

0 stars 0 forks source link

[07장: 쿠버네티스 리소스의 관리와 설정] 7.2 컨피그맵(Configmap), 시크릿(Secret) : 설정값을 포드에 전달 #26

Open engal1991 opened 2 years ago

engal1991 commented 2 years ago

7.2.1 컨피그맵(Configmap)

7.2.2 시크릿(Secret)

yuodsa1 commented 2 years ago

349 ~

7.2.1 컨피그맵(Configmap)

컨피그맵은 네임스페이스에 종속되는 오브젝트입니다. ( = 네임스페이스별로 존재 ) 컨피그맵은 말그래도 설정값들을 가지고 있는 맵이라고 생각하시면 됩니다. ( key : value )

여러가지 사용할 떄의 장점이 있겠지만, 가장 큰 이유는 애플리케이션과 설정값을 분리해서 관리 할 수 있습니다. ( + 환경별로 분리 가능 )

컨피그맵 사용 방법 익히기

컨피그맵은 2가지의 사용방법이 있습니다.

  1. 컨테이너의 환경 변수로 사용
    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가 들어갑니다.

모든 key-Value를 가져오는 설정

LOG_LEVEL=DEBUG
k8s=kubernetes

특정 key만을 가져오는 설정

ENV_KEYNAME_1 = DEBUG
ENV_KEYNAME_2 = kubernetes
  1. 포드 내부의 파일로 마운트해 사용
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 <파일이름>

yaml파일로 컨피그맵 정의하기

$ kubectl create configmap my-configmap \ --from-literal mykey=myvalue --dry=run -0 yaml > my-configmap.yaml

이렇게 하면 yaml파일로 생성이 되는데,, key-value 가 너무 많다..? 그러면 kustomize 방법 사용 ㄱ

yuodsa1 commented 2 years ago

시크릿 사용 방법 익히기

시크릿은 말그대로, 외부에 노출이 되면 안되는 패스워드나 hmac key 등이 포함된다. 사용방법은 위에 적인 configure 맵과 너무 동일... = 생략..

이미지 레지스트리 접근을 위한 docker-registry 타입의 시크릿 사용하기

시크릿을 주로 사용하게 될 곳은 이미지 레지스트리에 접근할 때입니다.

reg 인증을 위한 시크릿 방법은 2가지가 있습니다.

  1. docker login > 성공 시 생기는 ~/.codker/config.json 파일을 그대로 시크릿으로 가져오는 방법
  2. 직접 id / pw 를 쳐 시크릿을 만드는 방법
    $ 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

TLS 키를 저장할 수 있는 tls 타입의 시크릿 사용하기

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. 포드 내부의 파일로 마운트해 사용

1번은 아예 박혀있는 것이라 디플로이먼트의 포드를 다시 생성해서 반영해야합니다. ( = 서버 재시작 ) 2번은 자동적으로 반영될 수 있게끔 처리할 수 있습니다. 다만, 개발자의 영역이라는 점.. 직접 구현...