๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Container/Kubernetes

[Kubernetes] k8s์—์„œ์˜ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ดํ•˜๊ธฐ: SA์™€ RBAC

๋ฐ˜์‘ํ˜•

๐Ÿ”Š ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ์‹œ์ž‘ํ•˜์„ธ์š”! ๋„์ปค/์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ์ ์„ ์ฝ๊ณ  ๊ฐœ์ธ์ ์ธ ๋ชฉ์  ํ•˜์— ์ž‘์„ฑ๋˜๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค. ํฌ์ŠคํŒ…์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ž๋ฃŒ๋Š” ์ œ๊ฐ€ ์ง์ ‘ ์žฌ๊ตฌ์„ฑํ•˜์˜€์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
 

Kubernetes


์ผ๋ฐ˜์ ์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์€ ํ•œ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์šด์˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†๋‹ค. ๋Œ€๋ถ€๋ถ„ ์—ฌ๋Ÿฌ ๋ช…์˜ DevOps ๊ฐœ๋ฐœ์ž ๋˜๋Š” ์—ฌ๋Ÿฌ ๋ช…์˜ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž, MLOps ๊ฐœ๋ฐœ์ž ๋“ฑ ์ธํ”„๋ผ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋“ค์ด ๋™์ผํ•œ ๋ฒ”์œ„์˜ ๊ถŒํ•œ์œผ๋กœ k8s ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ œ์–ดํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ์šด์˜์ฒด์ œ๊ฐ€ ์œ ์ € ๋ณ„๋กœ ๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Š” ํŒŒ์ผ์— ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋‹ค๋ฅด๊ฒŒ ๋ถ€์—ฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋„ ์œ ์ € ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณ„๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ์–ดํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ RBAC(Role Based Access Control)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์„œ๋น„์Šค ์–ด์นด์šดํŠธ(Service Account)๋ผ๋Š” ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ, ๊ทธ๋ฆฌ๊ณ  RBAC์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋กค, ํด๋Ÿฌ์Šคํ„ฐ ๋กค ์ด๋ผ๋Š” ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด์„œ๋„ ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜์ž.

1. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” ๊ถŒํ•œ ์ธ์ฆ์„ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

์ด์ „ ๋ชฉ์ฐจ์—์„œ ResourceQuota ๋ผ๋Š” ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐฐ์›€์œผ๋กœ์จ ๊ฐ„๋‹จํ•˜๊ฒŒ๋‚˜๋งˆ ์‚ฌ์šฉ์ž๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋กœ ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ, ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ๊ณผ์ •์ด ์ˆ˜ํ–‰๋˜๋Š”์ง€ ์‚ดํŽด๋ณด์•˜์—ˆ๋‹ค. ๊ทธ๋•Œ ์‚ดํŽด๋ณธ ๊ทธ๋ฆผ์„ ๋‹ค์‹œ ๊ฐ€์ ธ์™€๋ณด์ž. ๋‹น์‹œ์—๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ Mutating Admission Controller, Validating Adminssion Controller ๋‹จ๊ณ„์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ์—ˆ๋‹ค.

 

์‚ฌ์šฉ์ž๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค๋ฉด?

 

์ด๋ฒˆ์— ์šฐ๋ฆฌ๊ฐ€ ์‚ดํŽด๋ณผ ๋ถ€๋ถ„์€ Authentication(์ธ์ฆ)๊ณผ Authorization(์ธ๊ฐ€)์ด๋‹ค. Authentication์€ ์š”์ฒญ์„ ๋ณด๋‚ธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋งž๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ๋ฐ˜๋ฉด์— Authorization ๋ถ€๋ถ„์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญํ•œ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•  ๊ถŒํ•œ์ด ๊ทธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

 

์ผ๋ก€๋กœ, ์–ด๋–ค ํด๋ผ์ด์–ธํŠธ๊ฐ€ kube-system ์ด๋ผ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ํŒŒ๋“œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์š”์ฒญ์„ ๋ณด๋ƒˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์ด ํด๋ผ์ด์–ธํŠธ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‚ฌ์šฉ์ž์ž„์€ ๋งž์•„์„œ Authentication ๋‹จ๊ณ„๊ฐ€ ํ†ต๊ณผ๊ฐ€ ๋˜์—ˆ์ง€๋งŒ ํŒŒ๋“œ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ๊ถŒํ•œ์ด ์—†๋‹ค๋ฉด ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ๋Š” 403 ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์„ ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ์ธ์ฆ๊ณผ ์ธ๊ฐ€์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์„œ๋“œํŒŒํ‹ฐ ์ธ์ฆ(OIDC, Open ID Connect: OAuth), ์ธ์ฆ์„œ ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

2. ๊ธฐ๋ณธ์ ์ธ ์ธ์ฆ, ์ธ๊ฐ€ ๋ฐฉ๋ฒ•: kubeconfig ํ™œ์šฉํ•˜๊ธฐ!

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ€์žฅ ์ฒ˜์Œ ์‹œ๋„ํ•˜๋Š” ๋ฐฉ์‹์€ kubectl CLI๋ฅผ ์ˆ˜ํ–‰ํ•ด์„œ ์ ‘๊ทผํ•  ๊ฒƒ์ด๋‹ค. kubectl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ .kube ๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์˜ config ํŒŒ์ผ(.kube/config)์— ์ €์žฅ๋œ ์„ค์ •์„ ์ฝ์–ด๋“ค์—ฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ์€ ๋ณดํ†ต ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์˜ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„ ~/.kube/config ๊ฒฝ๋กœ์— ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ config ํŒŒ์ผ์„ ๋ฐ”๋กœ kubeconfig ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

ํ•ด๋‹น ํŒŒ์ผ์„ ์—ด์–ด๋ณด๋ฉด ํฌ๊ฒŒ clusters, contexts, users ํ•ญ๋ชฉ์ด ๋“ค์–ด์žˆ๊ณ , ๊ฐ ํ•ญ๋ชฉ๋“ค์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฐ’๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.(YAML์˜ array) ์˜ˆ์‹œ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

์ถœ์ฒ˜: https://www.nathannellans.com/post/kubernetes-using-kubectl-with-kubeconfig-files

 

