Skip to content

Commit

Permalink
Feat: Add Service_Account summary #10
Browse files Browse the repository at this point in the history
  • Loading branch information
luckylooky2 committed Jan 12, 2024
1 parent ffa70a6 commit de7f8be
Showing 1 changed file with 132 additions and 0 deletions.
132 changes: 132 additions & 0 deletions practice/chanhyle/role/08-Service_Account.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
## Service Account

- SA는 다른 보안 개념(authentication, authorization, RBAC 등..)과 관련이 있음
- CKA에서는 SA와 관련 개념들이 어떻게 작동하는지만 알면 된다(SA 자체를 이해하지 않아도 된다)
- User Account / Service Account : 두 가지 타입의 계정이 존재

### User Account

- 사람에 의해서 사용됨
- Admin : administrative task를 하기 위해서
- Developer : application을 배포(deploy)하기 위해

### Service Account

- machine에 의해서 사용됨
- Application이 클러스터와 소통하기 위해서 사용됨
- Prometheus : 모니터링 어플리케이션이 성능 메트릭을 위해 kubernetes API를 이용
- Jenkins : 빌드 툴이 어플리케이션을 배포하기 위해 이용
- e.g.
- 배포할 때 수행하는 모든 작업은 쿠버네티스 API에 요청을 전송하여 쿠버네티스 클러스터의 포드 목록을 검색하고 웹 페이지에 표시하는 것입니다.
- 웹 어플리케이션이 쿠버네티스 API에 쿼리하기 위해서는 “인증”이 필요하다. 그래서 SA를 이용한다

```shell
# 생성
$> k create serviceaccount dashboard-sa
# 조회
$> k get serviceaccount
$> K describe serviceaccount dashboard-sa
```

#### 토큰 자동 생성(Deprecated)

- SA가 생성되면 자동적으로 “토큰”을 생성
- 토큰은 외부 앱이 kube API에 인증하는 과정에서 필요하다
- 생성되는 토큰은 만료기간이 없고, 어떤 audience에도 제한받지 않음
- deploy하는 파드가 클러스터 내부에 있다면, 자동으로 default SA를 사용하는 파드에 볼륨 마운트 되는 성질을 가지고 있음
- 생성 과정
1. 토큰을 먼저 생성하고, 비밀 오브젝트를 생성한 후 거기에 담는다
2. 이후 SA와 비밀 오브젝트가 링크된다
3. `k describe secret dashboad-sa-token-kbbdm` 으로 토큰 값을 확인할 수 있다
- 이후 버전에서는 토큰 이름을 알려주지 않는 듯?
- 이 (베어러) 토큰은 kubernetes API로 REST API 요청을 만들 때 사용될 수 있다

```shell
$> curl https://~:6443/api -insecure —header “Authorization: Bearer ~
```

- 웹 앱에서 유저가 토큰 필드를 저장하게 하여 인증 수단으로서 요청할 때 사용한다
(계정당 SA를 발급하게 하는 기능도 필요할 듯?)

### 파드에 토큰 자동 마운트(Deprecated)

- SA를 생성하여
- RBAC을 통해 적절한 권한을 설정하고(여기서는 다루지 않음)
- 토큰을 추출하여 사용자에게 전달하고
- 서드 파티 앱에서 이 토큰을 사용하여 kubernetes REST API를 호출하게 한다

#### 만약 서드 파티 앱이 클러스터 내부에서 배포되었다면?

- 예를 들어, 대시보드, 모니터링 앱이 클러스터에서 배포된다면? **서비스 시크릿 토큰을 서드 파티 앱이 있는 파드 안에 볼륨으로 마운트 함으로써 간단하게 만들 수 있다**
- 일일이 손으로 하지 않아도 되는 과정이 있나?
- 앱이 쉽게 읽을 수 있기 때문에(내부가 아니라면? 외부 디비에서 관리해야 하나?)

#### default SA

- ns마다 생성되어 있음
- 파드가 생성되면, default SA와 토큰이 파드에 “자동으로“ 볼륨 마운트 된다
- Default 토큰은 만료 기간이 없음(토큰은 SA가 존재하는 한 유효함)
- 파드 def에 명시하지 않아도 describe를 해보면, volume에 deafult-token이 존재
- 마운트된 지점은 `/var/run/secrets/kubernetes.io/serviceaccount` (파드 안의 경로)

```shell
$> k exec -it my-kubernetes-dashboad ls /var/run/secrets/kubernetes.io/serviceaccount

# token 파일이 존재
```

- 하지만 default SA는 매우 제한적인 단점이 있다
- 간단한 기본적인 kube API 쿼리에만 허용이 되어 있다

#### 새로운 SA를 파드에 포함하기 위해서는?

- [Pod definition file] Spec > serviceAccountName 항목을 추가하면 됨
- 단, 이미 올라간 파드의 SA는 변경할 수 없음(지우고 새로 파드를 생성해야 적용됨)
- 하지만 배포 환경에서는 pod def를 수정할 수 있지만, “deployments”가 자동으로 rollout 되는 것에 주의
- 즉, deployments가 바뀐 SA를 적용하기 위해 rollout
- 자동으로 default SA가 마운트되게 하지 않으려면?
- Pod def Spec > automountServiceAccountToken : false 추가

### 1.22

- `tokenRequestedAPI`의 추가
- Audiencd/time/object bound, more secure via kube API
- 따라서, 이제 파드가 생성되면 SA 시크릿 토큰에 의존하지 않음
- tokenRequestedAPI에 의해 만료 시간이 존재하고, projected bolume에 저장되는 토큰을 생성

### 1.24

```shell
$> kubectl create token dashboard-sa
```

- 토큰을 따로 발급해야 함
- SA를 만든다고 해서 자동으로 토큰이 발급되지 않음
- 이전 버전처럼 만료가 없는 토큰을 생성하기 위해서는?

```c
// secret-definition.yml
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
Name: mysecretname
annotaion:
kubernetes.io/service-account.name: dashboard-sa
```

- 위의 예에서는 특정 SA와 관련된 만료가 없는 토큰을 생성하는 방법(SA 생성이 전제됨)
- 특별한 상황이 아니면, tokenRequestedAPI이 추천됨

## 명령어 모음

```shell
$> k get sa -n default
$> k describe sa default
$> k get deployments
$> k describe deployments web-dashboard
$> k describe pod web-dashboard-97c9c59f6-rmdbk
$> k create sa dashboard-sa
$> k describe rolebindings / roles
$> kubectl create token dashboard-sa
```

0 comments on commit de7f8be

Please sign in to comment.