클라우드/DevOps

[CKA] ClusterRole, ServiceAccount, Rolebinding

dayeonsheep 2024. 12. 26. 21:32

 

- Create a new ClusterRole named deployment-clusterrole, which only allows to create the following resource types: Deployment, StatefulSet, DaemonSet

- Create a new ServiceAccount named cicd-token in the existing in the existing namespace apps.

- Bind the new Cluster Role deployment-clusterrole to the new ServiceAccount cicd-token, limited to the namespace apps.

 

ClusterRole과 ServiceAccount 개념

1. ClusterRole

  • ClusterRole: Kubernetes의 RBAC(Role-Based Access Control)에서 사용되는 리소스로, 클러스터 전체에서 리소스에 대한 권한을 정의
  • ClusterRole: 특정 리소스와 동작(예: create, update, delete, get 등)에 대해 권한을 부여
  • 클러스터의 모든 네임스페이스에 적용되거나, 특정 네임스페이스에 적용될 수 있음
사용 시나리오:
  • 클러스터 관리자 또는 특정 리소스(예: nodes, persistentvolumes)에 대한 전역 권한이 필요할 때.
  • 특정 네임스페이스한정된 권한을 주고 싶을 때는 ClusterRole과 RoleBinding을 결합하여 사용

2. ServiceAccount

  • ServiceAccount: Kubernetes Pod에서 실행되는 애플리케이션이 API 서버와 상호작용할 수 있도록 인증 정보를 제공
  • 기본적으로 모든 Pod는 네임스페이스에 있는 default ServiceAccount를 사용하지만, 보안상은 애플리케이션별로 별도의 SA를 만드는 것이 좋음
역할:
  • Pod이 Kubernetes API 서버에 접근할 때 사용하는 자격 증명(토큰)을 제공
  • 특정 역할(ClusterRole 또는 Role)과 바인딩(RBAC RoleBinding 또는 ClusterRoleBinding)하여 권한을 제한할 수 있음

3. ClusterRole과 ServiceAccount의 관계

  • ClusterRole 자체는 권한만 정의, 사용할 주체(Pod, 사용자 등)에 연결하려면 RoleBinding or ClusterRoleBinding이 필요
  • ClusterRoleBinding은 ClusterRole을 클러스터 전역 또는 특정 네임스페이스에 있는 주체(사용자, 그룹, ServiceAccount)와 연결

ClusterRole, ClusterRoleBinding, ServiceAccount 구성 예시

1. ClusterRole 정의

Deployment, StatefulSet, DaemonSet 리소스에 대한 create 권한을 부여

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: deployment-clusterrole
rules:
  - apiGroups: ["apps"] # Deployment, StatefulSet, DaemonSet 리소스가 속한 그룹
    resources:
      - deployments
      - statefulsets
      - daemonsets
    verbs:
      - create

2. ServiceAccount 생성

apps 네임스페이스에서 사용할 ServiceAccount cicd-token을 생성

apiVersion: v1
kind: ServiceAccount
metadata:
  name: cicd-token
  namespace: apps

3. ClusterRoleBinding 생성

deployment-clusterrole 권한을 apps 네임스페이스의 cicd-token ServiceAccount에 연결

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cicd-token-binding
  namespace: apps
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: deployment-clusterrole
subjects:
  - kind: ServiceAccount
    name: cicd-token
    namespace: apps

요약

  1. ClusterRole:
    • 권한만 정의하며, Deployment, StatefulSet, DaemonSet에 대한 create 권한을 제공
  2. ServiceAccount:
    • Pod 또는 CI/CD 프로세스가 Kubernetes API와 상호작용하기 위한 인증 정보를 제공
  3. RoleBinding:
    • 특정 네임스페이스(여기서는 apps) 내에서 ServiceAccount와 ClusterRole을 연결

이 설정을 통해 cicd-token ServiceAccount를 사용하는 애플리케이션은 apps 네임스페이스 내에서 Deployment, StatefulSet, DaemonSet 리소스를 생성할 수 있다~

 


문제 풀이

 

1. 컨텍스트 변경

kubectl config use-context k8s

 

2. deployment-clusterrole 클러스터 롤 생성

kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployment,statefulset,daemonset

팁으로 kubectl create clusterrole -h로 도움말에 있는 명령어를 복사해서 사용

 

3. app-team1 네임 스페이스에 서비스 계정 생성

kubectl create sa cicd-token -n app-team1

 

4. 롤 바인딩 생성

주의 사항)

지문에서 ClusterRole을 생성 하라고 했지만,

롤을 바인딩 할 옵션을 롤 바인딩 혹은 클러스터롤바인딩중 어느 것을 쓰라고 지정하지는 않았음!

 

특정 네임스페이스 app-team1에서만 리소스 (deployment, statefulset, daemonset)을 생성할 수 있는 권한을 주라는 뜻이므로

클러스터 롤 바인딩이 아닌 그냥 롤 바인딩을 해야 한다는 뜻이다. (클러스터 롤 바인딩은 특정 네임스페이스에 영향 X)

 

은 그 롤이 속한 네임스페이스에 한 곳에만 적용되고, 클러스터롤은 특정 네임스페이스에 대한 권한이 아닌 클러스터 전체에 대한 권한을 관리

kubectl create rolebinding cluster-admin-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token -n app-team1 // 반드시 app-team1 네임스페이스에 롤바인딩을 구성해줘야함

kubectl create rolebinding cluster-admin-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token -n app-team1 
// 반드시 app-team1 네임스페이스에 롤바인딩을 구성해줘야함

 

5. 작업 최종 확인

권한 점검

kubectl auth can-i create deployment -n app-team1 --as=system:serviceaccount:app-team1:cicd-token

→ yes (app-team1 네임스페이스에는 deployment를 생성 가능하다는 뜻)

 

kubectl auth can-i create deployment -n default --as=system:serviceaccount:default:cicd-token

kubectl auth can-i create deployment -n default --as=system:serviceaccount:default:cicd-token

→ no (default 네임스페이스에서는 deployment를 만들 수 없다는 뜻)