DevOps/Kubernetis

Kubernetis #05 (ConfigMap/Secret)

SeongYeong Han 2023. 10. 19. 17:38

01. Kubernetis ConfigMap

ConfigMap 이란?

설정 정보를 환경변수 혹은 볼륨의 형태로 파드에 전달하기 위한 목적으로 사용되는 API-Resource이다. ConfigMap은 파드에서 직접 환경변수를 관리하지 않고 ConfigMap을 분리하여 목적에 따라 설정 데이터를 다르게 주입 가능하다.

 

ConfigMap은 파드 내 컨테이너의 "환경변수" 혹은 "볼륨"으로 연결 가능하다.

 

 

02. Kubernetis ConfigMap 설정

가. Deployment.yaml 파일안에 env 키값을 넣는 방법

  • line 18~22 : env 키값을 이용하여 환경변수를 사전 설정한다.
  1 apiVersion: apps/v1
  2 kind: Deployment
  3 metadata:
  4   name: mysql
  5 spec:
  6   selector:
  7     matchLabels:
  8       app: mysql
  9   template:
 10     metadata:
 11       name: mysql
 12       labels:
 13         app: mysql
 14     spec:
 15       containers:
 16       - name: mysql
 17         image: mysql:5.7
 18         env:
 19         - name: MYSQL_ROOT_PASSWORD
 20           value: fastcampus
 21         - name: MYSQL_DATABASE
 22           value: devops
 23         ports:
 24         - name: http
 25           containerPort: 3306
 26           protocol: TCP
  • 생성된 컨테이너에 직접 접근하여, 설정한 환경변수가 제대로 들어갔는지 확인해본다.
  • MYSQL_ROOT_PASSWORD 환경변수로 설정한 패스워드(fastcampus)로 DB에 접속, 생성된 DB(devops) 확인

나. configmap.yaml 파일을 따로 생성하는 방법 #1

  • configmap 정보를 정의한 yaml 파일을 생성
  • line5~7 : data 키 값을 설정하여 환경변수 값을 설정한다.
  1 apiVersion: v1
  2 kind: ConfigMap
  3 metadata:
  4   name: mysql-config
  5 data:
  6   MYSQL_ROOT_PASSWORD: fastcampus
  7   MYSQL_DATABASE: devops
  • line 18~20 : envFrom이라는 속성을 설정하고 하위에 configMapRef 값 추가, 아래에 configmap의 name을 넣는다.
  1 apiVersion: apps/v1
  2 kind: Deployment
  3 metadata:
  4   name: mysql
  5 spec:
  6   selector:
  7     matchLabels:
  8       app: mysql
  9   template:
 10     metadata:
 11       name: mysql
 12       labels:
 13         app: mysql
 14     spec:
 15       containers:
 16       - name: mysql
 17         image: mysql:5.7
 18         envFrom:
 19         - configMapRef:
 20             name: mysql-config
  • $kubectl apply를 통해서 configmap을 생성한다.
  • $kubectl get configmap 명령어로 생성한 configmap을 확인한다.

  • 이 후 deployment 를 apply 하면 위의 결과와 동일하게 나온다.

다. configmap.yaml 파일을 따로 생성하는 방법 #2

  • line 18 : configmap.yaml 파일의 내용은 위와 동일하다는 가정하에, deployment.yaml 파일에 env 키 값을 추가한다. 
  • line 19~23 : 환경변수의 키 값은 코드에 그대로 적용하고, 밸류 값만 configmap 파일에서 불러 온다. (configMapKeyRef 속성 사용)
  1 apiVersion: apps/v1
  2 kind: Deployment
  3 metadata:
  4   name: mysql
  5 spec:
  6   selector:
  7     matchLabels:
  8       app: mysql
  9   template:
 10     metadata:
 11       name: mysql
 12       labels:
 13         app: mysql
 14     spec:
 15       containers:
 16       - name: mysql
 17         image: mysql:5.7
 18         env:
 19         - name: MYSQL_ROOT_PASSWORD
 20           valueFrom:
 21             configMapKeyRef:
 22               name: mysql-config
 23               key: MYSQL_ROOT_PASSWORD

라. 컨테이너에 볼륨을 연결하여, 설정을 추가하는 법

  • line 21~23 : 컨테이너 하위에 volumeMounts 속성을 이용하여, volume의 경로를 설정하고 name을 지정한다.
  • line 24~27 : volumes 속성을 사용하여,  mysql-config이름을 가진 볼륨에 configmap 정보를 가져온다.
  1 apiVersion: apps/v1
  2 kind: Deployment
  3 metadata:
  4   name: mysql
  5 spec:
  6   selector:
  7     matchLabels:
  8       app: mysql
  9   template:
 10     metadata:
 11       name: mysql
 12       labels:
 13         app: mysql
 14     spec:
 15       containers:
 16       - name: mysql
 17         image: mysql:5.7
 18         envFrom:
 19         - configMapRef:
 20             name: mysql-config
 21         volumeMounts:
 22         - mountPath: /tmp/config
 23           name: mysql-config
 24       volumes:
 25       - name: mysql-config
 26         configMap:
 27           name: mysql-config
  • apply하여 deployment를 생성 후, 생성된 컨테이너에 접속하여 생성한 볼륨을 확인한다.
  • 해당 볼륨의 경로에 생성된 파일(configmap의 키 값)을 열어보면 configmap의 value 값이 저장된 것을 볼 수 있다. 

 

 