์œ„ config ํŒŒ์ผ ๋‚ด์šฉ์„ ๋ณด๋ฉด users ๋ผ๋Š” ํ•ญ๋ชฉ์—๋Š” ์ธ์ฆ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ๋ณด๋ฉด client-certificate ์™€ client-key์— ์„ค์ •๋œ ๊ฒฝ๋กœ์— ํŒŒ์ผ์€ bsas64๋กœ ์ธ์ฝ”๋”ฉ๋œ ์ธ์ฆ์„œ(๊ณต๊ฐœํ‚ค์™€ ๋น„๋ฐ€ํ‚ค)์ด๋ฉฐ, ์ด ํ‚ค ์Œ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์ตœ๊ณ  ๊ถŒํ•œ(cluster-admin) ๊ถŒํ•œ์„ ๊ฐ–๊ฒŒ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  clusters ํ•ญ๋ชฉ์—๋Š” ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ config ํŒŒ์ผ๊ณผ ์ธ์ฆ์„œ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋กœ๋ถ€ํ„ฐ ์ธ์ฆ์„ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์€ ์ ˆ์ฐจ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ์‹์€ ๋ฐ”๋กœ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

3. ๋˜ ๋‹ค๋ฅธ ์ธ์ฆ, ์ธ๊ฐ€ ๋ฐฉ๋ฒ• : ServiceAccount ํ™œ์šฉํ•˜๊ธฐ

์ด๋ฒˆ์—” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ, ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด kube-apiserver๋กœ๋ถ€ํ„ฐ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ธ์ฆ, ์ธ๊ฐ€ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ธ ServiceAccount(์ดํ•˜ SA)๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด์ž. SA๋Š” ํ•œ ๋ช…์˜ ์‚ฌ์šฉ์ž ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•ด๋‹นํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. SA๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ข…์†์ ์ธ ์˜ค๋ธŒ์ ํŠธ์ด๋ฉฐ serviceaccount ๋˜๋Š” sa ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฐธ๊ณ ๋กœ kubectl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํŠน์ • SA๋ฅผ ์‚ฌ์šฉํ•ด์„œ kube-apiserver๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ(์ด๋ฅผ Impersonate ๋ผ๊ณ  ๋ถ€๋ฆ„), ์‚ฌ์šฉ ๋ช…๋ น์–ด ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

kubectl get pods --as system:serviceaccount:$NAMESPACE:$SA_NAME

 

๊ทธ๋Ÿฐ๋ฐ SA ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๊ธฐ์กด์— ์ด์šฉํ•˜๊ณ  ์žˆ๋˜ SA๋ฅผ ์ด์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ด๊ฒŒ ๋์ผ๊นŒ? ์•„๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” SA๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด kube-apiserver๋กœ๋ถ€ํ„ฐ ์ธ์ฆ, ์ธ๊ฐ€๋ฅผ ๋ฐ›์•„์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  SA์— ์–ด๋–ค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ• ์ง€๋ฅผ ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

 

์ด๋ฅผ ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด ๋จผ์ € ํฐ ๊ทธ๋ฆผ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž. ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด SA์— ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด SA ๋ง๊ณ ๋„ ๋กค(Role)๊ณผ ๋กค๋ฐ”์ธ๋”ฉ(RoleBinding)์ด๋ผ๋Š” ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. SA, ๋กค, ๋กค๋ฐ”์ธ๋”ฉ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

SA, Role, RoleBinding ๊ฐ„์˜ ๊ด€๊ณ„

 

์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๋‹ค. ์ •๋ฆฌํ•˜๋ฉด SA์—๋Š” ๊ณ„์ •์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ช…์‹œ, (SA๊ฐ€ ์‚ฌ์šฉํ• )๊ถŒํ•œ๋“ค์€ Role์— ๋ช…์‹œ, ๊ทธ Role์„ ์–ด๋–ค SA์—๋‹ค๊ฐ€ ์—ฐ๊ฒฐ(๋ฐ”์ธ๋”ฉ)ํ•ด์ค„์ง€๋Š” RoleBinding์— ๋ช…์‹œํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์™œ ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€๋กœ ๊ฐ๊ฐ ๋ถ„๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์„๊นŒ? ๊ทธ๋ƒฅ SA์— ํ•˜๋‚˜์— Role, RoleBinding์„ ๋‹ค ๋ช…์‹œํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€? ์‹ถ๊ธฐ๋„ ํ•˜๋‹ค. ์‚ฌ๊ฒฌ์ด์ง€๋งŒ, ํ•˜๋‚˜์˜ ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ์—๋Š” ์ตœ์†Œ์˜ ๊ธฐ๋Šฅ๋งŒ ํฌํ•จ์‹œ์ผœ SA, Role, RoleBinind๋“ค์ด ์„œ๋กœ ๊ฐ„์— 1:1 ๊ด€๊ณ„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, 1:N, N:N ๊ด€๊ณ„๋„ ๋งบ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๊ณ  ํ•œ ๊ฒƒ์ด ๋ชฉ์ ์ด์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.

 

์ฐธ๊ณ ๋กœ Role๊ณผ RoleBinding์˜ ํŒŒ์ƒํ’ˆ์œผ๋กœ ClusterRole๊ณผ ClusterRoleBinding์ด ์กด์žฌํ•œ๋‹ค. ์ด๋ฆ„์—์„œ๋„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋‹ค์‹œํ”ผ ClusterRole๊ณผ ClusterRoleBinding๋Š” 'ํด๋Ÿฌ์Šคํ„ฐ'๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํด๋Ÿฌ์Šคํ„ฐ ๋‹จ์œ„์˜ ๊ถŒํ•œ์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ผ๋ก€๋กœ, PV(Persistent Volume)์˜ ๊ฒฝ์šฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ข…์†์ ์ธ ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ PV ๊ด€๋ จ ๊ถŒํ•œ์„ ์„ค์ •ํ•ด์ฃผ๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ClusterRole๊ณผ ClusterRoleBinding์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ClusterRole๊ณผ ClusterRoleBinding์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ข…์†์ ์ธ ํŒŒ๋“œ๋‚˜ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์„ค์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋ณดํ†ต ์—ฌ๋Ÿฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ถŒํ•œ์„ ํด๋Ÿฌ์Šคํ„ฐ ๋กค๋กœ ๋งŒ๋“ค์–ด ์žฌ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

3-1. SA์— ๋ถ€์—ฌํ•  ๊ถŒํ•œ์„ ์ •์˜ํ•˜์ž: Role, ClusterRole

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ SA์— ๋ถ€์—ฌํ•  ๊ถŒํ•œ์„ ์ •์˜ํ•˜๋Š” Role๊ณผ ClusterRole ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์˜ˆ์‹œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์‚ดํŽด๋ณด์ž. ๋จผ์ € Role์ด๋‹ค.

 

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: zedd-default
  name: service-reader-role
