개요
k8s에서의 Service Account에 대하여 알아 보겠습니다.
Service Account란?
https://doitnow-man.tistory.com/entry/CKA-41-service-account
Pod 안에서 SeviceAccount
기본적으로 namespace 별로 존재하는 default serviceaccount가 Pod에 할당이 됩니다. 하지만 기능이 매우 제한 적이기 때문에 Pod에서 더많은 k8s기능을 사용하기 위해서는 새로운 ServiceAccount를 생성후 아래와 같이 Pod definition에 명시를 해야합니다.
serviceAccountName 필드를 사용하여 Pod에 ServiceAccount 할당이 가능합니다.
serviceaccount는 Pod에 할당 하는 것이다. 그리고 service account 사용을 위해서는 Token이 필수로 service acount와 연결이 되어있어야 합니다.
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
serviceAccountName: my-service-account
containers:
- name: example-container
image: nginx
Token생성
service account는 token을 사용하여 인증처리를 진행합니다. 그래서 token을 만들고 service account에 연결해 주어야 합니다.
token관련 변경사항
Kubernetes 1.24부터 ServiceAccount를 생성할 때 자동으로 토큰이 생성되지 않으므로 수동으로 생성해야 한다.
token 생성의 2가지 방법
Secret Object
장기간 token을 사용하고 싶을 때 사용. 그러나 보안상 취약 함으로 추천하지 않습니다.
https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#manually-create-a-long-lived-api-token-for-a-serviceaccount
apiVersion: v1
kind: Secret
metadata:
name: build-robot-secret
annotations:
kubernetes.io/service-account.name: my-service-account
type: kubernetes.io/service-account-token
TokenRequest API
TokenRequest API를 사용하여 수명을 가진 token을 생성하는 방법입니다. 그리고 token은 수명이 다하면 자동으로 회전을 합니다. TokenRequest API는 다음 명령으로 생성이 가능합니다
kubectl create token [serviceaccountname] --namespace [namespace]
kubectl create token my-servcei-account --namespace default
참고 : kubectl create token에 대한 --duration 명령줄 인수를 사용하여 특정 토큰 기간을 요청할 수 있습니다(발행된 토큰의 실제 기간은 더 짧을 수도 있고 더 길 수도 있습니다).
제약 사항 : 이 API를 사용하려면 쿠버네티스 클러스터가 Service Account Token Volume Projection 기능을 지원해야 합니다.
위와 같이 할 당시 /var/run/secrets/kubernetes.io/serviceaccount 에 ServiceAccount에 대한 Token 정보가 mount됩니다.
Service Account 자동 mount막기
보안은 위해서 ServiceAccount가 자동으로 Pod에 mount되는 것을 automountServiceAccountToken: false 통해서 막을수 있습니다. 이렇게 될 경우 ServiceAccount를 사용하기 위해서 사용자가 수동으로 ServiceAccount의 Secret 정보를 Volume으로 mount해주어야 합니다.
Pod에서 automountServiceAccountToken: false 적용한 예제
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account
automountServiceAccountToken: false
ServiceAccount에 automountServiceAccountToken: false 적용한 에제
해당 ServiceAccount를 사용하는 Pod에는 자동으로 ServiceAccount Token이 mount되지 않습니다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account
automountServiceAccountToken: false
유의 사항
Pod에 설정된 ServiceAccount를 변경하기 위해서는 Pod를 삭제 후 다시 생성해야 합니다.
정리
ServiceAccount는 Pod에 k8s의 권한을 부여 할 때 사용한다.
Pod에 ServiceAccount를 할당하면 ServiceAccount의 token 정보가 /var/run/secrets/kubernetes.io/serviceaccount 에 mount됩니다. 그래서 Pod는 해당 Token을 사용하여 인증을 수행합니다.
'Cloud > k8s-CKAD' 카테고리의 다른 글
[CKAD] 시험 미흡 사항 (0) | 2024.08.21 |
---|---|
[CKAD] Resource 제어, resource/LimitRange/ResourceQuotas (0) | 2024.08.12 |
[CKAD] Security Context (0) | 2024.04.23 |
[CKAD] 환경 변수 Configmap 과 Secret 사용하기 (0) | 2024.01.30 |
[CKAD] Dockerfile과 yaml 실행 필드 관련 관계 (1) | 2024.01.29 |