Kubernetes에서는 Pod가 클러스터 내부 리소스(Kubernetes API, 다른 서비스 등)에 접근할 필요가 있을 때가 있습니다.
이때 사용하는 것이 ServiceAccount입니다.
이번 글에서는 ServiceAccount의 개념, 사용 목적, 그리고 실전 활용법을 정리하겠습니다.
🔹 ServiceAccount란?
ServiceAccount는 Pod가 Kubernetes API 및 다른 리소스에 접근할 때 사용하는 인증 계정입니다.
✔️ Pod가 특정 권한을 가지고 Kubernetes API와 상호작용할 수 있도록 설정
✔️ 기본적으로 모든 Pod는 default ServiceAccount를 사용
✔️ RBAC(Role-Based Access Control)과 함께 사용하여 API 접근을 제한 가능
💡 ServiceAccount는 사람이 아닌 애플리케이션(Pod)이 Kubernetes 내에서 권한을 가질 수 있도록 하는 계정입니다.
🔹 기본 ServiceAccount 확인
Kubernetes는 각 네임스페이스에 기본적으로 default ServiceAccount를 생성합니다.
kubectl get serviceaccounts --namespace=default
출력 예시:
NAME SECRETS AGE
default 1 10d
💡 모든 Pod는 기본적으로 default ServiceAccount를 사용합니다.
🔹 새로운 ServiceAccount 생성
Pod가 Kubernetes API를 안전하게 사용할 수 있도록, 새로운 ServiceAccount를 생성하고 이를 Pod에 적용할 수 있습니다.
apiVersion: v1
kind: ServiceAccount # ServiceAccount 리소스 선언
metadata:
name: custom-sa # ServiceAccount 이름
namespace: default # 네임스페이스 지정
kubectl apply -f serviceaccount.yaml
kubectl get serviceaccounts
출력 예시:
NAME SECRETS AGE
default 1 10d
custom-sa 1 5m
💡 이제 custom-sa라는 새로운 ServiceAccount가 생성되었습니다.
🔹 ServiceAccount를 Pod에 적용
Pod가 기본 default 계정이 아닌, 새로운 ServiceAccount를 사용하도록 설정할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: api-client
spec:
serviceAccountName: custom-sa # 특정 ServiceAccount 적용
containers:
- name: api-client
image: bitnami/kubectl
command: ["sh", "-c", "kubectl get pods"]
💡 이제 이 Pod는 custom-sa 계정을 사용하여 Kubernetes API에 접근합니다.
🔹 ServiceAccount에 RBAC(Role-Based Access Control) 적용
ServiceAccount는 그 자체로는 권한이 없으며, RBAC을 통해 권한을 부여해야 합니다.
아래 예제는 custom-sa가 특정 네임스페이스의 Pod를 조회할 수 있도록 하는 RoleBinding을 생성합니다.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: default
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: default
subjects:
- kind: ServiceAccount
name: custom-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
💡 이제 custom-sa를 사용하는 Pod는 default 네임스페이스의 Pod 목록을 조회할 수 있습니다.
🔹 ServiceAccount의 Token 확인
ServiceAccount가 Kubernetes API에 인증할 때 토큰(Token)이 필요합니다.
kubectl get secret -n default
출력 예시:
NAME TYPE DATA AGE
custom-sa-token-abcde kubernetes.io/service-account-token 1 5m
💡 토큰을 확인하려면 다음 명령어를 사용합니다.
kubectl get secret custom-sa-token-abcde -o yaml
💡 이 토큰을 사용하여 외부 애플리케이션에서 Kubernetes API를 호출할 수도 있습니다.
🔹 ServiceAccount를 활용한 API 인증
ServiceAccount를 사용하여 외부에서 Kubernetes API를 호출할 수도 있습니다.
아래 예제는 curl을 사용하여 API를 호출하는 방법입니다.
1️⃣ API 서버 주소 확인
kubectl cluster-info
출력 예시:
Kubernetes control plane is running at https://<API_SERVER>
2️⃣ ServiceAccount Token 추출
TOKEN=$(kubectl get secret custom-sa-token-abcde -o jsonpath='{.data.token}' | base64 --decode)
3️⃣ API 호출
curl -H "Authorization: Bearer $TOKEN" -k https://<API_SERVER>/api/v1/namespaces/default/pods
💡 이제 외부에서 custom-sa를 사용하여 Kubernetes API를 호출할 수 있습니다.
🔹 ServiceAccount 삭제
kubectl delete serviceaccount custom-sa
kubectl delete role pod-reader
kubectl delete rolebinding pod-reader-binding
💡 ServiceAccount가 삭제되면 해당 계정을 사용하던 Pod는 API에 접근할 수 없습니다.
🚀 마무리
✔️ ServiceAccount는 Pod가 Kubernetes API에 접근할 수 있도록 하는 계정
✔️ 기본적으로 default ServiceAccount를 사용하지만, 새로운 계정을 생성하여 사용할 수 있음
✔️ RBAC과 함께 사용하여 특정 권한을 부여 가능
✔️ 토큰을 활용하면 외부 애플리케이션에서도 Kubernetes API 인증 가능