rules:
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["get", "list"]

 

์ง์ „์— ์–ธ๊ธ‰ํ–ˆ๋‹ค์‹œํ”ผ Role์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ข…์†์ ์ธ ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— metadata.namespace ํ•ญ๋ชฉ์— ํ•ด๋‹น Role์ด ์†ํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ช…์‹œํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  rules ํ•ญ๋ชฉ์— 3๊ฐ€์ง€ ํ•ญ๋ชฉ์„ ์ •์˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

  • apiGroups: ์–ด๋– ํ•œ API ๊ทธ๋ฃน์— ์†ํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ๊ถŒํ•œ์„ ์ง€์ •ํ• ์ง€๋ฅผ ์„ค์ •ํ•จ. ์ด API ๊ทธ๋ฃน์ด๋ผ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ์ด์ „ CRD ํฌ์ŠคํŒ…์—์„œ ์‚ดํŽด๋ณธ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐœ๋…์ž„. ์œ„ ์˜ˆ์‹œ์—์„œ services ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ์˜ ๊ฒฝ์šฐ, ์ฝ”์–ด API ๊ทธ๋ฃน์— ์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์— "" ๋กœ ๋ช…์‹œํ–ˆ์Œ. ์–ด๋–ค ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋“ค์ด ์–ด๋–ค API ๊ทธ๋ฃน์— ์†ํ•˜๋Š”์ง€ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด kubectl api-resources ๋ช…๋ น์–ด๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • resources: ์–ด๋– ํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์ •์˜ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๋ช…์‹œ. ์ด ๋˜ํ•œ kubectl api-resources ๋ช…๋ น์–ด๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • verbs: ์ด ๋กค์„ ๋ถ€์—ฌ๋ฐ›์€ SA๊ฐ€ ๋ช…์‹œํ•œ resources์— ๋Œ€ํ•ด์„œ ์–ด๋–ค ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„์ง€ ๋ช…์‹œ. ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” get, list๋ฅผ ๋ช…์‹œ. ์ฐธ๊ณ ๋กœ ์ด ํ•ญ๋ชฉ์—๋Š” ์™€์ผ๋“œ์นด๋“œ(*)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ๋„ ์žˆ๊ณ  ํŠน์ • ๋ฆฌ์†Œ์Šค์— ํ•œ์ •๋œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ ์„œ๋ธŒ ๋ฆฌ์†Œ์Šค(ex. pods/exec)๋ฅผ ๋ช…์‹œํ•  ์ˆ˜๋„ ์žˆ์Œ

๋‹ค์Œ์€ ClusterRole ๋งค๋‹ˆํŽ˜์ŠคํŠธ์ด๋‹ค.

 

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nodes-reader-cluster-role
rules:
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["get", "list"]

 

๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋‚ด์šฉ์€ Role๊ณผ ๊ฑฐ์˜ ๋น„์Šทํ•˜๋‹ค. ๋‹ค๋งŒ, ClusterRole์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ข…์†์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— metadata.namespace ํ•ญ๋ชฉ์ด ์—†๋Š” ๊ฒƒ์ด ์ฐจ์ด์ ์ด๋‹ค.

 

ํด๋Ÿฌ์Šคํ„ฐ ๋กค์˜ ์ถ”๊ฐ€์ ์ธ ๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜๋งŒ ๋” ์‚ดํŽด๋ณด์ž. ํด๋Ÿฌ์Šคํ„ฐ ๋กค์€ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ฆ‰, ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋กค์ด ์žˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ ๋กค์— ํฌํ•จ์‹œ์ผœ์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ 'ํด๋Ÿฌ์Šคํ„ฐ ๋กค aggregation'์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ํ•˜๋‚˜ ์‚ดํŽด๋ณด์ž.

 

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: parent-cluster-role
  labels:
    rbac.authorization.k8s.io/aggregate-to-child-clusterrole: "true"
rules:
  - verbs: ["get", "list"]
    resources: ["nodes"]
    apiGroups: [""]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: child-cluster-role
aggregationRule:
  clusterRoleSelectors:
    - matchLabels:
        rbac.authorization.k8s.io/aggregate-to-child-clusterrole: "true"
rules: []

 

๋จผ์ € parent-cluster-role ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํด๋Ÿฌ์Šคํ„ฐ ๋กค์„ ์ •์˜ํ–ˆ๋Š”๋ฐ, metadata์— labels ํ•ญ๋ชฉ์„ ์„ค์ •ํ–ˆ๋‹ค. ์ด์ œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ๋งŽ์ด ์ต์ˆ™ํ•ด์ง€์‹  ๋ถ„๋“ค์ด๋ฉด ์ € 'labels' ํ•ญ๋ชฉ๋งŒ ๋ณด๋”๋ผ๋„ "์•„ ์ด labels๋กœ ๋˜ ์–ด๋”˜๊ฐ€์—์„œ ๋ผ๋ฒจ ์…€๋ ‰ํ„ฐ๋ฅผ ์“ฐ๊ฒ ๊ตฌ๋งŒ" ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ ์˜ˆ์ƒ์ด ๋งž๋‹ค. 

 

ํ•ด๋‹น labels๋Š” ์•„๋ž˜์˜ child-cluster-role ์ด๋ฆ„์˜ ํด๋Ÿฌ์Šคํ„ฐ ๋กค์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, aggregationRule.clusterRoleSelectors.matchLabels ํ•ญ๋ชฉ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์œ„ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ child-cluster-role ์ด๋ผ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋กค์€ rules ํ•ญ๋ชฉ์— ์•„๋ฌด๊ฒƒ๋„ ๋ช…์‹œํ•˜์ง€ ์•Š์•˜์ง€๋งŒ aggregationRule๋กœ ์ธํ•ด parent-cluster-role ์ด๋ผ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋กค์˜ ๊ถŒํ•œ๋“ค์„ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

3-2. SA์™€ ๊ถŒํ•œ์„ ์—ฐ๊ฒฐํ•˜์ž: RoleBinding, ClusterRoleBinding

SA๋„ ์ •์˜ํ–ˆ๊ณ , SA์— ๋ถ€์—ฌํ•  ๊ถŒํ•œ์ธ ๋กค๋„ ์ •์˜ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์ด ๋‘ ๊ฐœ๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด RoleBinding๊ณผ ClusterRoleBinding ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž. ๋จผ์ € RoleBinding์ด๋‹ค.

 

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: zedd-default
  name: service-reader-role-binding
