μ§κΈκΉμ§λ ν΄λ¬μ€ν°μ λͺ¨λ κΆνμ κ°μ§ admin κ³μ μΌλ‘ μ€μ΅νμ΅λλ€. μ€μ νμ¬λΌλ©΄ μ΄λ κ² νλ©΄ μ λ©λλ€. μ μ
κ°λ°μμκ² kubectl κΆνμ μ£Όλλ° μ€μλ‘ kubectl delete pod --allμ μΉλ μ¬κ³ κ° μΌμ΄λ μ μμ£ . RBAC(Role-Based Access Control) μ “λκ°, μ΄λ€ 리μμ€μ, 무μμ ν μ μλμ§”λ₯Ό μΈλ°νκ² μ μ΄νλ μΏ λ²λ€ν°μ€μ 보μ μμ€ν
μ
λλ€.
π― μ΄λ² μ€μ΅ μλ리μ€
μ μ
κ°λ°μμ© κ³μ (dev-sa)μ λ§λ€μ΄μ λ€μκ³Ό κ°μ΄ κΆνμ μ νν©λλ€.
- β
κ°λ₯: νλ λͺ©λ‘ μ‘°ν(
list), μμΈ μ‘°ν(get), λ‘κ·Έ 보기(watch) - β λΆκ°λ₯: νλ μμ (
delete), μμ±(create), μμ (edit)
π§© RBACμ 3μμ
νμΌ 3κ°λ₯Ό λΆλ¦¬ν΄μ λ§λλ κ² ν΅μ¬μ λλ€. μ΄μ κ° μμ΅λλ€.
| μμ | YAML | μν |
|---|---|---|
| ServiceAccount | dev-sa.yaml | μ¬μμ¦ (IDλ§ μμ, κΆν μμ) |
| Role | pod-reader-role.yaml | μ 무 λ§€λ΄μΌ (무μμ ν μ μλμ§ κ·μΉ) |
| RoleBinding | dev-rolebinding.yaml | κ·Όλ‘κ³μ½μ (μ¬μμκ² μ 무λ₯Ό λΆμ¬) |
νμΌμ λΆλ¦¬νλ©΄ μ¬μ¬μ©μ΄ λ©λλ€. μ νμμ΄ λ€μ΄μ€λ©΄ dev-sa.yamlλ§ μλ‘ λ§λ€κ³ κ°μ Roleμ Bindingνλ©΄ λ©λλ€. Roleμ μμ μμ΄ μ¬νμ©ν©λλ€.
π οΈ κ΅¬ν
Step 1: κ³μ μμ± (ServiceAccount)
# dev-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: dev-sa
namespace: default
kubectl apply -f dev-sa.yaml
Step 2: κΆν κ·μΉ μ μ (Role)
# pod-reader-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: default
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"] # νλμ νλ λ‘κ·Έμλ§ μ μ©
verbs: ["get", "list", "watch"] # μ‘°νλ§ νμ©, delete μμ!
kubectl apply -f pod-reader-role.yaml
Step 3: κΆν μ°κ²° (RoleBinding)
# dev-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: dev-pod-reader
namespace: default
subjects:
- kind: ServiceAccount
name: dev-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
kubectl apply -f dev-rolebinding.yaml
β κΆν κ²μ¦
admin κ³μ μμ λ‘κ·Έμμνμ§ μκ³ , --as μ΅μ
μΌλ‘ dev-sa κ³μ μ νλ΄λ΄μ(Impersonation) ν
μ€νΈν©λλ€.
# νλ λͺ©λ‘ μ‘°ν β μ±κ³΅ν΄μΌ ν¨
kubectl auth can-i list pods --as=system:serviceaccount:default:dev-sa
# κ²°κ³Ό: yes β
# νλ μμ β κ±°λΆλΌμΌ ν¨
kubectl auth can-i delete pods --as=system:serviceaccount:default:dev-sa
# κ²°κ³Ό: no π‘οΈ
# νλ μμ± β κ±°λΆλΌμΌ ν¨
kubectl auth can-i create pods --as=system:serviceaccount:default:dev-sa
# κ²°κ³Ό: no π‘οΈ
π κ³μ μ΄λ¦ ꡬ쑰 λ―μ΄λ³΄κΈ°
--as μ΅μ
μ μ°μ΄λ system:serviceaccount:default:dev-saμ μλ―Έ:
system:serviceaccount : default : dev-sa
β β β
β β βββ κ³μ μ΄λ¦ (μ°λ¦¬κ° μ§μ )
β βββ λ€μμ€νμ΄μ€ (κ³μ μ΄ μν 곡κ°)
βββ μμ€ν
κ³μ μμ λνλ΄λ μ λμ΄ (κ³ μ κ°)
π‘ Role vs ClusterRole β λ²μκ° λ€λ¦ λλ€
| Role | ClusterRole | |
|---|---|---|
| μ μ© λ²μ | νΉμ λ€μμ€νμ΄μ€ | μ 체 ν΄λ¬μ€ν° |
| μ¬μ© μΌμ΄μ€ | νλ³ κΆν λΆλ¦¬ | λ Έλ κ΄λ¦¬, PV κ΄λ¦¬ λ± |
μ§κΈ λ§λ pod-reader Roleμ default λ€μμ€νμ΄μ€μμλ§ μ ν¨ν©λλ€. λ€λ₯Έ λ€μμ€νμ΄μ€μ νλλ λ³Ό μ μμ΅λλ€. μ 체 ν΄λ¬μ€ν°μ νλλ₯Ό λ³Ό μ μκ² νλ €λ©΄ ClusterRoleμ μ¨μΌ ν©λλ€.
π‘ μ€μ μ μ© μμ
λΌμ¦λ² 리νμ΄ νλ‘μ νΈμ μ μ©νμ λμ κ³ν:
admin κ³μ : ν΄λ¬μ€ν° μ 체 κ΄λ¦¬
prometheus-sa: λ©νΈλ¦ μμ§μ© (nodes, pods μ‘°νλ§)
dev-sa: νλ μ‘°ν + λ‘κ·Έ 보기 (μμ λΆκ°)
ci-sa: Deployment μ
λ°μ΄νΈλ§ κ°λ₯ (μμ λΆκ°)
μΈλΆ λͺ¨λν°λ§ λꡬ(Prometheus)μ μ 체 admin κΆνμ μ£Όμ§ μκ³ , νμν κΆνλ§ λ± μλΌ μ£Όλ λ°©μμ λλ€.
β μ 리
RBACμ μΏ λ²λ€ν°μ€ ν΄λ¬μ€ν°λ₯Ό μ¬λ¬ νμ΄ μ¬μ©νλ νκ²½μμ νμμ λλ€. κΆν μ€κ³λ “μ΅μ κΆν μμΉ(Principle of Least Privilege)” β νμν κ²λ§, νμν λ²μμμλ§ λΆμ¬νλ κ² κΈ°λ³Έμ λλ€.
λ€μ κΈμμλ νΈλν½μ΄ λͺ°λ¦΄ λ μλμΌλ‘ νλλ₯Ό λ리λ HPA(Horizontal Pod Autoscaler) λ₯Ό λ€λ£Ήλλ€.