03. Kubernetis Secret

위의 그림과 같이 ConfigMap과 비슷하게 Volume과 환경변수 방식으로 Pod에 정보를 주입하는 걸 알 수 있다. 하지만 ConfigMap과는 다르게 민감한 데이터(Password, SSH Key)를 저장하기에 Base64 인코딩되어 저장된다.

 

Secret 사용 목적에 따라 몇가지 종류로 구분된다.

 

  • 1. Opaque (generic) - 일반적인 용도의 시크릿
  • 2. dockerconfigjson - 도커 이미지 저장소 인증 정보
  • 3. tls - TLS 인증서 정보
  • 4. service-account-token - ServiceAccount의 인증 정보

 

 

02. Kubernetis Secret 설정

가. secret.yaml 파일을 따로 설정하는 방법 #1

  • configmap.yaml과 유사하게 secret 값을 정의한 yaml 파일을 생성
  • line5~6 : stringData 키 값을 설정하여 환경변수 값을 설정한다.
  1 apiVersion: v1
  2 kind: Secret
  3 metadata:
  4   name: mysql-secret
  5 stringData:
  6   MYSQL_ROOT_PASSWORD: fastcampus
  • line 21~22 : envFrom 이라는 속성을 추가하고 하위에 secretRef 속성 추가, 아래에 name속성과 값을 추가한다.
  1 apiVersion: apps/v1
  2 kind: Deployment
  3 metadata:
  4   name: mysql
  5 spec:
  6   selector:
  7     matchLabels:
  8       app: mysql
  9   template:
 10     metadata:
 11       name: mysql
 12       labels:
 13         app: mysql
 14     spec:
 15       containers:
 16       - name: mysql
 17         image: mysql:5.7
 18         envFrom:
 19         - configMapRef:
 20             name: mysql-config
 21         - secretRef:
 22             name: mysql-secret

 

나. secret.yaml 파일을 따로 생성하는 방법 #2

  • secret.yaml 파일은 위와 동일!
  • line 21~23 : 환경변수의 키 값은 코드에 그대로 적용하고, 밸류 값만 secret.yaml 파일에서 불러 온다. (secretKeyRef 속성 사용)
  1 apiVersion: apps/v1
  2 kind: Deployment
  3 metadata:
  4   name: mysql
  5 spec:
  6   selector:
  7     matchLabels:
  8       app: mysql
  9   template:
 10     metadata:
 11       name: mysql
 12       labels:
 13         app: mysql
 14     spec:
 15       containers:
 16       - name: mysql
 17         image: mysql:5.7
 18         env:
 19         - name: MYSQL_ROOT_PASSWORD
 20           valueFrom:
 21             secretKeyRef:
 22               name: mysql-secret
 23               key: MYSQL_ROOT_PASSWORD

 

다. 컨테이너에 볼륨을 연결하여, 설정을 추가하는 법

  • line 26~27 : 컨테이너 하위에 volumeMounts 속성을 이용하여, volume의 경로를 설정하고 name을 설정한다.
  • line 32~34 : volumes 속성을 사용하여, mysql-secret 이름을 가진 볼륨에 secret 정보를 가져온다.
  1 apiVersion: apps/v1
  2 kind: Deployment
  3 metadata:
  4   name: mysql
  5 spec:
  6   selector:
  7     matchLabels:
  8       app: mysql
  9   template:
 10     metadata:
 11       name: mysql
 12       labels:
 13         app: mysql
 14     spec:
 15       containers:
 16       - name: mysql
 17         image: mysql:5.7
 18         envFrom:
 19         - configMapRef:
 20             name: mysql-config
 21         - secretRef:
 22             name: mysql-secret
 23         volumeMounts:
 24         - mountPath: /tmp/config
 25           name: mysql-config
 26         - mountPath: /tmp/secret
 27           name: mysql-secret
 28       volumes:
 29       - name: mysql-config
 30         configMap:
 31           name: mysql-config
 32       - name: mysql-secret
 33         secret:
 34           secretName: mysql-secret

 

* 위에서 보여진 것과 같이 Secret 은 민감한 정보를 가지고 있지만 데이터가 보호되지는 않고 있다. 이를 방지하기 위해 아래 두가지 방법이 요구된다.

External Secrets (https://github.com/external-secrets/external-secrets)

- HashiCorp Vault, AWS Secrets Manager, AWS Parameter Store 등과 통합된다.

- ExternalSecret 오브젝트를 생성하면 컨트롤러가 프로바이더로부터 기밀 값을 가져와서 Secret 오브젝트 생성

Sealed Secrets (https://github.com/bitnami-labs/sealed-secrets)

- 쿠버네티스 클러스터 상에 컨트롤러 실행

클러스터 상에 암호화 키 보관

kubeseal CLI가 컨트롤러와 통신하며 데이터 암호화

SealedSecret 오브젝트를 생성하면 컨트롤러가 복호화하여 Secret 오브젝트 생성

 

- END -