subjects:
  - kind: ServiceAccount
    name: zedd-default-sa
    namespace: zedd-default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: service-reader-role

 

์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋ชฉํ•  ๋ถ€๋ถ„์€ subjects์™€ roleRef์ด๋‹ค. 

 

  • subjects : ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ๋Œ€์ƒ์ด ์–ด๋–ค SA์ธ์ง€๋ฅผ ๋ช…์‹œ
  • roleRef: subjects์— ๋ช…์‹œํ•œ SA์— ์–ด๋–ค ๊ถŒํ•œ ์ฆ‰, ์–ด๋–ค Role์„ ๋ถ€์—ฌํ•  ๊ฒƒ์ธ์ง€ ๋ช…์‹œ. ์ด ๋•Œ์˜ Role์€ [๋ชฉ์ฐจ 3-1]์—์„œ ์ƒ์„ฑํ•œ Role์ž„

๋‹ค์Œ์€ ClusterRoleBinding ๋งค๋‹ˆํŽ˜์ŠคํŠธ์ด๋‹ค. ๋‚ด์šฉ์€ RoleBinding ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํ˜•์‹๊ณผ ๋™์ผํ•˜๋‹ค.

 

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: nodes-reader-cluster-role-binding
subjects:
  - kind: ServiceAccount
    name: zedd-default-sa
    namespace: zedd-default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nodes-reader-cluster-role

4. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๊ธฐ

์ด๋ฒˆ ๋ชฉ์ฐจ์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ์ค‘ kube-apiserver๋กœ ์ ‘๊ทผํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. kube-apiserver๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ ์ค‘ ํ•˜๋‚˜๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ kubectl ๋ช…๋ น์–ด๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ ์šด์˜ ์ค‘์ธ ํŒŒ๋“œ์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋“ค์ด Watch API๋ฅผ ์ด์šฉํ•œ๋‹ค๊ฑฐ๋‚˜ etcd์—์„œ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ํ•˜๊ธฐ ์œ„ํ•ด์„œ API ์š”์ฒญ์„ ์ „์†กํ•˜๋Š” ๊ณณ์ด๋‹ค. 

 

์ด๋Ÿฐ kube-apiserver์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ kubectl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ง์ „ ๋ชฉ์ฐจ์—์„œ ์•Œ์•„๋ณธ .kube/config ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ด์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์ „์— ์ƒ์„ฑํ•ด๋‘” SA ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ --as ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ์ด์šฉํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด kube-apiserver์— ์ ‘๊ทผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์ ์ ˆํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์ด๋ฒˆ ๋ชฉ์ฐจ์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ kube-apiserver๋กœ ์ ‘๊ทผํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

4-1. SA์˜ Secret ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด์šฉํ•ด ์ ‘๊ทผํ•˜์ž!

๋จผ์ € kube-apiserver๋„ HTTP ์š”์ฒญ์„ ํ†ตํ•ด์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก REST API๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ์ด ์—”๋“œํฌ์ธํŠธ๋Š” ๋งŒ์•ฝ kubeadm์ธ ๊ฒฝ์šฐ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์˜ IP์™€ 6443 ํฌํŠธ๋กœ, GKE๋‚˜ kops์˜ ๊ฒฝ์šฐ๋ผ๋ฉด 443 ํฌํŠธ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ ํ•ด๋‹น ์—”๋“œํฌ์ธํŠธ๋Š” ๋ฐ˜๋“œ์‹œ HTTPS ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์Šค์Šค๋กœ ์‚ฌ์ธํ•œ self-signed ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค. 

 

์ด๋Ÿฌํ•œ ์—”๋“œํฌ์ธํŠธ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ SA์˜ secret์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. SA๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ secret ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ฐ™์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด secret์€ ํ•ด๋‹น SA๋ฅผ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•ด๋‹น SA์˜ secret์„ ์‚ฌ์šฉํ•ด์„œ kube-apiserver์— ์ ‘๊ทผํ•œ๋‹ค๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ๊ตฌ์กฐ๋„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์ง„๋‹ค.

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด k8s ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€/์™ธ๋ถ€์— ์žˆ์„ ๊ฒฝ์šฐ

 

์œ„ ๊ตฌ์กฐ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ kube-apiserver์— ์ ‘๊ทผ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ JWT(Json Web Token) ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋Š” kube-apiserver๋กœ REST API ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, Secret์— ์ €์žฅ๋œ token์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋‹ด์•„์„œ ๋ณด๋‚ด๋ฉด "ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ "zedd" ๋ผ๋Š” SA๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž๊ฒฉ์„ ์ฆ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค" ๋ผ๊ณ  ์ „๋‹ฌํ•˜๋Š” ์…ˆ์ด๋‹ค. REST API๋ฅผ ์š”์ฒญํ•˜๋Š” curl ๋ช…๋ น์–ด ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋งŒ์•ฝ default ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์กด์žฌํ•˜๋Š” ์„œ๋น„์Šค ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋“ค ๋ชฉ๋ก์„ ๋ณด๋ ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค. ์ด ๋•Œ ํ—ค๋”์— ๋‹ด๋Š” ํ† ํฐ์€ base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ์ƒํƒœ์—์„œ ๋””์ฝ”๋”ฉํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

# kubeadm์œผ๋กœ ์„ค์น˜ํ•œ ๊ฒฝ์šฐ
curl https://$MASTER_NODE_IP:6443/api/v1/namespaces/default/services \
-k \
-H "Authorization: Bearer $DECODED_TOKEN"

 

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ secret์˜ ํ† ํฐ์„ ์ˆ˜๋™์œผ๋กœ ๋””์ฝ”๋”ฉํ•ด์ฃผ๊ณ , REST API ์š”์ฒญ ์‹œ ํŽ˜์ด๋กœ๋“œ ๋ถ€๋ถ„์— ํ† ํฐ ๊ฐ’์„ ์ง์ ‘ ๋‹ด์•„์ค˜์•ผํ•˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ถˆํŽธํ•œ ์ ์ด ์กด์žฌํ•œ๋‹ค.

4-2. ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ kubernetes ์„œ๋น„์Šค ์ด์šฉํ•ด ์ ‘๊ทผํ•˜๊ธฐ!

์ด๋ฒˆ์—” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๊ณ  ํ•œ์ •ํ–ˆ์„ ๋•Œ, [๋ชฉ์ฐจ 4-1] ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ํ† ํฐ ๊ฐ’์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์ง€ ์•Š๊ณ  ์ž๋™์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด kube-apiserver์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. 

 

