RBAC(Role-Based Access Control)을 사용하여 특정 네임스페이스에서 Pod를 읽을 수 있는 권한을 가진 ServiceAccount를 생성하고 관리하는 방법을 배운다.
임의의 네임스페이스 생성
alias k='microk8s kubectl' # 빠른 입력을 위한 alias 생성
k create namespace my-namespace
필요한 Role 생성
role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: my-namespace
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
ServiceAccount 생성
Pod를 읽을 권한을 할당할 ServiceAccount를 생성
serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-reader-sa
namespace: my-namespace
RoleBinding 생성
ServiceAccount에 Role을 바인딩하여 권한을 할당
rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods-binding
namespace: my-namespace
subjects:
- kind: ServiceAccount
name: pod-reader-sa
namespace: my-namespace
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
k apply -f <배포할 파일이름들>.yaml
Pod 배포하여 테스트
테스트를 위해 네임스페이스에 Pod를 배포
test-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: my-namespace
spec:
containers:
- name: nginx
image: nginx
Token을 통해 kubeconfig 생성하여 확인
ServiceAccount의 토큰을 가져와 kubeconfig 파일을 생성
# ServiceAccount의 시크릿 이름을 변수에 저장
# 여기서는 'pod-reader-sa-token'이라는 이름을 사용하고 있습니다.
SECRET_NAME=pod-reader-sa-token
# ServiceAccount 토큰 추출 및 디코딩
TOKEN=$(k get secret $SECRET_NAME -n my-namespace -o jsonpath='{.data.token}' | base64 --decode)
# 설명:
# k get secret $SECRET_NAME -n my-namespace : 지정된 네임스페이스에서 시크릿을 가져옵니다.
# -o jsonpath='{.data.token}' : 시크릿 데이터에서 token 필드만 추출합니다.
# | base64 --decode : 추출된 토큰을 base64 디코딩합니다 (쿠버네티스는 시크릿을 base64로 인코딩하여 저장).
# 추출된 토큰 출력
echo $TOKEN
# 이 토큰은 JWT(JSON Web Token) 형식으로, 쿠버네티스 API 서버 인증에 사용될 수 있습니다.
이 토큰을 통해서 실습이 진행되므로 저장해둬야 한다.

ServiceAccount의 Secret 이름과 토큰을 가져오기
kubeconfig-sa.yaml
apiVersion: v1
kind: Config
clusters:
- cluster:
certificate-authority-data: $(k config view --raw -o jsonpath="{.clusters[0].cluster.certificate-authority-data}")
server: https://127.0.0.1:16443
name: microk8s-cluster
contexts:
- context:
cluster: microk8s-cluster
namespace: my-namespace
user: pod-reader-sa
name: pod-reader-context
current-context: pod-reader-context
users:
- name: pod-reader-sa
user:
token: $TOKEN
kubeconfig 파일을 사용하여 인증
KUBECONFIG=kubeconfig-sa.yaml k get pods -n my-namespace
Token을 사용하여 API 호출 테스트
api 주소 확인
k config view --raw -o jsonpath="{.clusters[0].cluster.server}"
주소와 토큰을 넣어서 api호출 테스트
Authorization 헤더와 토큰을 사용하여 인증
성공적으로 API 서버에 접근하여 PodList를 반환받음
curl -k -H "Authorization: Bearer $TOKEN" $APISERVER/api/v1/namespaces/my-namespace/pods

SSL 인증서 문제로 연결에 실패

Kubectl exec -it pod #pod 내부에 bash 셸 시작
Kubectl get pods, apply, create, delete # 클러스터 리소스 관리
Kubectl config view --raw #설정 출력
RBAC 권한과 관리 실습을 해보기위해 Role을 알아보고 네임스페이스를 설정해서 직접 pod 를 배포하고 토큰과 api 주소를 이용해서 pod목록을 받아보는 실습을 진행했다. 쿠버네티스의 보안에서 RBAC는 상당히 중요한 주제중 하나인데, 이를 깊이있게 탐구해볼수 있었다.