Cloud/k8s-CKA

[CKA] 18. Environment Variables

jinkwon.kim 2023. 3. 28. 00:12
728x90
반응형

개요

k8s에서 Evrionment Variables들이 어떻게 관리되는지 또 어떻게 사용하는지 알아보겠습니다.

: how to set environment and use environment in k8s

Evironment Variables의 종류 

1. Environment Variables in Application 

2. ConfigMaps in Application 

3. secretkey in Application

Environment Variables in Application 

yaml 파일에 Environment Variables를 정의하여 container 내부에서 사용하는 방법입니다.

사용법

env: 필드를 사용하여 

name : value  형식으로 Environment Variables를 넘겨서 사용가능 합니다.

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: env-ubuntu
  name: env-ubuntu
spec:
  containers:
  - image: ubuntu
    name: env-ubuntu
    env:
      - name: APP_COLOR
        value: pink
    command: ["sleep"]
    args: ["infinity"]
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

검증

#kubectl exec -it <pod_name> -c <container_name> --namespace=<namespace> -- /bin/bash

Ex) kubectl exec -it env-ubuntu env-ubuntu --namespace=default -- /bin/bash

ConfigMap in Application

정의

ConfigMap이란 Yaml 파일에 정의해 놓은 env 설정을 밖으로 빼서 만든 설정 파일 Map입니다.

ConfigMap 만들기

명령어로 만들기

key=value 형식으로 config map설정하기

  # Create a new config map named my-config with key1=config1 and key2=config2
  kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

configmap 확인

 kubectl describe configmap my-config
Name:         my-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
key1:
----
config1
key2:
----
config2

BinaryData
====

Events:  <none>

Config yaml로 만들기

출처 : https://kubernetes.io/docs/concepts/configuration/configmap/

 

ConfigMaps

A ConfigMap is an API object used to store non-confidential data in key-value pairs. Pods can consume ConfigMaps as environment variables, command-line arguments, or as configuration files in a volume. A ConfigMap allows you to decouple environment-specifi

kubernetes.io

configmap을 만들 때 data는 2가지 형태로 만들 수 있습니다

1. key: value 형식

2. file: key=value

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  # 환경 변수를 만들어서 사용
  APP_COLOR: blue
  env_string: hahahah lol

  # file을 만들어서 안에 값을 넣어사용 keys
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true

 

3가지의 사용 방법

1. envFrom 이용

configMap을 전체 참조하는 방식입니다.

my-configmap의 data를 모두 접근할 수 있습니다.

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: env-ubuntu
  name: env-ubuntu
spec:
  containers:
  - image: ubuntu
    name: env-ubuntu
    envFrom:
      - configMapRef:
          name: my-configmap

2. env  이용

configMap에서 원하는 key를 하나만 참조하는 방식입니다.

아래 예제에서는 my-configmap의 APP_COLOR값을 CHANGE_COLOR에 세팅하였습니다.

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: env-ubuntu
  name: env-ubuntu
spec:
  containers:
  - image: ubuntu
    name: env-ubuntu
    env:
      - name: CHANGE_COLOR
        valueFrom:
          configMapKeyRef:
            name: my-configmap
            key: APP_COLOR

3. volumes 이용

configmap 자체를 volume을 사용하여 mount 한 다음에 사용합니다. 

아래 yaml을 실행하여 pod를 생성하게 되면 /config 하위에 key값들이 file 형태로 생성이 됩니다.

 

 

Pod Yaml 파일 

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: env-ubuntu
  name: env-ubuntu
spec:
  containers:
  - image: ubuntu
    name: env-ubuntu
    command: ["sleep"]
    args: ["infinity"]
    volumeMounts:
      - name: app-config-volume
        mountPath: "/config"
        readOnly: true
  volumes:
    - name: app-config-volume
      configMap:
        name: my-configmap

/config에 파일 생성 결과

secretkey in Application

configMap은 환경 변수를 plain-text로 관리 합니다 .그렇기 때문에 누구나 주요 data를 쉽게 볼수 있습니다.

그래서 이를 보완하고자 나온것이 secret이란 object입니다.

secret이란 무엇인가?

환경 변수를 plain-text가 아닌 base64로 저장하여 관리하는 방식입니다. 

사용방식을 configMap과 유사합니다.

https://kubernetes.io/docs/concepts/configuration/secret/

secret 생성

command 사용

kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

yaml파일 사용

아래는 간단한 예제 yaml 파일이고,  data는 모두 base64로 encoding 되어 있습니다.

참고: 다양한 type이 존재합니다.

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  MY_NAME: cm9vdA==
  my_pwd: cGFzc3dk

secret yaml 사용법

configMap관 사용방식은 유사하며 다만 secret으로 명령이 변경이 됩니다.

etcd secret 암호화방법

https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/

정리

k8s에서 pod의 environment value를 pod에서 직접 설정하고 외부에서 관리할 수 있는 confmap을 제공합니다.

configmap을 pod에서 3가지 형태로 사용이 가능합니다. 

1. configmap을 통째로 참조하여 사용 

2. configmap의 일부 값만 사용

3. configmap를 통째로 mount 하여 사용

추가적으로 evironment를 좀더 안전하게 사용하기위한 방식으로 secret을 제공합니다. 

Next Post

[CKA] 19. multi container pods

728x90
반응형