โ ์ฟ ๋ฒ๋คํฐ์ค ์ด๋๋ ํด๋์ค (์ง์ํธ) - Spring 1, 2 ์ ๋ฃ๊ณ ์์ฑํ๋ ๋ณต์ต ๋ธ๋ก๊ทธ ์ ๋๋ค.
1. Configmap, Secret ๊ธฐ๋ณธ ๊ฐ๋
- Configmap ๊ณผ Secret ์ Pod ์ ๋ฐ๋ก ์ฐ๊ฒฐ
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๋ค ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์๋ค.
Configmap
Pod ์ ํ๊ฒฝ๋ณ์ ์ค์
- Pod ์ containers > envFrom ๊ณผ ์ฐ๊ฒฐ
- envFrom ์ ConfigMap์ ๋ฐ์ดํฐ๋ฅผ Pod ๋ด๋ถ์ ํ๊ฒฝ๋ณ์๋ก ์ฃผ์ ํ๋ ์์ฑ
- Pod ๊ฐ ์์ฑ๋๋ฉด, env ๋ช ๋ น์ด๋ก ํด๋น ํ๊ฒฝ๋ณ์๊ฐ ์ ์ฃผ์ ๋์๋์ง ํ์ธ ๊ฐ๋ฅ
spring_profiles_active: "dev"
application_role: "ALL"
postgresql_filepath: "/usr/src/myapp/datasource/postgresql-info.yaml"
- key: value ํ์์ผ๋ก ๊ตฌ์ฑ
- ๊ฐ๊ฐ์ ์ญํ โฌ๏ธ
Key | ์ค๋ช |
spring_profiles_active | Spring์ ํ๊ฒฝ ์ค์ ๊ฐ ์ง์ (์: dev, prod) |
application_role | ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญํ ์ง์ (๊ธฐ๋ฅ ์ ์ด์ฉ) |
postgresql_filepath | ์ธ๋ถ ํ๊ฒฝ ์ค์ ํ์ผ์ ๊ฒฝ๋ก (Secret ์ฐ๋ ๋ฑ) |
- postgresql_filepath๋ Secret ๋ฐ์ดํฐ๋ก ์ฐ๊ฒฐ๋ ํ์ผ ๊ฒฝ๋ก์ด๋ฉฐ, ์ด ๊ฒฝ๋ก๋ Pod์ mountPath ์ค์ ์ ๋ฐ๋ผ ๊ฒฐ์
- ๋ง์ฝ mountPath ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ๋น๋ํ์ง ์๊ณ ConfigMap๋ง ์์ ํด์ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌ ๊ฐ๋ฅ
Pod ๊ฐ ์์ฑ ์ ๋์ ํ๋ฆ
- Configmap ์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ํ๊ฒฝ๋ณ์๋ก ์ฃผ์
- ์ปจํ ์ด๋ ์คํ์, ํ๊ฒฝ๋ณ์ ๊ฐ์ด ๋ช ๋ น์ด์ ๋งคํ
- App ๊ธฐ๋
java -Dspring.profiles.active=${spring_profiles_active} \
-D... \
-jar /usr/src/myapp/app.jar
Secret
- Secret ์ Pod์ volumes ์ ์ฐ๊ฒฐ
- Volume ์ Pod ์ ์ธ๋ถ ์ ์ฅ์๋ฅผ ์ฐ๊ฒฐํ๋ ์์ฑ
- Secret ์ ์ฐ๊ฒฐํ๊ณ Pod ๋ด๋ถ์ ์ ์ํ๋ฉด,
๋ง์ดํธ๋ ๊ฒฝ๋ก ์์ Secret ์ stringData ๊ฐ์ด ํ์ผ๋ก ์ ์ฅ๋์ด ์์์ ํ์ธ ๊ฐ๋ฅ
Secret ์ ์ ์์
# stringData
postgresql-info.yaml: |
driver-class-name: "org.postgresql.Driver"
url: "jdbc:postgresql://postgresql:5431"
username: "dev"
password: "dev123"
# data
postgresql-info.yaml: >-
ZHJpdmVyLWNsYXNzL.....kZXYiCnBhc3N3b3JkOiAiZGtmaTNuZmFrK2RmajMiCg==
- postgresql-info.yaml ํ์ผ์ด ๋ง๋ค์ด์ง๊ณ , ์๋ ๋ด์ฉ๋ค์ด ์ ์ฅ
- stringData ๋ ์ฐ๊ธฐ ์ ์ฉ ์์ฑ
- ์ ์ฅ๋๋ ๊ฐ์ Base64 ์ธ์ฝ๋ฉ ๊ฐ์ผ๋ก ์ ์ฅ๋์ง๋ง, ๋ณด์ ์ธก๋ฉด์์ ์์ ํ ๋ณดํธ๋ ์๋๋ค (์ฝ๊ฒ ๋์ฝ๋ฉ ๊ฐ๋ฅ)
Secret ๋์ ํ๋ฆ
- Pod์ mountPath ์ค์
- ์ง์ ๋ ๊ฒฝ๋ก์ Secret์ด ๋ง์ดํธ๋จ
- Pod ์คํ ์ Volume์ด Secret๊ณผ ์ฐ๊ฒฐ๋จ
- Secret์ ์๋ postgresql-info.yaml ํ์ผ์ด ์ปจํ ์ด๋ ์์ ์์ฑ๋จ
- ์ปจํ
์ด๋ ๋ด๋ถ์์ ํ์ผ ์ ๊ทผ ๊ฐ๋ฅ
- ์์ฑ๋ ํ์ผ ๋ด์ฉ์ Base64 ๋์ฝ๋ฉ๋ ์๋ ์ ๋ ฅ๊ฐ
- ์ ํ๋ฆฌ์ผ์ด์
์ ํด๋น ํ์ผ์ ์ฝ์ด DB ์ค์ ์ ์ฌ์ฉ
- ์: DB ์ฐ๊ฒฐ ์ ๋ณด (driver, url, username, password) ๋ฑ
๋์ ํ์ธ
1. ์ ๋ ฅ๊ฐ ํ์ธ : Configmap ๊ณผ Secret ์ data ํ์ธ
1-1. ๋์๋ณด๋
Configmap | Secret |
{ "application_role": "ALL", "postgresql_filepath": "/usr/src/myapp/datasource/postgresql-info.yaml", "spring_profiles_active": "dev" } |
driver-class-name: "org.postgresql.Driver" url: "jdbc:postgresql://postgresql:5431" username: "dev" password: "dev123" |
1-2. ๋ช ๋ น์ด๋ก ํ์ธ
Configmap | Secret |
kubectl describe -n anotherclass-123 configmaps api-tester-1231-properties | kubectl get -n anotherclass-123 secret api-tester-1231-postgresql -o yaml |
Data ==== application_role: ---- ALL postgresql_filepath: ---- /usr/src/myapp/datasource/postgresql-info.yaml spring_profiles_active: ---- dev |
apiVersion: v1 data: postgresql-info.yaml: ZHJpdmVyLWNsYXNzLW5hbWU6ICJvcmcucG9zdGdyZXNxbC5Ecml2ZXIiCnVybDogImpkYmM6cG9zdGdyZXNxbDovL3Bvc3RncmVzcWw6NTQzMSIKdXNlcm5hbWU6ICJkZXYiCnBhc3N3b3JkOiAiZGV2MTIzIgo= kind: Secret metadata: creationTimestamp: "2025-05-30T02:40:38Z" labels: component: backend-server instance: api-tester-1231 managed-by: dashboard name: api-tester part-of: k8s-anotherclass version: 1.0.0 name: api-tester-1231-postgresql namespace: anotherclass-123 resourceVersion: "82533" uid: 54b27805-51a3-48ec-9657-1a4336d4f6d0 type: Opaque |
2. ์ปจํ ์ด๋ ๋ด๋ถ์ ํ๊ฒฝ๋ณ์๋ก ์ ์ฃผ์ ์ด ๋๋์ง ํ์ธ
2-1. App ์ด ๊ธฐ๋ํ ๋ ํ๊ฒฝ๋ณ์๊ฐ ์ฌ์ฉ๋ ๋ช ๋ น์ด ์กฐํ (env)
API_TESTER_1231_SERVICE_PORT=80
API_TESTER_1231_SERVICE_HOST=10.106.210.22
postgresql_filepath=/usr/src/myapp/datasource/postgresql-info.yaml
LANG=C.UTF-8
API_TESTER_1231_PORT_80_TCP_ADDR=10.106.210.22
HOSTNAME=api-tester-1231-755676484f-gmn88
JAVA_HOME=/usr/java/openjdk-17
API_TESTER_1231_PORT=tcp://10.106.210.22:80
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
JAVA_VERSION=17.0.2
API_TESTER_1231_PORT_80_TCP=tcp://10.106.210.22:80
KUBERNETES_PORT=tcp://10.96.0.1:443
PWD=/usr/src/myapp
HOME=/root
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP_PORT=443
API_TESTER_1231_PORT_80_TCP_PROTO=tcp
spring_profiles_active=dev
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
TERM=xterm
API_TESTER_1231_PORT_80_TCP_PORT=80
application_role=ALL
SHLVL=1
KUBERNETES_SERVICE_PORT=443
PATH=/usr/java/openjdk-17/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_SERVICE_HOST=10.96.0.1
_=/usr/bin/env
2-2. Secret ์ผ๋ก ๋ง์ดํ ํ ๊ฐ ํ์ธ
# Secret ํ์ผ ํ์ธ
(1) ls /usr/src/myapp/datasource
(2) cat /usr/src/myapp/datasource/postgresql-info.yaml
# java ์คํ ์ธ์ ํ์ธ
(3) jps -v
(1)postgresql-info.yaml
(2) driver-class-name: "org.postgresql.Driver"
url: "jdbc:postgresql://postgresql:5431"
username: "dev"
password: "dev123"
(3) 1 app.jar -Dspring.profiles.active=${spring_profiles_active} -Dapplication.role=${application_role} -Dpostgresql.filepath=${postgresql_filepath}
42 Jps -Dapplication.home=/usr/java/openjdk-17 -Xms8m -Djdk.module.main=jdk.jcmd
3. API ๋ฅผ ๋ ๋ ค์ ํ๊ฒฝ๋ณ์๊ฐ ์ ๋ฐ์๋๋์ง ํ์ธ
3-1. http://192.168.56.30:31231/info → Application ์ ๋ณด ํ์ธ
[Version] : Api Tester v1.0.0
[Profile] : dev
[Role] : ALL (option: ALL, GET, POST, PUT, DELETE)
[Database]
driver-class-name : org.postgresql.Driver
url : jdbc:postgresql://postgresql:5431
username : dev
password : dev123
3-2. http://192.168.56.30:31231/properties → Application Properties ํ์ผ ๊ตฌ์ฑ ํ์ธ
[Application profile] : dev
Volume path :/usr/src/myapp/files/dev/
application.yaml : Common properties
---
datasource:
driver-class-name:
url:
username:
password:
application:
role: "ALL"
version: "Api Tester v1.0.0"
postgresql:
filepath:
application-dev.yaml : Dev properties
---
volume-path:
persistent-volume-data: "/usr/src/myapp/files/dev/"
pod-volume-data: "/usr/src/myapp/tmp/"
application-qa.yaml : QA properties
---
volume-path:
persistent-volume-data: "/usr/src/myapp/files/qa/"
pod-volume-data: "/usr/src/myapp/tmp/"
application-prod.yaml : Prod properties
---
volume-path:
persistent-volume-data: "/usr/src/myapp/files/prod/"
pod-volume-data: "/usr/src/myapp/tmp/"
4. ๋ฐ์ดํฐ ์์
(Configmap) application_role ์ ALL → GET ์ผ๋ก ๋ณ๊ฒฝ
(Secret) username ์ dev → test ๋ก ๋ณ๊ฒฝ
5. ํ๊ฒฝ๋ณ์๊ฐ ์ ๋ฐ์๋๋์ง ํ์ธ
(Configmap)
- ํ๋ Exec ์ ๋ค์ด๊ฐ์ env ๋ช ๋ น์ด ์ ๋ ฅ
- ํ์ง๋ง, application_role=ALL ๋ก ํ๊ฒฝ๋ณ์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์
→ ํ๊ฒฝ๋ณ์๋ Pod ๊ฐ ์์ฑ๋ ๋ ํ๋ฒ๋ง ์ฃผ์ ๋๊ธฐ ๋๋ฌธ์, ConfigMap ์ ๊ฐ์ ๋ฐ๊พผ๋ค๊ณ ๋ณ๊ฒฝ๋์ง ์์
→ Pod ๋ฅผ ์ญ์ ํ ๋ค์ ๋ง๋ค์ด์ง๋ฉด ํ๊ฒฝ๋ณ์๊ฐ ๋ณ๊ฒฝ๋๋ค.
(Secret)
- ํ๋ Exec ์ ๋ค์ด๊ฐ์ cat /usr/src/myapp/datasource/postgresql-info.yaml ์ ๋ ฅ
driver-class-name: "org.postgresql.Driver"
url: "jdbc:postgresql://postgresql:5431"
username: "test"
password: "dev123"
- ๊ฐ์ด ๋ณ๊ฒฝ๋จ
→ Secret ์ ๋ณผ๋ฅจ ๋ง์ดํ ์ผ๋ก ์ฐ๊ฒฐํด๋์๊ธฐ ๋๋ฌธ์
→ App ์์๋ ์ด ํ์ผ์ 5์ด ๊ฐ๊ฒฉ์ผ๋ก ์กฐํํ๋ค.
2. ์์ญ ํ๊ดด์ ์ฃผ๋ฒ Configmap
VM (Kubernetes ์ ํ๊ฒฝ) | Kubernetes |
[์ธํ๋ผ ํ๊ฒฝ]
|
[์ธํ๋ผ ํ๊ฒฝ]
|
[๊ฐ๋ฐ ํ๊ฒฝ & CI/CD ํ๊ฒฝ]
|
[๊ฐ๋ฐ ํ๊ฒฝ & CI/CD ํ๊ฒฝ]
|
→ VM ์์ ๊ฐ์ ๋ด๋น์๋ค์ด ๊ด๋ฆฌํ๋ ํ๊ฒฝ๋ณ์๋ค์
→ ConfigMap ์ผ๋ก ์ด ๋ชจ๋ ์ญํ ๋ค์ ํ ๋ฒ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
์์ญ ํ๊ดด?
- ํฐ ํ๋ก์ ํธ๋ก ๊ฐ๋ฉด ๊ฐ์๋ก ๊ฐ ๋ถ์ผ์ ๋ด๋น์๋ค์ด ์กด์ฌ
- ๊ทธ๋ฆฌ๊ณ ๋ชจ๋๊ฐ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ๋ค ๋ค๋ฃฐ ์ค ์๋๊ฒ ์๋๋ค
- ๋ชจ๋ ์ธํ๋ผ๊ฐ ์ฟ ๋ฒ๋คํฐ์ค ์์์ ๋์๊ฐ์ง๋ ์๋๋ค.
Configmap ์ด ๋ชฉ์ ๋ง ๋ณด๋ฉด ๊ฐ๋จํ์ง๋ง, ํ๋ก์ ํธ ์ํฉ์ ๋ฐ๋ผ ์์ญ์ ๋๋๋ค๊ณ ์ ๋ต์ด ์๋ค. (⇒ ์์ญํ๊ดด์ ์ฃผ๋ฒ)
3. ์ด๋ฆ ๋๋ฌธ์ ๊ธฐ๋๊ฐ ๋๋ฌด ์ปธ๋ Secret
type
โ type: Opaque (๊ธฐ๋ณธ๊ฐ)
- ์๋ฏธ: '๋ถํฌ๋ช '์ด๋ผ๋ ๋ป์ด์ง๋ง Kubernetes์์๋ ์ผ๋ฐ์ ์ธ Key-Value ์ ์ฅ์ฉ์ผ๋ก ์ฌ์ฉ๋จ
- ConfigMap๊ณผ ๊ฑฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋์
- ์ฐจ์ด์ ์ ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ **Base64 ์ธ์ฝ๋ฉ๋ data**๋ก ์ ์ฅ๋๋ค๋ ์
๐ณ type: kubernetes.io/dockerconfigjson (๊ตฌ: docker-registry)
- ์ฌ์ค ์ด๋ฏธ์ง ์ ์ฅ์(Private Docker Registry)๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ฉ
- data ํญ๋ชฉ์ docker-username, docker-password, docker-email ๋ฑ์ ์ ๋ณด๋ฅผ ํฌํจ์ํด
- Secret์ ์์ฑํ ํ, imagePullSecrets ์์ฑ์ผ๋ก Pod์ ์ฐ๊ฒฐ
๐ type: kubernetes.io/tls
- TLS ์ธ์ฆ์๋ฅผ ์ ์ฅํ ๋ ์ฌ์ฉ
- data์ ๋ค์๊ณผ ๊ฐ์ ํค๋ฅผ ํฌํจํด์ผ ํจ:
- tls.crt: ์ธ์ฆ์ ํ์ผ ๋ด์ฉ
- tls.key: ๊ฐ์ธํค ๋ด์ฉ
- ์ฃผ๋ก Ingress, HTTPS ํต์ , Pod ๊ฐ๋ณ ์ธ์ฆ์ ์ค์ ๋ฑ์ ์ฌ์ฉ
-> ์ด ์ธ์๋ 3~4๊ฐ์ ํ์ ๋ค์ด ๋์๋ค.
-> type ์ค์์ ๋ฐ์ดํฐ ์ํธํ๋ฅผ ์ ๊ณตํด์ฃผ๋ ๊ฑด ์์
์ค์ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฐฉ์
- Cluster ๋ด์์ ์ง์ ์์ฑ/๊ด๋ฆฌ
- Secret ์ ๋ํ ์ค๋ธ์ ํธ ์์ฑ์ ํ์ดํ๋ผ์ธ์ ํ์์ ๋ง๋ค์ง ์๊ธฐ
- Cluster ๋ด์์ ์ง์ ๋ง๋ค๊ณ ๊ด๋ฆฌ
- ์ฟ ๋ฒ๋คํฐ์ค ๊ด๋ฆฌ ๊ถํ์ ํ์คํ๊ฒ ์ค์ ํ๋ฉด, ์๋ฌด๋ Pod ๋ด๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๋ค
- ์ ๊ทผ ์ ์ด๋ฅผ ํตํ ๋ณด์ ๊ด๋ฆฌ ๋ฐฉ๋ฒ
- ์์ฒด ์ํธํ
- ๋ฌธ์๋ฅผ ์์ฒด์ ์ผ๋ก ์ํธํ
- ํน์ key ๋ฅผ ๊ฐ์ง๊ณ ๋ฌธ์๋ฅผ ์ํธํํ๊ณ
- Secret ์ ํตํด์ ๊ด๋ฆฌ
- ์๋ธํํฐ ์ฌ์ฉ
- HashiCorp ์ Valut ๊ฐ ๋ํ ์
- App ๊ธฐ๋ ์ ์์ฒญ
4. ์์ฉ ๊ณผ์
'๐ฑ ์ธํ๋ฐ > โ ์ฟ ๋ฒ๋คํฐ์ค ์ด๋๋ ํด๋์ค (์ง์ํธ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
(8) Component ๋์์ผ๋ก ์ดํดํ๊ธฐ (0) | 2025.06.08 |
---|---|
(7) PV/PVC, Deployment, Service, HPA (1) | 2025.06.08 |
(5) Probe ์ดํดํ๊ธฐ (1) | 2025.06.02 |
(4) Object ๊ทธ๋ ค๋ณด๋ฉฐ ์ดํดํ๊ธฐ (0) | 2025.05.30 |
(3) ์ค๋ฌด์์ ๋๊ปด ๋ณธ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์ ๋ง ํธํ ์ด์ (0) | 2025.05.29 |