[CKA] ClusterRole, ServiceAccount, Rolebinding
- 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
요약
- ClusterRole:
- 권한만 정의하며, Deployment, StatefulSet, DaemonSet에 대한
create
권한을 제공
- 권한만 정의하며, Deployment, StatefulSet, DaemonSet에 대한
- ServiceAccount:
- Pod 또는 CI/CD 프로세스가 Kubernetes API와 상호작용하기 위한 인증 정보를 제공
- 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를 만들 수 없다는 뜻)