[AEWS] #6์ฃผ์ฐจ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ, role ๊ถŒํ•œ ํ™•์ธ ์‹ค์Šต (2)

25๋…„๋„ AWS EKS Hands-on Study ์Šคํ„ฐ๋”” ์ •๋ฆฌ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

K8s ์ธ์ฆ/์ธ๊ฐ€ ์‹ค์Šต

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ dev-k8s ๋ฐ infra-k8s ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ, dev-team ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด๋ณด๋„๋ก ํ•œ๋‹ค.

 

SA, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ

kubectl create namespace dev-team
namespace/dev-team created

kubectl create ns infra-team
namespace/infra-team created

kubectl get ns
NAME                 STATUS   AGE
default              Active   72m
dev-team             Active   6s
infra-team           Active   5s
kube-node-lease      Active   72m
kube-public          Active   72m
kube-system          Active   72m
local-path-storage   Active   72m

kubectl create sa dev-k8s -n dev-team
serviceaccount/dev-k8s created

kubectl create sa infra-k8s -n infra-team
serviceaccount/infra-k8s created

 

์„œ๋น„์Šค ์–ด์นด์šดํŠธ์™€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

ํ…Œ์ŠคํŠธ ํŒŒ๋“œ ๋ฐฐํฌ

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: dev-kubectl
  namespace: dev-team
spec:
  serviceAccountName: dev-k8s
  containers:
  - name: kubectl-pod
    image: bitnami/kubectl:1.31.4
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
EOF

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: infra-kubectl
  namespace: infra-team
spec:
  serviceAccountName: infra-k8s
  containers:
  - name: kubectl-pod
    image: bitnami/kubectl:1.31.4
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
EOF

 

๊ฐ๊ฐ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ํŒŒ๋“œ๋ฅผ ๋ฐฐํฌํ•œ๋‹ค.

kubectl get pod -o dev-kubectl -n dev-team -o yaml |
grep service
      - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
    serviceAccount: dev-k8s
    serviceAccountName: dev-k8s
        - serviceAccountToken:
      - mountPath: /var/run/secrets/kubernetes.io/serviceaccount

kubectl get pod -o infra-kubectl -n infra-team -o yaml | grep service
      - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
    serviceAccount: infra-k8s
    serviceAccountName: infra-k8s
        - serviceAccountToken:
      - mountPath: /var/run/secrets/kubernetes.io/serviceaccount

 

๊ถŒํ•œ ํ™•์ธ

alias k1='kubectl exec -it dev-kubectl -n dev-team -- kubectl'
alias k2='kubectl exec -it infra-kubectl -n infra-team -- kubectl'

k1 get pods
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:dev-team:dev-k8s" cannot list resource "pods" in API group "" in the namespace "dev-team"

k2 get pods
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:infra-team:infra-k8s" cannot list resource "pods" in API group "" in the namespace "infra-team"

k1 auth can-i get pods
no

 

ํ˜„์žฌ dev-k8s ๋ฐ infra-k8s ์„œ๋น„์Šค ์–ด์นด์šดํŠธ๋Š” Kubernetes ๋ฆฌ์†Œ์Šค ์กฐํšŒ ๊ถŒํ•œ์ด ์—†์–ด์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

cat <<EOF | kubectl create -f -
> apiVersion: rbac.authorization.k8s.io/v1
> kind: Role
> metadata:
>   name: role-dev-team
>   namespace: dev-team
> rules:
> - apiGroups: ["*"]
>   resources: ["*"]
>   verbs: ["*"]
> EOF
role.rbac.authorization.k8s.io/role-dev-team created

cat <<EOF | kubectl create -f -
> apiVersion: rbac.authorization.k8s.io/v1
> kind: Role
> metadata:
>   name: role-infra-team
>   namespace: infra-team
> rules:
> - apiGroups: ["*"]
>   resources: ["*"]
>   verbs: ["*"]
> EOF
role.rbac.authorization.k8s.io/role-infra-team created

kubectl get roles -n dev-team
NAME            CREATED AT
role-dev-team   2025-03-15T18:56:26Z

kubectl get roles -n infra-team
NAME              CREATED AT
role-infra-team   2025-03-15T18:56:28Z

 

 

ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ๋งŒ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ •์˜ํ•˜๋Š” ๊ฐ์ฒด์ธ ๋กค์„ ์ƒ์„ฑํ•œ๋‹ค.

๋กค์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ๋งŒ ์ ์šฉ๋˜๋ฉฐ, ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์— ์ ์šฉํ•˜๋ ค๋ฉด ClusterRole์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

apiGroups, resources, verbs ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค์™€ ๋™์ž‘์„ ์ •์˜ํ•œ๋‹ค.

 

cat <<EOF | kubectl create -f -
> apiVersion: rbac.authorization.k8s.io/v1
> kind: RoleBinding
> metadata:
>   name: roleB-dev-team
>   namespace: dev-team
> roleRef:
>   apiGroup: rbac.authorization.k8s.io
>   kind: Role
>   name: role-dev-team
> subjects:
> - kind: ServiceAccount
>   name: dev-k8s
>   namespace: dev-team
> EOF
rolebinding.rbac.authorization.k8s.io/roleB-dev-team created

cat <<EOF | kubectl create -f -
> apiVersion: rbac.authorization.k8s.io/v1
> kind: RoleBinding
> metadata:
>   name: roleB-infra-team
>   namespace: infra-team
> roleRef:
>   apiGroup: rbac.authorization.k8s.io
>   kind: Role
>   name: role-infra-team
> subjects:
> - kind: ServiceAccount
>   name: infra-k8s
>   namespace: infra-team
> EOF
rolebinding.rbac.authorization.k8s.io/roleB-infra-team created

 

 

 

ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ Role์„ ํŠน์ • ์‚ฌ์šฉ์ž ๋˜๋Š” ์„œ๋น„์Šค ์–ด์นด์šดํŠธ(ServiceAccount)์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ์ฒด์ธ ๋กค ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•œ๋‹ค.

Role์„ ๋‹จ๋…์œผ๋กœ ์ƒ์„ฑํ•ด๋„ ์•„๋ฌด ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉฐ RoleBinding์„ ํ†ตํ•ด ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์™€ ์—ฐ๊ฒฐํ•ด์•ผ ๋กค์ด ์ ์šฉ๋œ๋‹ค.

 

kubectl describe rolebindings roleB-dev-team -n dev-team
Name:         roleB-dev-team
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  Role
  Name:  role-dev-team
Subjects:
  Kind            Name     Namespace
  ----            ----     ---------
  ServiceAccount  dev-k8s  dev-team

 

 

์ด์ œ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์— ์ œ๋Œ€๋กœ ๊ถŒํ•œ์ด ํ• ๋‹น๋˜์—ˆ๋‹ค!

 

k1 get pods
NAME          READY   STATUS    RESTARTS   AGE
dev-kubectl   1/1     Running   0          8m31s

k2 get pods
NAME            READY   STATUS    RESTARTS   AGE
infra-kubectl   1/1     Running   0          8m24s

k1 auth can-i get pods
yes

k2 auth can-i get pods
yes

 

์ด์ œ ๊ถŒํ•œ์„ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ช…๋ น์–ด๋กœ ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.