๐ ๊ฐ์
ํ ์ค ์์ฝ: ํ๋๊ฐ ํ์๋ก ํ๋ ๋ฏผ๊ฐํ ์ ๋ณด(๋น๋ฐ๋ฒํธ, ์ธ์ฆ์, ํ ํฐ ๋ฑ)๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค
์ ์ฌ์ฉํ๋๊ฐ:
- ๋ณด์: ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๋ ์ด๋ฏธ์ง ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ํ๋์ฝ๋ฉํ์ง ์๊ธฐ ์ํจ
- ์ ์ฐ์ฑ: ๊ฐ๋ฐ/์ด์ ํ๊ฒฝ์ ๋ฐ๋ผ ์ค์ ๊ฐ๋ง ๋ฐ๊ฟ ๋ผ์ธ ์ ์์ด ์ด๋ฏธ์ง๋ฅผ ๋ค์ ๋น๋ํ ํ์ ์์
- ๋ถ๋ฆฌ: โ์ ํ๋ฆฌ์ผ์ด์
๋ก์งโ๊ณผ โ๋ณด์ ์ค์ โ์ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌ ๊ฐ๋ฅ
ํน์ง:
- ์ ์ฅ ๋ฐฉ์: ๋ฐ์ดํฐ๋
base64๋ก ์ธ์ฝ๋ฉ๋์ด ์ ์ฅ (์ํธํ๊ฐ ์๋์ ์ฃผ์!) - ์ฌ์ฉ ๋ฐฉ์: ํ๋ ๋ด๋ถ์ ํ๊ฒฝ ๋ณ์๋ก ์ฃผ์
ํ๊ฑฐ๋, Volume Mount ํํ๋ก ๋ง์ดํธํ์ฌ ์ฌ์ฉ
- ์ฉ๋ ์ ํ: etcd์ ๋ถํ๋ฅผ ๋ง๊ธฐ ์ํด 1MB๋ก ์ ํ
๐ Secret Type ์ด์ ๋ฆฌ
Secret์ type ํ๋๋ โ์ด ๋ดํฌ ์์ ์ด๋ค ํ์์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋์งโ ๋ฅผ ์์คํ
์ ์๋ ค์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
โ Opaque (์ผ๋ฐํ)
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ ๋ฒ์ฉ์ ์ธ ํ์
. โ๋ถํฌ๋ช
โ์ด๋ผ๋ ๋ป์ผ๋ก, ์ฌ์ฉ์๊ฐ ์ ์ํ ์์์ Key-Value ๋ฐ์ดํฐ๋ฅผ ๋ด์ต๋๋ค.
- ์ฉ๋: DB ๋น๋ฐ๋ฒํธ, API Key, ์ค์ ํ์ผ ๋ฑ ์ ํด์ง ํ์์ด ์๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ
- ํ์ ํค: ์์ (์ฌ์ฉ์ ๋ง์๋๋ก ์ ์)
1
2
3
4
5
6
| apiVersion: v1
kind: Secret
type: Opaque
data:
db-pass: MWYyaZD... # base64 ์ธ์ฝ๋ฉ ๊ฐ
api-key: dXNlcnB...
|
โก kubernetes.io/service-account-token (ํ๋ ์ธ์ฆ์ฉ)
ํ๋๊ฐ ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ์ ํต์ ํ ๋ ์ ์์ ์ฆ๋ช
ํ๊ธฐ ์ํ JWT ํ ํฐ์ ๋ด๊ณ ์์ต๋๋ค.
- ์ฉ๋: ServiceAccount ์์ฑ ์ ์๋์ผ๋ก ๋ง๋ค์ด์ง๊ฑฐ๋, API ์ ๊ทผ์ฉ ํ ํฐ์ด ํ์ํ ๋ ์ฌ์ฉ
- ํ์ ํค:
ca.crt: API ์๋ฒ ์ธ์ฆ์token: ์ค์ Bearer Token (JWT)namespace: ํด๋น ๊ณ์ ์ ๋ค์์คํ์ด์ค
โข kubernetes.io/tls (HTTPS ์ธ์ฆ์์ฉ)
์น ์๋ฒ์ HTTPS ํต์ ์ด๋ ๋ด๋ถ ๋ณด์ ํต์ ์ ์ํ TLS/SSL ์ธ์ฆ์๋ฅผ ์ ์ฅํ๋ ํ์ค ๊ท๊ฒฉ์
๋๋ค.
- ์ฉ๋: Ingress ์ปจํธ๋กค๋ฌ์ TLS ์ค์ , ์น ์๋ฒ ํ๋์ ์ธ์ฆ์ ๋ง์ดํธ
- ํ์ ํค:
tls.crt: ๊ณต๊ฐ ์ธ์ฆ์ (Certificate)tls.key: ๊ฐ์ธํค (Private Key)
1
2
3
4
5
| # TLS Secret ์์ฑ
kubectl create secret tls my-tls-secret \
--cert=tls.crt \
--key=tls.key \
-n default
|
โฃ kubernetes.io/basic-auth (๊ธฐ๋ณธ ์ธ์ฆ์ฉ)
HTTP Basic Authentication์ ์ํ ์๊ฒฉ ์ฆ๋ช
์
๋๋ค.
- ์ฉ๋: Ingress์ ๊ฐ๋จํ ๋ก๊ทธ์ธ(์ ๊ทผ ์ ์ด) ๊ธฐ๋ฅ์ ๋ถ์ผ ๋ ์ฌ์ฉ
- ํ์ ํค:
username: ์ฌ์ฉ์ ์์ด๋password: ๋น๋ฐ๋ฒํธ
โค kubernetes.io/dockerconfigjson (์ด๋ฏธ์ง ํ ์ํฌ๋ฆฟ)
Private ์ปจํ
์ด๋ ๋ ์ง์คํธ๋ฆฌ์์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ ๋ ํ์ํ ๋ก๊ทธ์ธ ์ ๋ณด์
๋๋ค.
- ์ฉ๋: ํ๋ ์ค์ ์
imagePullSecrets ํญ๋ชฉ์ ์ฌ์ฉ - ํ์ ํค:
.dockerconfigjson
1
2
3
4
5
6
| # Docker Registry Secret ์์ฑ
kubectl create secret docker-registry my-registry-secret \
--docker-server=hyperregistry.example.com \
--docker-username=myuser \
--docker-password=mypassword \
-n default
|
1
2
3
4
5
6
7
| # ํ๋์์ ์ฌ์ฉ
spec:
imagePullSecrets:
- name: my-registry-secret
containers:
- name: app
image: hyperregistry.example.com/myapp:1.0
|
โฅ helm.sh/release.v1 (Helm ๋ฐฐํฌ ์ด๋ ฅ)
์ฟ ๋ฒ๋คํฐ์ค ํจํค์ง ๋งค๋์ ์ธ Helm์ด ๋ฐฐํฌ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ ์ฉ ์ํฌ๋ฆฟ์
๋๋ค.
- ์ฉ๋: Helm ์ฐจํธ์ ๋ฒ์ , values.yaml, ๋ฐฐํฌ ์ํ ๋ฑ์ ์ ์ฅ
- โ ๏ธ ์ฃผ์: ์ ๋ ์๋์ผ๋ก ์ญ์ ํ๊ฑฐ๋ ์์ ํ๋ฉด ์ ๋ฉ๋๋ค. Helm์ด ๋ฐฐํฌ๋ ์ฑ์ ์ธ์ํ์ง ๋ชปํ๊ฒ ๋ฉ๋๋ค.
- ํน์ง: ๋ฐ์ดํฐ๊ฐ ์์ถ๋์ด ์ ์ฅ๋ฉ๋๋ค.
๐ ํ์
์์ฝ ํ
์ด๋ธ
| ํ์
| ์ญํ (๋น์ ) | ์ฃผ์ Key | ๋น๊ณ |
|---|
| Opaque | ๋น ๋ดํฌ | (์ฌ์ฉ์ ์ ์) | ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋จ (Default) |
| kubernetes.io/tls | ์ ๋ถ์ฆ ์ธํธ | tls.crt, tls.key | ์ธ์ฆ์ ๋ง๋ฃ ๊ด๋ฆฌ ํ์ |
| kubernetes.io/service-account-token | ์ฌ์์ฆ | token, ca.crt | ํ๋ ๋ด๋ถ์ ์๋ ๋ง์ดํธ๋จ |
| kubernetes.io/basic-auth | ๋ก๊ทธ์ธ ๋ฉ๋ชจ | username, password | Ingress ์ธ์ฆ์ ์ฃผ๋ก ์ฌ์ฉ |
| kubernetes.io/dockerconfigjson | ์ฐฝ๊ณ ์ด์ | .dockerconfigjson | Private ์ด๋ฏธ์ง ๋ฐ์ ๋ ํ์ |
| helm.sh/release.v1 | ์ค์น ์ด๋ ฅ์ | (Helm ๋ด๋ถ ๋ฐ์ดํฐ) | ๊ฑด๋๋ฆฌ์ง ๋ง ๊ฒ ๐ซ |
๐ป ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
Secret ์์ฑ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # ๋ช
๋ น์ด๋ก ์์ฑ (Opaque)
kubectl create secret generic my-secret \
--from-literal=db-password=mysecretpassword \
--from-literal=api-key=abc123 \
-n default
# ํ์ผ๋ก๋ถํฐ ์์ฑ
kubectl create secret generic my-secret \
--from-file=config.json \
-n default
# YAML๋ก ์์ฑ (base64 ์ธ์ฝ๋ฉ ํ์)
echo -n 'mysecretpassword' | base64
# bXlzZWNyZXRwYXNzd29yZA==
|
1
2
3
4
5
6
7
8
9
| apiVersion: v1
kind: Secret
metadata:
name: my-secret
namespace: default
type: Opaque
data:
db-password: bXlzZWNyZXRwYXNzd29yZA== # base64 ์ธ์ฝ๋ฉ ๊ฐ
api-key: YWJjMTIz
|
Secret ์กฐํ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # Secret ๋ชฉ๋ก
kubectl get secret -n default
# Secret ์์ธ (์ธ์ฝ๋ฉ๋ ๊ฐ ํฌํจ)
kubectl get secret my-secret -n default -o yaml
# ํน์ ํค ๊ฐ ๋์ฝ๋ฉ
kubectl get secret my-secret -n default \
-o jsonpath='{.data.db-password}' | base64 -d
# ๋ชจ๋ ํค-๊ฐ ๋์ฝ๋ฉ
kubectl get secret my-secret -n default -o go-template='
{{range $k, $v := .data}}{{$k}}: {{$v | base64decode}}
{{end}}'
|
๐ ํ๋์์ Secret ์ฌ์ฉ
ํ๊ฒฝ ๋ณ์๋ก ์ฃผ์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
containers:
- name: app
image: myapp:1.0
env:
# ๋จ์ผ ํค ์ฃผ์
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: db-password
# Secret ์ ์ฒด ์ฃผ์
envFrom:
- secretRef:
name: my-secret
|
Volume์ผ๋ก ๋ง์ดํธ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| spec:
containers:
- name: app
image: myapp:1.0
volumeMounts:
- name: secret-volume
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: my-secret
# ํน์ ํค๋ง ๋ง์ดํธ
items:
- key: db-password
path: db-password.txt
|
1
2
3
| # ๋ง์ดํธ ํ์ธ
# /etc/secrets/db-password.txt ํ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅ
kubectl exec -it <pod-name> -- cat /etc/secrets/db-password.txt
|
โ ๏ธ ๋ณด์ ์ฃผ์์ฌํญ
1. Base64๋ ์ํธํ๊ฐ ์๋๋ค kubectl get secret -o yaml๋ก ์กฐํํ๋ฉด ๋๊ตฌ๋ ๋์ฝ๋ฉํ์ฌ ์๋ณธ์ ๋ณผ ์ ์์ต๋๋ค.
1
2
3
| # ๋๊ตฌ๋ ์ด๋ ๊ฒ ๋์ฝ๋ฉ ๊ฐ๋ฅ
echo "bXlzZWNyZXRwYXNzd29yZA==" | base64 -d
# mysecretpassword
|
2. RBAC ์ค์ ํ์ ์๋ฌด๋ Secret์ ์กฐํ(get, list, watch)ํ ์ ์๋๋ก Role์ ์๊ฒฉํ๊ฒ ์ ํํด์ผ ํฉ๋๋ค.
1
2
3
4
5
6
7
8
9
10
| # Secret ์กฐํ ๊ถํ์ ํน์ ServiceAccount์๋ง ๋ถ์ฌ
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["my-secret"] # ํน์ Secret๋ง ํ์ฉ
verbs: ["get"]
|
3. Git์ ์ฌ๋ฆฌ์ง ๋ง ๊ฒ Secret YAML ํ์ผ์ ๊ทธ๋๋ก GitHub์ ์ฌ๋ฆฌ๋ฉด ์ ์ถ ์ฌ๊ณ ๊ฐ ๋ฐ์ํฉ๋๋ค. Sealed Secrets๋ External Secrets ๊ฐ์ ๋๊ตฌ ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.
1
2
3
| # .gitignore์ ์ถ๊ฐ
*-secret.yaml
*-secrets.yaml
|
๐ ๊ด๋ จ ๋ฌธ์
Comments powered by Disqus.