์ด๋ฅผ ์œ„ํ•ด์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑํ•ด๋‘” default ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ kubernetes ๋ผ๋Š” ์ด๋ฆ„์˜ ClusterIP ํƒ€์ž…์˜ ์„œ๋น„์Šค ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ํŒŒ๋“œ๋“ค์€ ์ด kubernetes ๋ผ๋Š” ์ด๋ฆ„์˜ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•ด์„œ kube-apiserver๋กœ ์ ‘๊ทผ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ, ํŒŒ๋“œ๊ฐ€ kubernetes ์„œ๋น„์Šค๋กœ ํ†ต์‹ ํ•  ๋•Œ ๋ช…์‹œํ•˜๋Š” ๋„๋ฉ”์ธ์€ ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๋ฐฐ์› ๋˜ ํด๋Ÿฌ์Šคํ„ฐ ํ†ต์‹  ๋„๋ฉ”์ธ์ธ FQDN์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

๊ทธ๋Ÿฐ๋ฐ ์ด ๋•Œ, ํŒŒ๋“œ๋Š” ๋‹จ์ˆœํžˆ kubernetes ๋ผ๋Š” ์„œ๋น„์Šค๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋งŒ kube-apiserver๋กœ ์š”์ฒญํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์•„๋‹ˆ๋‹ค. ์ด ๋•Œ๋„ [๋ชฉ์ฐจ 4-1]๋•Œ ์ฒ˜๋Ÿผ ํŒŒ๋“œ์— "์–ด๋–ค SA"์˜ ์‹œํฌ๋ฆฟ ๊ฐ’์„ HTTP ์š”์ฒญ์— ๋‹ด์•„ ๋ณด๋‚ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ "์–ด๋–ค SA"์— ๋ฐ”์ธ๋”ฉ๋œ Role์— ์ •์˜๋œ ๊ถŒํ•œ๋“ค์— ํ•œํ•˜์—ฌ kube-apiserver๋กœ ์š”์ฒญํ•œ ๋’ค ์ •์ƒ ์‘๋‹ต์„ ๋ฐ›์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 

 

๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ "์–ด๋–ค SA"๋ผ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ผ๊นŒ? ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ํŠน๋ณ„ํ•œ SA๋ฅผ ๋ช…์‹œํ•ด์ฃผ์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ "์–ด๋–ค SA"์˜ ์‹œํฌ๋ฆฟ์„ ํŒŒ๋“œ ๋‚ด๋ถ€์— ๋งˆ์šดํŠธํ•˜๊ฒŒ ๋œ๋‹ค. ์ด "์–ด๋–ค SA"๋Š” ๋ฐ”๋กœ default ๋ผ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ 'default' ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ SA๋ฅผ ๋œปํ•œ๋‹ค. ์‹ค์ œ๋กœ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, describe๋ฅผ ํ•ด๋ณด๋ฉด Containers.Mounts ํ•ญ๋ชฉ์— ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ๋กœ์˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋งˆ์šดํŠธ๋˜์–ด ์žˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

/var/run/secrets/kubernetes.io/serviceaccount

 

ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— ๊ฐ€๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํŒŒ์ผ๋“ค์ด ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ํ˜•ํƒœ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

/var/run/secrets/kubernetes.io/serviceaccount ๊ฒฝ๋กœ ๋‚ด์— ์กด์žฌํ•˜๋Š” ํŒŒ์ผ๋“ค

 

๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ํŒŒ๋“œ์—์„œ kube-apiserver๋กœ ์ ‘๊ทผํ•˜๋ ค๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ์— ์žˆ๋Š” token ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์— ์ €์žฅ๋œ ๋‚ด์šฉ์„ ์ฝ์–ด์™€์„œ kubernetes ์ด๋ฆ„์˜ ์„œ๋น„์Šค๋กœ ์š”์ฒญํ•˜๋ฉด ๋œ๋‹ค. 

 

ํŒŒ๋“œ์— ๋งˆ์šดํŠธ๋˜๋Š” Secret์˜ ํ† ํฐ์„ ์ด์šฉํ•ด kubernetes ์„œ๋น„์Šค์— ์ ‘๊ทผ

 

์ฐธ๊ณ ๋กœ ํŒŒ๋“œ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” default ๋ผ๋Š” ์ด๋ฆ„์˜ SA ๋ง๊ณ  ๋‚ด๊ฐ€ ์‚ฌ์ „์— ๋ณ„๋„๋กœ ์ƒ์„ฑํ•œ SA๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋” ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ spec.serviceAccountName ํ•ญ๋ชฉ์— SA ์ด๋ฆ„์„ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

4-3. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค SDK๋ฅผ ์ด์šฉํ•ด ์ ‘๊ทผํ•˜๊ธฐ!

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ ‘๊ทผํ•œ๋‹ค๊ณ  ํ•œ์ •ํ–ˆ์„ ๋•Œ, ์ด๋ฒˆ์—๋Š” ํŠน์ • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๋ฐ”์ธ๋”ฉ๋œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค SDK(ex. pypi kubernetes)๋ฅผ ์ด์šฉํ•ด์„œ kubernetes ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” [๋ชฉ์ฐจ 4-2]์™€ ๋™์ผํ•œ ๊ตฌ์กฐ์ด๋˜, kubernetes ์„œ๋น„์Šค๋กœ ์ ‘๊ทผํ•  ๋•Œ ํŠน์ • ์–ธ์–ด๋กœ ๋ฐ”์ธ๋”ฉ๋œ SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์ด ์ฐจ์ด์ ์ด๋‹ค. 

 

 

Python ์–ธ์–ด๋กœ ๋ฐ”์ธ๋”ฉ๋œ SDK๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์•„๋ž˜์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ•ญ์ƒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

from kubernetes import config

config.load_incluster_config()

 

์œ„ load_incluster_config() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ์•„๊นŒ [๋ชฉ์ฐจ 4-2]์—์„œ ๋ณด์•˜๋˜ ํŒŒ๋“œ ๋‚ด๋ถ€์— ๋งˆ์šดํŠธ๋œ "/var/run/secrets/kubernetes.io/serviceaccount" ๋ผ๋Š” ๊ฒฝ๋กœ์— ์กด์žฌํ•˜๋Š” ํŒŒ์ผ๋“ค์„ ์ฝ์–ด๋“ค์—ฌ kube-apiserver๋กœ์˜ ์ธ์ฆ, ์ธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  SDK๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ kubernetes ์ด๋ฆ„์˜ ์„œ๋น„์Šค๋กœ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. [๋ชฉ์ฐจ 4-2]๋•Œ์™€ ๋‹ค๋ฅธ ์ ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์†Œ์Šค์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ FQDN์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•ด์„œ ์š”์ฒญํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

