# 11์ฅ ์ํฌ๋ฆฟ
Assembled by GimunLee
# ์ํฌ๋ฆฟ ๊ฐ๋
- ์ํฌ๋ฆฟ์ ๋น๋ฐ๋ฒํธ, OAuth ํ ๊ทผ, SSH ํค ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ค์ ์ ์ฅํ๋ ์ฉ๋๋ก ์ฌ์ฉ
- ์ํฌ๋ฆฟ์ ์ปจํ ์ด๋ ์์ ์ ์ฅํ์ง ์๊ณ ๋ณ๋ ๋ณด๊ดํ๋ค๊ฐ ์ค์ ํ๋๋ฅผ ์คํํ ๋์ ํ ํ๋ฆฟ์ผ๋ก ์ปจํ ์ด๋ ์ ๊ณต
- ์ํฌ๋ฆฟ์ ๋ด์ฅ ์ํฌ๋ฆฟ๊ณผ ์ฌ์ฉ์ ์ ์ ์ํฌ๋ฆฟ์ผ๋ก ๊ตฌ๋ถ
- ๋ด์ฅ ์ํฌ๋ฆฟ: ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์์์ ์ฟ ๋ฒ๋คํฐ์ค API์ ์ ๊ทผํ ๋ ์ฌ์ฉ, ํด๋ฌ์คํฐ ์์์ ์ฌ์ฉํ๋ ServiceAccount๋ผ๋ ๊ณ์ ์ ์์ฑํ๋ฉด ์๋์ผ๋ก ๊ด๋ จ ์ํฌ๋ฆฟ ์์ฑํ๊ณ ์ด ์ํฌ๋ฆฟ์ผ๋ก ํ์ฉ๋ API์ ์ ๊ทผ ๊ฐ๋ฅ
- ์ฌ์ฉ์ ์ ์ ์ํฌ๋ฆฟ: ์ฌ์ฉ์๊ฐ ๋ง๋ ์ํฌ๋ฆฟ
# ๋ช ๋ น์ผ๋ก ์ํฌ๋ฆฟ ๋ง๋ค๊ธฐ
์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ค์ ํ๋ ํ์ผ ์์ฑ
$ echo -n 'username' > ./username.txt $ echo -n 'password' > ./password.txt
์ํฌ๋ฆฟ ์์ฑ // ์๋์ผ๋ก base64 ๋ฌธ์ ์ธ์ฝ๋ฉ
$ kubectl create secret generic user-pass-secret --from-file=./username.txt
์์ฑํ ์ํฌ๋ฆฟ ํ์ธ
$ kubectl get secret user-pass-secret -o yaml
๋์ฝ๋ฉํด์ ํ์ธ
$ echo {์ธ์ฝ๋ฉ๋๊ฐ} | base64 --decode
# ํ ํ๋ฆฟ์ผ๋ก ์ํฌ๋ฆฟ ๋ง๋ค๊ธฐ
apiVersion: v1
kind: Secret
metadata:
name: user-pass-yaml
type: Opaque # ๊ธฐ๋ณธ๊ฐ
data:
username: dXNlcm5hbWU=
password: cGFzc3dvcmQ=
- ์ํฌ๋ฆฟ ํ์
- Opaque: ๊ธฐ๋ณธ๊ฐ์ผ๋ก ํค-๊ฐ ํ์์ผ๋ก ์์์ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ ์ ์์
- kubernetes.io/service-account-token: ์ฟ ๋ฒ๋คํฐ์ค ์ธ์ฆ ํ ํฐ์ ์ ์ฅํจ
- kubernetes.io/dockerconfigjson: ๋์ปค ์ ์ฅ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํจ
- kubernetes.io/tls: TLS ์ธ์ฆ์๋ฅผ ์ ์ฅํจ
# ์ํฌ๋ฆฟ ์ฌ์ฉํ๊ธฐ
# ํ๋์ ํ๊ฒฝ ๋ณ์๋ก ์ํฌ๋ฆฟ ์ฌ์ฉํ๊ธฐ
apiVersion: apps/v1
kind: Deployment
metadata:
name: secretapp
labels:
app: secretapp
spec:
replicas: 1
selector:
matchLabels:
app: secretapp
template:
metadata:
labels:
app: secretapp
spec:
containers:
- name: testapp
image: arisu1000/simple-container-app:latest
ports:
- containerPort: 8080
env:
- name: SECRET_USERNAME # ํ๊ฒฝ ๋ณ์ ์ด๋ฆ ์ค์
valueFrom:
secretKeyRef:
name: user-pass-yaml # ์ํฌ๋ฆฟ์ ์ด๋ฆ
key: username # ํค ๊ฐ
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: user-pass-yaml
key: password
---
apiVersion: v1
kind: Service
metadata:
labels:
app: secretapp
name: secretapp-svc
namespace: default
spec:
ports:
- nodePort: 30900
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: secretapp
type: NodePort
# ๋ณผ๋ฅจ ํ์์ผ๋ก ํ๋์ ์ํฌ๋ฆฟ ์ ๊ณตํ๊ธฐ
apiVersion: apps/v1
kind: Deployment
metadata:
name: secretapp
labels:
app: secretapp
spec:
replicas: 1
selector:
matchLabels:
app: secretapp
template:
metadata:
labels:
app: secretapp
spec:
containers:
- name: testapp
image: arisu1000/simple-container-app:latest
ports:
- containerPort: 8080
volumeMounts:
- name: volume-secret
mountPath: "/etc/volume-secret" # ์ํฌ๋ฆฟ ์ค์ ๋ด์ฉ์ ํ์ผ ํํ๋ก ์ ์ฅ
readOnly: true # ๋ณผ๋ฅจ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ฌ์ฉ
volumes:
- name: volume-secret
secret:
secretName: user-pass-yaml # ํ๋ ๊ฐ ์ค์
---
apiVersion: v1
kind: Service
metadata:
labels:
app: secretapp
name: secretapp-svc
namespace: default
spec:
ports:
- nodePort: 30900
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: secretapp
type: NodePort
# ํ๋ผ์ด๋น ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ํฌ๋ฆฟ ์ฌ์ฉํ๊ธฐ
- ๋ณดํต ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ ๋๋ถ๋ถ ๊ณต๊ฐ๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉ
- ํ๋ผ์ด๋น ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ธ์ฆ ์ ๋ณด๊ฐ ํ์ํ๋ฐ ์ด ์ธ์ฆ ์ ๋ณด๋ฅผ ์ํฌ๋ฆฟ์ ์ค์ ํด ์ ์ฅํ ํ ์ฌ์ฉ
# ์ํฌ๋ฆฟ์ผ๋ก TLS ์ธ์ฆ์๋ฅผ ์ ์ฅํด ์ฌ์ฉํ๊ธฐ
- HTTPS ์ธ์ฆ์๋ฅผ ์ ์ฅํ๋ ์ฉ๋๋ก ์ํฌ๋ฆฟ ์ฌ์ฉ ๊ฐ๋ฅ
$ kubectl create secret tls tlssecret --key tls.key --cert tls.crt
# ์ํฌ๋ฆฟ ๋ฐ์ดํฐ ์ฉ๋ ์ ํ
์ํฌ๋ฆฟ ๋ฐ์ดํฐ๋ etcd์ ์ํธํํ์ง ์์ ํ ์คํธ๋ก ์ ์ฅ๋๋๋ฐ, ์ด๋ ์ํฌ๋ฆฟ ๋ฐ์ดํฐ์ ์ฉ๋์ด ๋๋ฌด ํฌ๋ฉด ์ฟ ๋ฒ๋คํฐ์ค์ kube-apiserver๋ kubelet์ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ๋ง์ด ์ฐจ์ง. ๊ฐ๋ณ ์ํฌ๋ฆฟ ๋ฐ์ดํฐ์ ์ต๋ ์ฉ๋์ 1MB
๋๊ตฐ๊ฐ etcd์ ์ง์ ์ ๊ทผํ๋ค๋ฉด ์ํฌ๋ฆฟ ๋ฐ์ดํฐ์ ๋ด์ฉ๋ฟ ์๋๋ผ ๋ค๋ฅธ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ํ์ธ ๊ฐ๋ฅ
์ค์ํ ์๋น์ค์ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฌ์ฉ ์ค์ด๋ผ๋ฉด etcd ์ ๊ทผ์ ์ ํํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก etcd๋ฅผ ์คํํ ๋ etcd ๊ด๋ จ ๋ช ๋ น์ ์ฌ์ฉํ๋ API ํต์ ์ TLS ์ธ์ฆ์ด ์ ์ฉ๋์ด ์์ผ๋ฏ๋ก ์ธ์ฆ์๊ฐ ์๋ ์ฌ์ฉ์๋ง etcd์ ์ ๊ทผํด ๊ด๋ จ ๋ช ๋ น์ ์ฌ์ฉํ ์ ์์
๊ทธ ์ธ์ etcd๊ฐ ์คํ ์ค์ธ ๋ง์คํฐ ์์ฒด์ ์ง์ ์ ์ํด์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๊ฒ์ ๋ง์ผ๋ ค๊ณ ๋ง์คํฐ์ ์ ๊ทผํ ์ ์๋ ์ฌ์ฉ์๋ค์ ๊ณ์ ๊ธฐ๋ฐ์ด๋ IP ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด ๋ฑ์ฌ ์ ํํ๋ ๋ฐฉ๋ฒ ์กด์ฌ
etcd์ ์ ์ฅ๋๋ ์ํฌ๋ฆฟ ๋ฐ์ดํฐ ์ํธํ ๊ฐ๋ฅ
# Referenses
- ์ฟ ๋ฒ๋คํฐ์ค ์ ๋ฌธ - 90๊ฐ์ง ์์ ๋ก ๋ฐฐ์ฐ๋ ์ปจํ ์ด๋ ๊ด๋ฆฌ ์๋ํ ํ์ค / ๋์๋ถ์ค