๋ชฉ์ฐจ
ย Serviceย Account
์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋ ๊ฐ์ง ์ฃผ์ ๊ณ์ ์ ํ์ด ์๋ค: ์ฌ์ฉ์ ๊ณ์ ๊ณผ ์๋น์ค ๊ณ์ ์ด๋ค.
โข
User Account: ์ฌ๋(๊ด๋ฆฌ์, ๊ฐ๋ฐ์ ๋ฑ)์ด ํด๋ฌ์คํฐ์ ์ ๊ทผํ์ฌ ๊ด๋ฆฌ ์์
์ด๋ ์ฑ ๋ฐฐํฌ๋ฅผ ์ํํ ๋ ์ฌ์ฉ
โข
Service Account: Machine(์ ํ๋ฆฌ์ผ์ด์
)์ด ํด๋ฌ์คํฐ์ ์ํธ์์ฉํ ๋ ์ฌ์ฉ
โฆ
Prometheus, Jenkins ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ด Service Account๋ฅผ ํตํด Kubernetes API์ ์ ๊ทผ
My Kubernetes Dashboard ๋ผ๋ ๋์๋ณด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ์์ ๋, ํด๋ฌ์คํฐ์ ํ๋ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ Kubernetes API์ ์์ฒญ์ ๋ณด๋ด์ผ ํ๋ค.
ย Service Account Token
Kubernetes API๋ฅผ ์ฟผ๋ฆฌ์ Service Account์ด ํ์ํ๋ฉฐ, ๊ทธ์ ๋ํ ์ธ์ฆ์ผ๋ก Token์ด ํ์ํ๋ค. ์ฐธ๊ณ ๋ก ์ด ํ ํฐ์ JWT ํ ํฐ์ด๋ค.
v1.24 ๋ฒ์ ์ด์ ์๋ ์๋น์ค ๊ณ์ ์ด ์์ฑ๋๋ฉด, ๊ทธ์ ๋ํ ํ ํฐ์ด Sercret์ผ๋ก ์๋์์ฑ๋์๋ค. ํ์ง๋ง ์ดํ ๋ฒ์ ๋ถํฐ๋ ์๋์ผ๋ก ์์ฑ๋์ง ์๋๋ค.
# Service Account ์์ฑ
kubectl create serviceaccount <Service Account>
# Service Account Token ์์ฑ
kubectl create token <Service Account>
Bash
๋ณต์ฌ
๋ง๋ฃ ์๊ฐ์ ์ค์ ํ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ 1์๊ฐ์ ๋ง๋ฃ์๊ฐ์ ๊ฐ์ง๋ค. ๋ฐ๋ผ์ ์ ์ฝ๋๋ ํ ์๊ฐ์ ๋ง๋ฃ ์๊ฐ์ ๊ฐ๋ ์ฝ๋๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ด๋ค.
์ ์ฝ๋๋ ์ผํ์ฑ์ผ๋ก ์ป์ ์ ์๊ณ ๋ง๋ฃ์๊ฐ์ด ์๋ ํ ํฐ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ฑฐ๋ ์๋ ๊ฐฑ์ ๋๋ ํ ํฐ์ ์ป์ด์ผ ํ๋ค. ์ฟ ๋ฒ๋คํฐ์ค์์ ์ง์ํ๋ ์๋น์ค ๊ณ์ ํ ํฐ ๋ฐ๊ธ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค:
โข
TokenRequest API (recommended)
โฆ
์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ ๋ด์์ API๋ฅผ ํตํด ํ ํฐ์ ์์ฒญํ๋ ๋ฐฉ์
โฆ
ํ ํฐ์ ๋ง๋ฃ ์๊ฐ์ ๊ฐ์ง๋ฉฐ, ์๋์ผ๋ก ๊ฐฑ์ ๊ฐ๋ฅ
โข
Token Volume Projection (recommended)
โฆ
kubelet์๊ฒ projected volume์ผ๋ก ํ ํฐ์ Pod์ ์ถ๊ฐํ๋ผ๊ณ ์ง์
โฆ
ํ ํฐ์ ๋ง๋ฃ ์๊ฐ์ ๊ฐ์ง๋ฉฐ, ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์๋์ผ๋ก ๊ฐฑ์
โข
Service Account Token Secrets (not recommended)
โฆ
ํ ํฐ์ secret์ ๋ง์ดํธํ์ฌ ์ฌ์ฉ
โฆ
ํ ํฐ์ ๋ง๋ฃ ์๊ฐ์ด ์์ผ๋ฉฐ, ์๊ตฌ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
โฆ
TokenRequest API๋ก ํ ํฐ์ด ์์ฑ๋์ง ์์ ๋๋ง ์ฌ์ฉ ๊ถ์ฅ
ย Service Account Token Secrets
v1.24 ๋ฒ์ ๋ถํฐ๋ ์๋น์ค ๊ณ์ ์ด ์ํฌ๋ฆฟ์ผ๋ก ํ ํฐ์ ๊ฐ์ง๊ณ ์์ง ์๋ค. ์ด์ ๊ณผ ๊ฐ์ ์๋น์ค ๊ณ์ ์ ๋ง๋๋ ค๋ฉด ์๋์ผ๋ก ์ํฌ๋ฆฟ์ ์์ฑํด์ฃผ์ด์ผ ํ๋ค. ์ด ๋ฐฉ์์ ์ฟ ๋ฒ๋คํฐ์ค์์ ๊ถ์ฅํ์ง ์์ผ๋ฉฐ, ํด๋น ๋ฐฉ์์ผ๋ก ์์ฑ๋ ํ ํฐ์ ๋ง๋ฃ ์๊ฐ์ด ์๋ค.
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: dashboard-sa-token
annotations:
kubernetes.io/service-account.name: dashboard-sa # Service Account ์ง์
YAML
๋ณต์ฌ
kubernetes.io/service-account.name ์ด๋ annotations๋ฅผ ์ฌ์ฉ๋๋ฐ, ์ด annotations์ imperative ๋ฐฉ์์ผ๋ก๋ ์์ฑ์ด ๋ถ๊ฐ๋ฅํ ๋ฏํ๋ค.
์ดํ ์์ฑ๋ Secret์์ ํ ํฐ์ ํ์ธํ ์ ์๋ค.
kubectl describe secret dashboard-sa-token
Bash
๋ณต์ฌ
ย TokenRequest API
TokenRequest API๋ ํด๋ฌ์คํฐ ๋ด์์ ํน์ Service Account์ ๋ํ ํ ํฐ์ ์์ฒญํ๋ ๊ธฐ๋ฅ์ด๋ค.
JWT๋ Audience, Time์ ๊ตฌ์ ๋ฐ์ง ์์ผ๋ฉฐ, ๊ฐ JWT๋ Service Account๋ง๋ค ๋ณ๋์ Secret ๊ฐ์ฒด๋ฅผ ํ์๋ก ํ๋ค. ์ด๋ก ์ธํด JWT์ ์๊ตฌ์ฑ์ผ๋ก ์ธํ ๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค. Kubernetes v1.22 ๋ถํฐ TokenRequest API๊ฐ ๋์
๋์ด ์งง์ ์๋ช
์ ํ ํฐ์ ์์ฑํ๋๋ก ํ๋ค. TokenRequest API๊ฐ ๊ฐ๋ ํน์ฑ์ ๋ค์๊ณผ ๊ฐ๋ค:
โข
Audience Bound: ํน์ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ ์ ํ
โข
Time Bound: ์งง์ ์๋ช
์ผ๋ก ์ค์ ๋์ด ์๋์ผ๋ก ๋ง๋ฃ
โข
Object Bound: ํน์ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋์ด ์ฌ์ฉ
์ด๋ก์จ Token์ ๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์์ก๋ค.
ย Token Volume Projection
์๋น์ค ํ ํฐ ์ํฌ๋ฆฟ์ Pod ๋ด์ ๋ณผ๋ฅจ์ผ๋ก ๋ง์ดํธ์ํค๋ ๋ฐฉ์์ด๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์ ํ ํฐ์ ํ๊ฒฝ ๋ณ์๋ก ์
๋ ฅํ๊ฑฐ๋ ์ง์ API ํธ์ถ์ ํ ํ์ ์์ด, Pod ๋ด์์ ์ฝ๊ฒ ์ฝ์ด ๋ค์ผ ์ ์๋ค.
๊ธฐ์กด์๋ ์๋น์ค ๊ณ์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ์ธ Secret Token์ด Pod์ ๋ง์ดํธ๋์์ง๋ง, Kubernetes v1.22 ๋ถํฐ TokenRequest API๊ฐ ๋์
๋จ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ํ ํฐ์ ์์ฑํ๋ค. ์ด ํ ํฐ์ Projected Volume์ผ๋ก ๋ง์ดํธ๋์ด ์๋ ๋ง๋ฃ ๋ฐ ๊ฐฑ์ ์ ํ๋ค.
ย VolumeMount
apiVersion: v1
kind: Pod
metadata:
name: my-kubernetes-dashboard
spec:
containers:
- name: my-kubernetes-dashboard
image: my-kubernetes-dashboard
serviceAccountName: dashboard-sa # ์ฌ์ฉํ Service Account ์ง์
YAML
๋ณต์ฌ
Pod์ Service Account๋ ์์ฑํ ๋๋ง ์ง์ ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ์์ ์ด ํ์ํ๋ค๋ฉด Pod๋ฅผ ์ฌ์์ฑํด์ผ ํ๋ค.
ย View Token
ํ ํฐ์ ์์น๋ /var/run/secrets/kubernetes.io/serviceaccount์ ๋ง์ดํธ๋๋ฉฐ, ํด๋น ๋๋ ํ ๋ฆฌ์๋ ca.crt, namespace, token ์ด 3๊ฐ์ ๋ณ๊ฐ ํ์ผ๋ก Secret์ด ๋ง์ดํธ๋๋ค. ์ค์ ํ ํฐ์ ๊ฐ์ง ๊ฒ์ token ํ์ผ์ด๋ค.
kubectl exec -it my-kubernetes-dashboard cat /var/run/secrets/kubernetes.io/serviceaccount/token
Bash
๋ณต์ฌ
ย Auto Mount
spec.serviceAccountName์ ๋ช
์ํ์ง ์์ ๊ฒฝ์ฐ์๋ default ์๋น์ค ๊ณ์ ์ด ๋ง์ดํธ๋๋ค. ์๋์ผ๋ก ์๋น์ค ๊ณ์ ์ ๋ง์ดํธํ๋ ๊ฒ์ ์์น ์์ ๊ฒฝ์ฐ์๋ spec.automountServiceAccountToken: false ๋ฅผ ์ถ๊ฐํ๋ค.
apiVersion: v1
kind: Pod
metadata:
name: my-kubernetes-dashboard
spec:
containers:
- name: my-kubernetes-dashboard
image: my-kubernetes-dashboard
automountServiceAccountToken: false # ์๋ ๋ง์ดํธ ๋นํ์ฑํ
YAML
๋ณต์ฌ