5. SA๋กœ ์‚ฌ์„ค(Private) ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ ‘๊ทผํ•˜๊ธฐ

์ด๋ฒˆ ๋ชฉ์ฐจ์—์„œ๋Š” SA๋ฅผ ํ™œ์šฉํ•ด์„œ ์‚ฌ์„ค ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ์ด์ „ ํฌ์ŠคํŒ…์—์„œ docker-registry ๋ผ๋Š” ์œ ํ˜•์˜ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ์‹œํฌ๋ฆฟ์„ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋‚˜ ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ imagePullSecrets ํ•ญ๋ชฉ์— ๋ช…์‹œํ•˜๋ฉด ํ•ด๋‹น ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋˜๋Š” ํŒŒ๋“œ๊ฐ€ ํ•ด๋‹น ์‹œํฌ๋ฆฟ์„ ์ด์šฉํ•ด์„œ ์‚ฌ์„ค ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์‚ดํŽด๋ณด์•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ์‚ฌ์„ค ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ ‘๊ทผํ•˜๋ ค๋Š” ๋ชจ๋“  ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋˜๋Š” ํŒŒ๋“œ์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋งˆ๋‹ค ๋งค๋ฒˆ imagePullSecrets ํ•ญ๋ชฉ์— ์‹œํฌ๋ฆฟ์„ ์ •์˜ํ•ด์•ผ ํ–ˆ์—ˆ๋‹ค.

 

์ด๋Ÿฐ ๋ฒˆ๊ฑฐ๋กœ์›€์„ SA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. SA์— docker-registry ํƒ€์ž…์˜ ์‹œํฌ๋ฆฟ์„ ํ•œ ๋ฒˆ ์„ค์ •ํ•ด๋†“์€ ๋’ค, ์‚ฌ์„ค ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ ‘๊ทผํ•˜๋ ค๋Š” ๋ชจ๋“  ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ํŒŒ๋“œ๋“ค์€ ๋‹จ์ง€ ํ•ด๋‹น SA๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. SA์— docker-registry ํƒ€์ž…์˜ ์‹œํฌ๋ฆฟ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

apiVersion: v1
kind: ServiceAccount
metadata:
  name: private-registry-sa
  namespace: zedd-ns
imagePullSecrets:
  - name: registry-auth

 

์œ„ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ registry-auth ๋ผ๋Š” ์‹œํฌ๋ฆฟ์€ docker-registry ํƒ€์ž…์œผ๋กœ, ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋†“์€ ์‹œํฌ๋ฆฟ์˜ ์ด๋ฆ„์ด๋‹ค. ์ฐธ๊ณ ๋กœ [๋ชฉ์ฐจ 4-2]์—์„œ ๋ฐฐ์šด ๊ฒƒ์ฒ˜๋Ÿผ, ๋ณ„๋‹ค๋ฅธ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ํŒŒ๋“œ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” default ๋ผ๋Š” ์ด๋ฆ„์˜ SA์— ์‹œํฌ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

6. kubeconfig ํŒŒ์ผ์— SA ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ด์„œ k8s ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ

์ด๋ฒˆ์— ๋ฐฐ์šธ ๋‚ด์šฉ์€ [๋ชฉ์ฐจ 2๋ฒˆ]์—์„œ ์‚ดํŽด๋ณธ kubeconfig ํŒŒ์ผ ์ฆ‰, (๋ณ„๋„ ์„ค์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด) ~/.kube/config ๊ฒฝ๋กœ์˜ ํŒŒ์ผ์—๋‹ค๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค SA ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•œ ๋’ค, ํ•ด๋‹น SA ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  k8s ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

(์ฐธ๊ณ ๋กœ kubeconfig ํŒŒ์ผ์€ ๋ณ„๋„๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ~/.kube/config ๊ฒฝ๋กœ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์กด์žฌํ•˜์ง€๋งŒ, ํ™˜๊ฒฝ๋ณ€์ˆ˜์ธ KUBECONFIG ๋ผ๋Š” ๊ฐ’์— ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด์„œ kubeconfig ํŒŒ์ผ์ด ํ•ด๋‹น ๊ฒฝ๋กœ์— ์ €์žฅ๋˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค)

 

๊ทธ๋Ÿฐ๋ฐ ์›๋ก ์ ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ์™œ kubeconfig ํŒŒ์ผ์— ๊ตณ์ด SA ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฑธ๊นŒ? ๊ทธ๋ƒฅ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ๊ฐ–๋Š” ์ธ์ฆ์„œ ์ •๋ณด๋กœ ํ•˜๋ฉด ์•ˆ๋ ๊นŒ? ๋ฌผ๋ก  ์•ˆ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋ณดํ†ต k8s ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ๋‹ค์–‘ํ•œ ์ง๋ฌด์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ ‘๊ทผํ•˜๋ฉฐ, ๊ฐ ๊ฐœ๋ฐœ์ž์˜ ์—ญํ• ์ด ๊ฐ๊ธฐ ์„œ๋กœ ๋‹ค๋ฅด๋‹ค. ์ด๋ ‡๊ฒŒ ๋จ์— ๋”ฐ๋ผ ์ž์—ฐ์Šค๋ ˆ ๊ฐœ๋ฐœ์ž์˜ ์ง๋ฌด๋‚˜ ์—ญํ• ์— ๋”ฐ๋ผ k8s ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•ด์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ๋“ค์„ ์ œํ•œํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœ์ž ์ฆ‰, ์ผ์ข…์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ๋งˆ๋‹ค ๊ถŒํ•œ์„ ๋‹ค๋ฅด๊ฒŒ ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ๊ถŒํ•œ์ด ์ œํ•œ๋œ SA๋ฅผ kubeconfig์— ์„ค์ •ํ•˜๊ฒŒ ๋œ๋‹ค.

 

