[K8S] ConfigMap 생성 및 컨테이너 환경 변수와 매핑 / Secret 생성 및 환경 변수 매핑, 볼륨 마운트

HYEOB KIM·2022년 7월 17일
1

kubernetes

목록 보기
13/14

ConfigMap

  • 컨테이너 안에 .conf 파일이 있으면 config를 수정할 때 매번 컨테이너에 접속해서 .conf 파일을 수정하기란 너무 번거롭습니다. Pod가 수 십개, 수 백개로 늘어난다면 매번 이렇게 수정하기란 쉽지 않습니다.
  • 애플리케이션에 대한 config 정보를 한 곳에서 보며 관리할 수 있도록 하기 위해 configmap이라고 하는 공간에 key:value 형식으로 모아놓습니다.
  • 각 컨테이너의 설정 파일 속성과 매핑해서 configmap에 기록합니다.

configmap 생성 방법

% kubectl create configmap <configmap 이름> [--from-file=source] [--from-literal=key1=value1]

CKA 문제 유형

  • 작업 클러스터: k8s

다음의 변수를 configMap eshop으로 등록하세요.

  • DBNAME: mysql
  • USER: admin

등록한 eshop configMap의 DBNAMEeshop-configmap이라는 이름의 nginx 컨테이너에 DB라는 환경변수로 할당하세요.

1. eshop이라는 이름의 configmap 생성

% kubectl create configmap eshop --from-literal=DBNAME=mysql --from-literal=USER=admin
configmap/eshop created

% kubectl get configmap
NAME               DATA   AGE
eshop              2      4s
kube-root-ca.crt   1      173d

% kubectl describe configmaps eshop
Name:         eshop
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
DBNAME:
----
mysql
USER:
----
admin

BinaryData
====

Events:  <none>

2. Pod 생성 및 configmap과 매핑

% kubectl run eshop-configmap --image=nginx --dry-run=client -o yaml > eshop-configmap.yaml

% vim eshop-configmap.yaml

# 아래와 같이 편집
apiVersion: v1
kind: Pod
metadata:
  name: eshop-configmap
spec:
  containers:
  - image: nginx
    name: eshop-configmap
    env:
    - name: DB
      valueFrom:
        configMapKeyRef:
          name: eshop
          key: DBNAME

% kubectl apply -f eshop-configmap.yaml
pod/eshop-configmap created

% kubectl get pod eshop-configmap
NAME              READY   STATUS              RESTARTS   AGE
eshop-configmap   0/1     ContainerCreating   0          4s

3. 매핑 확인

컨테이너에 직접 접근해서 환경 변수를 확인해봅시다.

% kubectl exec -it eshop-configmap -- /bin/bash

# DB라는 이름의 환경변수의 값이 configmap의 DBNAME의 값인지 확인합니다.
% env
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=eshop-configmap
PWD=/
PKG_RELEASE=1~bullseye
HOME=/root
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
DB=mysql
NJS_VERSION=0.7.5
TERM=xterm
SHLVL=1
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.23.0
_=/usr/bin/env

Secret

  • 컨테이너가 사용하는 password, auth token, ssh key와 같은 중요한 정보를 저장하고 민감한 구성정보를 base64로 인코딩해서 한 곳에 모아서 관리합니다.
  • 민감하지 않은 일반 설정 데이터는 configMap을 사용하고 민감한 데이터는 secret을 사용합니다.

실습

secret을 생성하고 입력된 value 값을 확인해봅시다.

% kubectl create secret generic eshop-secret --from-literal=DBNAME=mysql --from-literal=USER=admin

% kubectl get secret

# value가 확인되지 않고 byte만 나타나는 것을 볼 수 있습니다.
% kubectl describe secret eshop-secret

# secret을 yaml 형식으로 보면 인코딩된 value를 볼 수 있습니다.
% kubectl get secret eshop-secret -o yaml

CKA 문제 유형

  • 작업 클러스터: k8s

Secret Name: super-secret
Password: bob

Create a pod named pod-secrets-via-file, using the redis image, which mounts a secret named super-secret at /secrets

Create a second pod named pod-secrets-via-env, using the redis image, which exports Password as CONFIDENTIAL

1. Secret 생성

% kubectl create secret generic super-secret --from-literal=Password=bob
secret/super-secret created

% kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-gvdn7   kubernetes.io/service-account-token   3      173d
super-secret          Opaque                                1      5s

% kubectl describe secret super-secret
Name:         super-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
Password:  3 bytes

2. 첫 번째 Pod 생성(볼륨 마운트 필요)

쿠버네티스 공식 문서 : Secret - Volume Mount를 참고하세요.

% kubectl run pod-secrets-via-file --image=redis --dry-run=client -o yaml > pod-secrets-via-file.yaml

% vim pod-secrets-via-file.yaml

# 아래와 같이 편집
apiVersion: v1
kind: Pod
metadata:
  name: pod-secrets-via-file
spec:
  containers:
  - name: pod-secrets-via-file
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/secrets"
  volumes:
  - name: foo
    secret:
      secretName: super-secret

% kubectl apply -f pod-secrets-via-file.yaml
pod/pod-secrets-via-file created

3. 생성된 Pod에 제대로 마운트 되었는지 확인

secret에 담긴 key=value의 데이터는 볼륨 마운트 시 마운트 경로 밑에 key 이름으로 된 파일이 생성되고 그 파일의 내용에 value가 들어가게 됩니다.

% kubectl exec -it pod-secrets-via-file -- /bin/bash
% cd /secrets
% ls
Password

% cat Password
bob

4. 두 번째 Pod 생성(환경 변수 매핑)

쿠버네티스 공식 문서 : Secret - Environment Variable를 참고하세요.

% kubectl run pod-secrets-via-env --image=redis --dry-run=client -o yaml > pod-secrets-via-env.yaml

% vim pod-secrets-via-env.yaml

# 아래와 같이 편집
apiVersion: v1
kind: Pod
metadata:
  name: pod-secrets-via-env
spec:
  containers:
  - name: pod-secrets-via-env
    image: redis
    env:
      - name: CONFIDENTIAL
        valueFrom:
          secretKeyRef:
            name: super-secret
            key: Password

% kubectl apply -f pod-secrets-via-env.yaml
pod/pod-secrets-via-env created

5. 생성된 Pod에 환경 변수가 제대로 매핑되었는지 확인

% kubectl exec -it pod-secrets-via-env -- /bin/bash
% env
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=pod-secrets-via-env
REDIS_DOWNLOAD_SHA=2cde7d17214ffe305953da9fff12333e8a72caa57fd4923e4872f6362a208e73
PWD=/data
HOME=/root
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
REDIS_VERSION=7.0.3
GOSU_VERSION=1.14
CONFIDENTIAL=bob
TERM=xterm
REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-7.0.3.tar.gz
SHLVL=1
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env
profile
Devops Engineer

0개의 댓글