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 -