kubeconfig ํŒŒ์ผ์— SA๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์ „์— kubeconfig ํŒŒ์ผ์— ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š” ๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. [๋ชฉ์ฐจ 2๋ฒˆ]์—์„œ๋Š” ์ž ๊น ์†Œ๊ฐœํ•˜๋Š” ์ •๋„๋กœ๋งŒ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ ๋ชฉ์ฐจ์—์„  ์ข€ ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž. ์šฐ์„  kubeconfig ์˜ˆ์‹œ ํŒŒ์ผ์„ ํ•˜๋‚˜ ์‚ดํŽด๋ณด์ž.

 

kubeconfig ํŒŒ์ผ ๋‚ด์šฉ ์˜ˆ์‹œ

 

kubeconfig ํŒŒ์ผ์€ ํฌ๊ฒŒ 3๊ฐ€์ง€ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. 

 

  • clusters: ์ ‘์†ํ•  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์˜ ๋ชฉ๋ก. ์œ„์—๋Š” 1๊ฐœ์˜ API ์„œ๋ฒ„๋งŒ ์กด์žฌํ•˜์ง€๋งŒ, ์›ํ•œ๋‹ค๋ฉด ๋” ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Œ
  • users: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„๋กœ ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋ชฉ๋ก. ํ•ด๋‹น ํ•ญ๋ชฉ์— SA์˜ ํ† ํฐ์„ ์ž…๋ ฅํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฃจํŠธ ์ธ์ฆ์„œ๋กœ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰๋ฐ›์€ ํ•˜์œ„ ์ธ์ฆ์„œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜๋„ ์žˆ์Œ
  • contexts: clusters ํ•ญ๋ชฉ์— ์žˆ๋Š” ํ•˜๋‚˜์˜ cluster ์™€ users ํ•ญ๋ชฉ์— ์žˆ๋Š” ํ•˜๋‚˜์˜ user๋ฅผ ์กฐํ•ฉํ•ด์„œ ์ตœ์ข…์ ์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ •๋ณด๋ฅผ ์„ค์ •. ์ฆ‰, ์‹ค์งˆ์ ์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ ‘๊ทผํ•  ๋•Œ๋Š” ์ด ์ปจํ…์ŠคํŠธ๋ผ๋Š” ๊ฒƒ 1๊ฐœ๋ฅผ ์„ ํƒํ•ด์„œ ์ ‘๊ทผํ•จ. '์กฐํ•ฉ'์ด๋ผ๋Š” ๋‹จ์–ด์—์„œ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด M๊ฐœ์˜ cluster ํ•ญ๋ชฉ๊ณผ N๊ฐœ์˜ user ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์„œ๋กœ ๋ชจ๋‘ ์กฐํ•ฉํ•ด์„œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

๋งŒ์•ฝ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์–ธ์ œ๋Š” ๋‚ด๊ฐ€ ๋กœ์ปฌ์—์„œ ๊ตฌ์ถ•ํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ ‘๊ทผํ•˜๊ณ , ๋˜ ์–ธ์ œ๋Š” ํšŒ์‚ฌ์˜ ์›๊ฒฉ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ด์ œ kubeconfig ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•ด์„œ ํŠน์ • SA๋ฅผ ์„ค์ •ํ•œ ๋’ค, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ํ•ด๋‹น SA์˜ ๊ถŒํ•œ์œผ๋กœ ์ ‘๊ทผํ•ด๋ณด๋„๋ก ํ•˜์ž. kubeconfig ํŒŒ์ผ๋„ ์–ด์จŒ๊ฑด ํ…์ŠคํŠธ ํ˜•ํƒœ์˜ ํŒŒ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์— vim์ด๋‚˜ nano, IDE์™€ ๊ฐ™์€ ์—๋””ํ„ฐ๋กœ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ๊ธด ํ•˜์ง€๋งŒ kubectl config ๊ณ„์—ด์˜ ๋ช…๋ น์–ด๋กœ๋„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์œ ์ €๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

kubectl config set-credentials $USER_NAME --token=$DECODED_TOKEN

 

$DECODED_TOKEN ์ด๋ผ๋Š” ๋ณ€์ˆ˜ ๊ฐ’์—๋Š” ์ถ”๊ฐ€ํ•˜๋ ค๋Š” SA์— ์„ค์ •๋œ ์‹œํฌ๋ฆฟ์˜ Token์˜ base64 ๋””์ฝ”๋”ฉํ•œ ๊ฐ’์„ ๋ช…์‹œํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ๋์ผ๊นŒ? ์•„๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ–ˆ์ง€๋งŒ ์‹ค์งˆ์ ์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•ญ๋ชฉ์€ 'context' ๋ผ๊ณ  ํ–ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ์œ ์ €๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ์œผ๋‹ˆ, ์ด ์ถ”๊ฐ€ํ•œ ์œ ์ €๊ฐ€ ์–ด๋–ค ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•  ๊ฒƒ์ธ์ง€ ๋ช…์‹œํ•˜๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ค„ ์ฐจ๋ก€๋‹ค. ์ด ๋˜ํ•œ kubectl config ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

kubectl config set-context $NEW_CONTEXT_NAME --cluster=$CLUSTER_NAME --user=$USER_NAME

7. k8์—์„œ์˜ User ์™€ Group

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” SA ์™ธ์—๋„ User์™€ Group ์ด๋ผ๋Š” ๊ฐœ๋…์ด ์กด์žฌํ•œ๋‹ค. User๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž๋ฅผ ๋œปํ•˜๋ฉฐ User 1๊ฐœ ๋‹น ์‚ฌ์šฉ์ž 1๋ช… ์ •๋„๋กœ(๋ฌผ๋ก  ์‹ค์ œ ์‚ฌ๋žŒ 1๋ช…์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜)์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Group์€ ์ด User ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋ชจ์•„ ๋†“์€ ์ง‘ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค. ์‹ค์ œ๋กœ ์ด User, Group๋„ ๋กค ๋ฐ”์ธ๋”ฉ ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋กค ๋ฐ”์ธ๋”ฉ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ subjects ํ•ญ๋ชฉ์— SA ์ฒ˜๋Ÿผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ์‹ค์ œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ณต์‹ ๋ฌธ์„œ์—์„œ RoleBinding ๋‚ด์šฉ์„ ์„ค๋ช…ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

 

