Post

[Kubernetes] Role, Clusterrole, Binding

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋ณด์•ˆ 3์š”์†Œ๋ฅผ ์ •๋ฆฌํ•œ๋‹ค. RBAC(๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€), ServiceAccount(ํŒŒ๋“œ์˜ ์‹ ์›), NetworkPolicy(ํŒŒ๋“œ ๊ฐ„ ํ†ต์‹  ํ†ต์ œ)๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณดํ˜ธํ•œ๋‹ค.

๋ณด์•ˆ์˜ ๋‘ ์ถ• โ€” RBAC๋Š” โ€œ๋ˆ„๊ฐ€ ์–ด๋–ค ๋ฆฌ์†Œ์Šค์— ๋ฌด์Šจ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€โ€(์ ‘๊ทผ ์ œ์–ด)๋ฅผ, NetworkPolicy๋Š” โ€œ์–ด๋–ค ํŒŒ๋“œ๊ฐ€ ์–ด๋–ค ํŒŒ๋“œ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€โ€(๋„คํŠธ์›Œํฌ ์ œ์–ด)๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค. ๋‘˜์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ณ„์ธต์„ ์ง€ํ‚จ๋‹ค.


1. RBAC โ€” Role & Binding

RBAC(Role-Based Access Control)๋Š” ์—ญํ• (Role/ClusterRole)์„ ์ •์˜ํ•˜๊ณ  ๋ฐ”์ธ๋”ฉ(RoleBinding/ClusterRoleBinding)์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€์—ฌํ•œ๋‹ค.

flowchart LR
    Role["๐Ÿ“œ Role<br/>(๊ถŒํ•œ ์ •์˜)"]
    Binding["๐Ÿ”— RoleBinding"]
    User["๐Ÿ‘ค User / SA"]
    Role --> Binding --> User
์˜ค๋ธŒ์ ํŠธ๋ฒ”์œ„
Role / RoleBindingํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค
ClusterRole / ClusterRoleBindingํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด

Role & RoleBinding (๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฒ”์œ„)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Role โ€” dev-ns์—์„œ ํŒŒ๋“œ ์กฐํšŒ ๊ถŒํ•œ
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev-ns
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
---
# RoleBinding โ€” dev-user์—๊ฒŒ ๋ถ€์—ฌ
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: dev-ns
subjects:
- kind: User
  name: "dev-user"
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

ClusterRole & ClusterRoleBinding (ํด๋Ÿฌ์Šคํ„ฐ ๋ฒ”์œ„)

1
2
3
4
5
6
7
8
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-admin-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch", "delete"]

๐Ÿ’ก Role์€ โ€œ๊ถŒํ•œ์˜ ์ •์˜โ€, Binding์€ โ€œ๊ถŒํ•œ์˜ ๋ถ€์—ฌโ€๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค. ์ด ๋ถ„๋ฆฌ ๋•๋ถ„์— ํ•˜๋‚˜์˜ Role์„ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. verbs(get/list/delete ๋“ฑ)์™€ resources(pods ๋“ฑ)์˜ ์กฐํ•ฉ์œผ๋กœ ์„ธ๋ฐ€ํ•˜๊ฒŒ ๊ถŒํ•œ์„ ์ •ํ•œ๋‹ค.


2. ServiceAccount โ€” ํŒŒ๋“œ์˜ ์‹ ์›

ServiceAccount(SA)๋Š” ํŒŒ๋“œ๊ฐ€ API ์„œ๋ฒ„์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ์“ฐ๋Š” ๊ณ„์ •์ด๋‹ค. ์‚ฌ๋žŒ์ด ์•„๋‹ˆ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํŒŒ๋“œ)์˜ ์‹ ์›์ด๋‹ค.

1
kubectl create serviceaccount dev-sa -n dev-ns
1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Pod
metadata:
  name: sa-pod
  namespace: dev-ns
spec:
  serviceAccountName: dev-sa      # ์ด SA์˜ ๊ถŒํ•œ์œผ๋กœ API ์ ‘๊ทผ
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

๐Ÿ’ก User๋Š” ์‚ฌ๋žŒ, ServiceAccount๋Š” ํŒŒ๋“œ(์•ฑ)์˜ ๊ณ„์ •์ด๋‹ค. ํŒŒ๋“œ๊ฐ€ API ์„œ๋ฒ„์— ์š”์ฒญํ•  ๋•Œ SA์˜ ๊ถŒํ•œ์„ ๋”ฐ๋ฅด๋ฏ€๋กœ, SA์— RBAC๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด ํŒŒ๋“œ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์„ ์ œํ•œํ•œ๋‹ค.


