Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #13: ServiceAccount (정책 및 접근 제어 리소스)

ygtoken 2025. 3. 5. 00:32
728x90

Kubernetes에서는 Pod가 클러스터 내부 리소스(Kubernetes API, 다른 서비스 등)에 접근할 필요가 있을 때가 있습니다.
이때 사용하는 것이 ServiceAccount입니다.

이번 글에서는 ServiceAccount의 개념, 사용 목적, 그리고 실전 활용법을 정리하겠습니다.


🔹 ServiceAccount란?

ServiceAccountPod가 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 인증 가능

 

728x90