apiVersion: rbac.authorization.k8s.io/v1
# This role binding allows "jane" to read pods in the "default" namespace.
# You need to already have a Role named "pod-reader" in that namespace.
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
# You can specify more than one "subject"
- kind: User
  name: jane # "name" is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  # "roleRef" specifies the binding to a Role / ClusterRole
  kind: Role #this must be Role or ClusterRole
  name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io

 

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ํ—ท๊ฐˆ๋ฆฌ๋Š” ์ ์ด ์žˆ๋‹ค. SA๋Š” ๊ทธ๋Ÿผ User์™€ Group ๊ฐœ๋…๊ณผ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฑธ๊นŒ? ์‚ฌ์‹ค์ƒ SA๋„ ์ตœ์ข…์ ์œผ๋กœ๋Š” User ๊ฐœ๋…์— ์†ํ•œ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ทผ๊ฑฐ๋กœ, ํŠน์ • ๋ฆฌ์†Œ์Šค ๋ฐ ์•ก์…˜์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ์—†๋Š” SA์ธ๋ฐ, ๊ทธ ๊ถŒํ•œ์„ ์ทจํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด kube-apiserver๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ ์‘๋‹ต์„ ๋‚ด๋ฑ‰๊ฒŒ ๋œ๋‹ค.

 

Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:zedd-sa" cannot list resource "pods" in API group "" in the namespace "default"

 

์œ„ ๋ฉ”์„ธ์ง€๋Š” zedd-sa ๋ผ๋Š” ์ด๋ฆ„์˜ SA๊ฐ€ default ๋ผ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ํŒŒ๋“œ์— ๋Œ€ํ•ด์„œ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” list ๊ถŒํ•œ์ด ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์ด ๋•Œ ์ฃผ๋ชฉํ•  ๋ถ€๋ถ„์€ ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์† 'User' ๋ผ๊ณ  ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค. ๋ถ„๋ช… ์šฐ๋ฆฌ๋Š” SA๋ฅผ ์ด์šฉํ•ด ๊ถŒํ•œ์„ ์ทจํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ kube-apiserver๋Š” ์ด SA๋ฅผ ๋ณด๊ณ  'User'๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ณ  ์žˆ๋‹ค. ์ฆ‰, ์ด SA๋„ ์ผ์ข…์˜ User์ธ ์…ˆ์ด๊ณ , ๊ทธ User ์ด๋ฆ„์ด 'system:serviceaccount:default:zedd-sa' ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์‹ค์ œ๋กœ ๋กค ๋ฐ”์ธ๋”ฉ์— ํ•ด๋‹น User ์ด๋ฆ„์„ "kind: User" ๋ผ๋Š” ๊ฒƒ์„ ์ด์šฉํ•ด ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

...(RoleBinding ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์ƒ๋žต)...
subjects:
- kind: User
  name: system:serviceaccount:default:zedd-sa
  namespace: default
roleRef:
(... ์ƒ๋žต ...)

 

๊ทธ๋Ÿฌ๋ฉด Group์€ ์ € User ์ด๋ฆ„์—์„œ ์–ด๋–ค ๋ถ€๋ถ„์„ ์ง€์นญํ• ๊นŒ? ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

์ด ์˜ˆ์‹œ์—์„œ๋Š” Group์€ ์ด 2๊ฐœ๋ฅผ ์ง€์นญํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ฒซ ๋ฒˆ์งธ๋Š” system:serviceaccount ์ด๋‹ค. ์ด Group์€ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๋Š” ๋ชจ๋“  ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๊ฐ€ ์†ํ•ด ์žˆ๋Š” ๊ทธ๋ฃน์„ ์˜๋ฏธํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ์ธ system:serviceaccount:default ๋ผ๋Š” Group์€ default ๋ผ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๋Š” ๋ชจ๋“  ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๊ฐ€ ์†ํ•ด ์žˆ๋Š” ๊ทธ๋ฃน์„ ์˜๋ฏธํ•œ๋‹ค. 

 

์ด๋Ÿฌํ•œ Group๋“ค์€ ํด๋Ÿฌ์Šคํ„ฐ ๋กค ๋ฐ”์ธ๋”ฉ์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋ช…์‹œ๋  ์ˆ˜ ์žˆ๋‹ค.

 

# docs: https://kubernetes.io/docs/reference/access-authn-authz/rbac/#clusterrolebinding-example
apiVersion: rbac.authorization.k8s.io/v1
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
kind: ClusterRoleBinding
metadata:
  name: read-secrets-global
subjects:
- kind: Group
  name: manager # Name is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

 

system ์ด๋ผ๋Š” ์ ‘๋‘์–ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๋“ค์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด ๋‘” ์œ ์ €๋‚˜ ๊ทธ๋ฃน๋“ค์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋“ค๋กœ๋Š”, API ์„œ๋ฒ„์˜ ์ธ์ฆ์— ์„ฑ๊ณตํ•œ ๊ทธ๋ฃน์„ ์˜๋ฏธํ•œ system:authenticated, ์ธ์ฆ์— ์‹คํŒจํ•œ ๊ทธ๋ฃน์ธ system:unauthenticated, ์ธ์ฆ์— ์‹คํŒจํ•œ ์œ ์ €๋ฅผ ์˜๋ฏธํ•˜๋Š” system:anonymous ๋“ฑ์ด ์žˆ๋‹ค. ์ฐธ๊ณ ํ•ด์„œ ์•Œ์•„๋‘๋„๋ก ํ•˜์ž.

 

์ด๋ ‡๊ฒŒ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •์˜ํ•ด๋‘” ์œ ์ €์™€ ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ธด ํ•˜์ง€๋งŒ, ์˜ค๋กœ์ง€ ์ด๊ฒƒ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๊ฐ์ž์˜ ์กฐ์ง์— ๋งž๊ฒŒ ์ปค์Šคํ…€ํ•˜๊ฒŒ ์œ ์ €์™€ ๊ทธ๋ฃน์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, kubeconfig ํŒŒ์ผ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ์ธ์ฆ ๋ฐฉ๋ฒ•์ธ x509 ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ณ„๋„์˜ ์ธ์ฆ ์„œ๋ฒ„์ธ ๊นƒํ—ˆ๋ธŒ ๊ณ„์ •, ๊ตฌ๊ธ€ ๊ณ„์ •, LDAP ๋ฐ์ดํ„ฐ ๋“ฑ์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ์— ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ฐธ๊ณ ๋กœ ๋ณ„๋„์˜ ์ธ์ฆ์„œ๋ฒ„๋ผ ํ•จ์€ ๋ณดํ†ต OAuth์˜ OIDC๋ฅผ ์ด์šฉํ•œ Dex๋‚˜ ๋‹จ์ˆœ ํ† ํฐ์„ ์ด์šฉํ•ด ์›นํ›… ์ธ์ฆ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋Š” Guard ๋“ฑ์ด ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•