3. NetworkPolicy โ€” ํŒŒ๋“œ ํ†ต์‹  ํ†ต์ œ

NetworkPolicy๋Š” ํŒŒ๋“œ ๊ฐ„ยท์™ธ๋ถ€์™€์˜ ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ดํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ (myapp ํŒŒ๋“œ)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-traffic
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: myapp
  policyTypes:
  - Ingress
  - Egress
  ingress: []
  egress: []
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ํŠน์ • ๋Œ€์—ญยทํฌํŠธ๋งŒ ํ—ˆ์šฉ
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-specific-traffic
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: myapp
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: 192.168.1.0/24
    ports:
    - protocol: TCP
      port: 80

โš ๏ธ NetworkPolicy๋Š” CNI๊ฐ€ ์ง€์›ํ•ด์•ผ ๋™์ž‘ํ•œ๋‹ค. Calico ๊ฐ™์€ ์ •์ฑ… ์ง€์› CNI๊ฐ€ ์—†์œผ๋ฉด ์ •์ฑ…์„ ๋งŒ๋“ค์–ด๋„ ๋ฌด์‹œ๋œ๋‹ค. ๋˜ ๊ธฐ๋ณธ๊ฐ’์€ โ€œ๋ชจ๋‘ ํ—ˆ์šฉโ€์ด๋ผ, ํ•œ ๋ฒˆ์ด๋ผ๋„ ์ •์ฑ…์ด ๋ถ™์€ ํŒŒ๋“œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉํ•œ ํŠธ๋ž˜ํ”ฝ๋งŒ ํ†ต๊ณผ์‹œํ‚ค๋Š” ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์ด ๋œ๋‹ค.


4. Dashboard ๋ณด์•ˆ ๊ตฌ์„ฑ ์˜ˆ์‹œ

Dashboard์— ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ์ฃผ๋ ค๋ฉด SA๋ฅผ ๋งŒ๋“ค๊ณ  cluster-admin์„ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

โš ๏ธ cluster-admin์€ ๋ชจ๋“  ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์ตœ๊ฐ• ์—ญํ• ์ด๋‹ค. ํŽธ์˜์ƒ Dashboard ์‹ค์Šต์— ์“ฐ์ง€๋งŒ, ์‹ค๋ฌด์—์„œ๋Š” ํ•„์š”ํ•œ ๊ถŒํ•œ๋งŒ ๋‹ด์€ ์ปค์Šคํ…€ ClusterRole์„ ๋งŒ๋“ค์–ด ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์„ ์ง€์ผœ์•ผ ํ•œ๋‹ค.


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ณด์•ˆ
โ”œโ”€ RBAC          Role(์ •์˜) + Binding(๋ถ€์—ฌ), NS/ํด๋Ÿฌ์Šคํ„ฐ ๋ฒ”์œ„
โ”œโ”€ ServiceAccount ํŒŒ๋“œ์˜ ์‹ ์›(์•ฑ์˜ API ์ ‘๊ทผ ๊ถŒํ•œ)
โ”œโ”€ NetworkPolicy  ํŒŒ๋“œ ๊ฐ„ ํ†ต์‹  ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ(CNI ํ•„์š”)
โ””โ”€ ์›์น™          ์ตœ์†Œ ๊ถŒํ•œ(cluster-admin ๋‚จ์šฉ X)
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
RBAC๋ˆ„๊ฐ€ยท๋ฌด์—‡์„ยทํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€
ServiceAccountํŒŒ๋“œ(์•ฑ)์˜ ๊ณ„์ •
NetworkPolicyํŒŒ๋“œ ํ†ต์‹  ๋ฐฉํ™”๋ฒฝ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ณด์•ˆ์˜ ํ•ต์‹ฌ์€ RBAC๋กœ ์ ‘๊ทผ์„, NetworkPolicy๋กœ ํ†ต์‹ ์„ ํ†ต์ œํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํŒŒ๋“œ์—๋Š” ServiceAccount๋กœ ์‹ ์›์„ ๋ถ€์—ฌํ•˜๊ณ , ๋ชจ๋“  ๊ถŒํ•œ์€ ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์œผ๋กœ ์ข๊ฒŒ ์ฃผ๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.