본문 바로가기

About/Kubernetes

[k8s] 쿠버네티스의 계정 - User Account, Service Account

사용자 계정(User Account)

쿠버네티스는 '사람'을 관리하는 장치를 가지고 있지 않습니다. 정확히 말하자면 일반 사용자를 나타내는 오브젝트가 없습니다. 쿠버네티스는 일반 사용자의 관리를 외부에게 맡기고 있습니다. 여기서 외부란 Azure AD나 Google 계정과 같은 ID 관리 시스템입니다. 일반 사용자는 외부에서의 인증을 거친 후에 쿠버네티스의 리소스를 조작합니다.

여러 클러스터를 조합하여 사용하는 것이 당연시되므로 모든 시스템이나 서비스에서 개별적으로 사용자 ID를 관리하는 것이 어려움을 더 증가시키는 것이 쿠버네티스 자체에서 ID를 관리하지 않는 이유입니다. 여러 클러스터를 사용하던 사용자가 회사를 관둔다면 해당 ID를 돌아다니며 삭제하는 절차를 만들어야할 것입니다.

서비스 계정(Service Account)

쿠버네티스에는 사용자 계정 외에 서비스 계정이 있습니다. 주로 파드에 할당합니다. 사용자 계정을 이용하여 파드 안의 컨테이너, 애플리케이션에서 쿠버네티스 API에 액세스할 수 있도록 합니다. 

서비스 계정은 쿠버네티스 고유의 개념이 아니라 일반적으로 사용되는 말인데, 사람이 아니라 애플리케이션이나 시스템 프로그램의 식별, 인증, 인가를 위한 계정입니다. 애플리케이션이나 시스템 프로그램이 리소스를 조작할 때 사람과 마찬가지로 인증과 인가를 요구하는 경우가 많습니다. 서비스 계정은 이를 위해 존재합니다.

파드가 서비스 계정에 어떻게 연결되어 있는지는 다음 예시를 통해서 알아보겠습니다.

다음 명령어를 통해 간단하게 Nginx 파드를 생성합니다.

$ kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
cs

 

그리고 다음과 같이 파드의 정의를 살펴봅니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ kubectl get pods
NAME                     READY   STATUS    RESTARTS      AGE
nginx-6799fc88d8-nqhb6   1/1     Running   0             119s
 
$ kubectl get pod nginx-6799fc88d8-nqhb6  -o yaml
apiVersion: v1
kind: Pod
~중략~
spec:
  containers:
    ~중략~
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-xwfxd # 토큰을 마운트함
      readOnly: true
  ~중략~
  serviceAccount: default # 기본값 Service Account
  serviceAccountName: default # 기본값 Service Account 명
  ~중략~
  volumes:
  - name: kube-api-access-xwfxd
    projected:
      defaultMode: 420
      sources:
      # 토큰 정보
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap: # ConfigMap 참조
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
~중략~
cs

12-15번 줄에 파드에 Volume으로 들어 있는 시크릿이 정의되어 Nginx 컨테이너에 마운트되어 있습니다. 

17-18번 줄에서 서비스 계정도 정의되어 있습니다. 아무것도 지정하지 않았으므로 default라는 서비스 계정입니다.

26~33번줄에 토큰 정보가 정의되어 있고, ConfigMap을 참조하는 것을 알 수 있습니다.

nginx 컨테이너를 직접 열어 마운트되어 있는 /var/run/secrets/kubernetes.io/serviceaccount 폴더를 살펴보겠습니다.

1
2
3
4
$ kubectl exec -it nginx-6799fc88d8-nqhb6 /bin/bash
 
root@nginx-6799fc88d8-nqhb6:/$ ls /var/run/secrets/kubernetes.io/serviceaccount/
ca.crt    namespace  token
cs

SSH나 TLS에 통신에 필요한 증명서나 인증용 토큰이 놓여있습니다. 이것을 사용하여 파드에서 API Server로 액세스할 수 있습니다.

또한 서비스 계정은 파드뿐만 아니라 사람이나 툴의 인증과 인가에도 사용할 수 있습니다. 서비스 계정을 만들고 필요한 config 파일을 생성하고 단말기나 서버에 배포함으로서 거기서 작업하는 사람이나 툴이 쿠버네티스 API를 조작할 수 있게 합니다.


쿠버네티스의 User Account와 Service Account에 대하여 알아보았습니다.

참고

http://www.yes24.com/Product/Goods/78875805

 

완벽한 IT 인프라 구축의 자동화를 위한 Kubernetes 쿠버네티스 - YES24

Azure를 사용한 쿠버네티스의 개념 파악과 실전 응용이 책은 쿠버네티스를 처음 사용하는 업무 애플리케이션 개발자 및 도커에 대한 기초 지식이 있는 분을 대상으로 컨테이너 오케스트레이션

www.yes24.com