안녕하세요. 이 글은 CKS자격증을 공부하면서 정리한 글입니다.
1. pod와 serviceaccount 관계
pod가 내부적으로 kube api server에 API를 사용할 경우가 있습니다. 쿠버네티스 이 문제를 해결하기 위해 pod 내부에 serviceaccount token을 마운트할 수 있습니다. pod는 마운트된 token을 이용해서 kube api server에 요청과 응답을 받습니다.
2. default serviceaccount
namespace를 생성하면 자동으로 default serviceaccount가 생성됩니다. namespace를 생성하고 약 1분뒤에 serviceaccount를 조회하면 default serviceaccount가 보입니다.
kubectl create ns test
# 약 1분 뒤에
kubectl get serviceaccount -n test
serviceaccount가 생성되면 serviceaccount 토큰이 secret으로 자동생성됩니다. default serviceaccount도 마찬가지로 토큰이 secret으로 저장됩니다.
kubectl get secret -n test
3. pod에 serviceaccount 토큰 마운트
pod를 생성할때 serviceaccount필드로 serviceaccount 토큰을 마운트 할 수 있습니다. 설정하지 않으면 default serviceaccount 토큰이 마운트됩니다. 아래 yaml은 default namespace에 있는 build-robot serviceaccount 토큰은 마운트하는 예제입니다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
serviceAccountName: build-robot
busybox를 pod로 실행 한 후, 마운트 목록을 확인하면 serviceaccount 디렉터리가 보입니다.
kubectl run -it --image=busybox busybox -- /bin/sh
# df -h
kube api server ca인증서, serviceaccount token이 보입니다.
ls /var/run/secrets/kubernetes.io/serviceaccount
4. pod에서 kube api sevrer 요청
헤더에 마운트된 serviceaccount토큰을 사용하면 api server에 요청할 수 있습니다.
실습을 쉽게 하기 위해서 netshoot이미지를 사용하여 pod를 실행합니다.
kubectl run -it --image=nicolaka/netshoot netshoot -- zsh
curl 명령어로 kube api server에 요청을 날립니다. default serviceaccount은 아무 권한도 없기 때문에 forbidden응답을 받습니다.
cd /run/secrets/kubernetes.io/serviceaccount
token=$(cat token)
curl -k -H "Authorization: Bearer ${token}" https://kubernetes.default.svc
5. 마치며
default serviceaccount에 rolebinding으로 권한을 부여하거나, 권한이 있는 serviceaccount를 pod 생성시 설정하면 kube api server에 요청할 수 있습니다.
추천 예제는 pod를 생성, 조회 권한을 갖는 serviceaccount를 설정하고 jenkins pod에 설정합니다. 그리고 jenkins job에서 pod를 생성하고 조회해보세요!.
6. 참고자료
[1] [공식문서] serviceaccount: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
'전공영역 공부 기록' 카테고리의 다른 글
CKS 2편: 참고자료 소개 (0) | 2022.01.31 |
---|---|
CKS 1편: 쿠버네티스 보안 개요 (0) | 2022.01.31 |
veleor minio 백업 연습 - 작성중 (0) | 2022.01.16 |
[CKS] 시스템 보안 - App armor (0) | 2022.01.16 |
mariadb 인코딩 확인 명령어 (0) | 2022.01.09 |