반응형
1. Service Account란?
Kubernetes에서 Service Account(SA) 는 Pod가 Kubernetes API 서버와 상호작용할 때 사용하는 계정이다.
즉, Pod 내부의 애플리케이션이 API 요청을 수행할 때 사용되는 인증 메커니즘이다.
기본적으로 Kubernetes에서는 다음과 같은 두 가지 유형의 계정이 있다:
- User Account (사용자 계정)
- Kubernetes 외부에서 클러스터에 접근하는 실제 사용자를 위한 계정.
- 예: 개발자가 kubectl apply 명령을 실행할 때 사용되는 계정.
- RBAC(Role-Based Access Control)과 결합하여 사용자가 수행할 수 있는 작업을 제한 가능.
- Service Account (서비스 계정)
- Pod 내부의 프로세스가 Kubernetes API와 통신할 때 사용되는 계정.
- 기본적으로 네임스페이스별로 자동 생성됨.
- kubectl exec 또는 kubectl proxy 같은 명령을 실행하는 사용자 계정과 다름.
- RBAC와 결합하여 Pod가 수행할 수 있는 작업을 제한 가능.
2. Service Account 동작 방식
- 각 네임스페이스(namespace) 마다 기본적으로 default라는 서비스 계정이 자동으로 생성됨.
- Pod이 생성되면, 기본적으로 해당 네임스페이스의 default 서비스 계정을 사용하게 됨.
- 서비스 계정이 Pod에 할당되면, Kubernetes는 Pod 내부에 인증 토큰을 주입하여 API 요청 시 사용 가능하도록 설정함.
- Pod 내부 애플리케이션이 Kubernetes API에 접근할 경우, 해당 서비스 계정의 RBAC 권한에 따라 API 요청이 허용 또는 거부됨.
3. 기본 Service Account 확인
네임스페이스 내 기본 서비스 계정을 확인하려면:
kubectl get serviceaccounts -n default
출력 예시:
NAME SECRETS AGE
default 1 5d
- default라는 이름의 서비스 계정이 존재함.
기본 서비스 계정의 상세 정보를 확인하려면:
kubectl get serviceaccount default -o yaml
출력 예시:
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
namespace: default
secrets:
- name: default-token-abcde
- secrets 항목을 보면, Kubernetes API에 접근할 때 사용할 토큰(default-token-abcde)이 자동 생성되어 있음.
4. 새로운 Service Account 생성
Pod이 기본 default 서비스 계정이 아닌 새로운 계정을 사용하도록 설정하려면, 새로운 Service Account를 생성해야 한다.
(1) Service Account YAML 예제
아래는 my-service-account라는 이름의 서비스 계정을 생성하는 예제이다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account
namespace: default
적용 방법:
kubectl apply -f sa.yaml
생성된 서비스 계정을 확인하려면:
kubectl get serviceaccounts -n default
NAME SECRETS AGE
default 1 5d
my-service-account 1 1m
5. 특정 Service Account를 Pod에 적용
Pod이 특정 서비스 계정을 사용하도록 설정하려면, Pod 스펙에서 serviceAccountName을 지정해야 한다.
(1) Service Account 적용된 Pod YAML 예제
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: default
spec:
serviceAccountName: my-service-account
containers:
- name: my-container
image: busybox
command: ["sleep", "3600"]
- serviceAccountName: my-service-account을 명시하여 Pod이 my-service-account를 사용하도록 설정함.
Pod을 생성한 후, 적용된 서비스 계정을 확인하려면:
kubectl get pod my-pod -o jsonpath='{.spec.serviceAccountName}'
출력 예시:
my-service-account
6. Service Account와 RBAC(Role-Based Access Control) 연동
서비스 계정에 특정 권한을 부여하려면 Role 또는 ClusterRole과 RoleBinding 또는 ClusterRoleBinding을 사용해야 한다.
(1) 특정 네임스페이스 내에서만 리소스 접근 가능하도록 설정
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: default
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: default
subjects:
- kind: ServiceAccount
name: my-service-account
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
설명
- my-service-account가 default 네임스페이스 내 pods 리소스를 get, list, watch할 수 있도록 RoleBinding을 설정함.
(2) 클러스터 전체에서 리소스 접근 가능하도록 설정
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-admin-access
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-binding
subjects:
- kind: ServiceAccount
name: my-service-account
namespace: default
roleRef:
kind: ClusterRole
name: cluster-admin-access
apiGroup: rbac.authorization.k8s.io
설명
- my-service-account가 클러스터 전체에서 모든 리소스에 대해 모든 작업(get, list, watch, create, update, delete)을 수행할 수 있도록 설정됨.
- 주의: ClusterRole을 사용할 경우, 서비스 계정이 클러스터 내 모든 리소스에 접근할 수 있으므로 신중하게 사용해야 함.
7. Service Account 토큰 확인 및 사용
서비스 계정이 API 서버에 접근할 때 사용하는 토큰을 확인하는 방법:
(1) 서비스 계정에 연결된 토큰 Secret 확인
kubectl get secret -n default
출력 예시:
NAME TYPE DATA AGE
default-token-abcde kubernetes.io/service-account-token 3 5d
my-service-account-token-xyz123 kubernetes.io/service-account-token 3 1m
(2) 토큰 확인
kubectl get secret my-service-account-token-xyz123 -o jsonpath='{.data.token}' | base64 --decode
출력 예시:
eyJhbGciOiJSUzI1NiIsImtpZCI6Ik5aMld6V2E1Z1EifQ...
이 토큰을 사용하여 Kubernetes API 요청을 보낼 수 있다.
8. 결론
- Service Account는 Pod이 Kubernetes API에 접근할 때 사용하는 계정이다.
- 기본적으로 각 네임스페이스에는 default 서비스 계정이 존재하며, 모든 Pod은 기본적으로 이를 사용함.
- 별도의 서비스 계정을 생성하여 특정 Pod에 적용할 수 있으며, RBAC를 활용해 권한을 제한할 수 있음.
- Role 또는 ClusterRole과 RoleBinding 또는 ClusterRoleBinding을 조합하여 서비스 계정이 수행할 수 있는 작업을 세밀하게 제어할 수 있음.
- API 요청을 수행할 때는 서비스 계정의 토큰을 활용할 수 있음.
반응형
'K8S' 카테고리의 다른 글
[kubernetes] API groups 를 활용하여 리소스 제어 (0) | 2025.03.04 |
---|---|
[kubernetes] rolebinding과 clusterrolebinding 할당하는 리소스 (0) | 2025.03.04 |
[kubernetes] role이 할당하는 resource 종류 (0) | 2025.03.04 |
[kubernetes] RBAC와 role (0) | 2025.03.04 |
[kubernetes] karpenters의 limit range - default vs defaultRequest (0) | 2025.01.26 |
댓글