-
io.kubernetes.client.openapi.ApiException configmaps is forbiddenDevOps/Kubernetes 2024. 4. 8. 17:53
io.kubernetes.client.openapi.ApiException: Message: HTTP response code: 403 HTTP response body: { "kind":"Status", "apiVersion":"v1", "metadata":{}, "status":"Failure", "message":"configmaps is forbidden: User \"system:serviceaccount:default:default\" cannot list resource \"configmaps\" in API group \"\" in the namespace \"default\"", "reason":"Forbidden", "details":{"kind":"configmaps"}, "code":403 }
RBAC가 활성화 되어있는 쿠버네티스 클러스터에서 pod 내에 자바 client api를 이용한 어플리케이션을 띄워 클러스터 내에 동적으로 configMap 리소스를 만드려는 도중 다음의 에러를 발견했다. 인증에 실패한 서비스 어카운트는 다음과 같다.
User: system:serviceaccount:default:default > system:serviceaccount:<namespace>:<service account name>
파드내에 어플리케이션을 띄우고 해당 어플리케이션에서 특정 쿠버네티스 클러스터 API 서버에 접속하려 한다면 인증 플러그인이 서비스 어카운트를 인증하는 과정을 거치게 되고 별다른 서비스 어카운트를 지정하지 않는다면 deployment 리소스에 정의한 네임스페이스와 서비스 어카운트를 따라가게 된다. ( 나의 어플리케이션에 경우 ns : default , sa : 지정하지 않았기에 default)
서비스 어카운트의 기본 권한으로는 리소스를 나열하거나 수정할 수 없다. 수정에 대한 롤을 만들고 서비스 어카운트에 롤을 바인딩해보자. 우선 default 서비스 어카운트를 그대로 사용하지는 않았는데 default 서비스 어카운트에 롤을 변경한다면 다른 서비스들까지 보안상의 위협이 될 수도 있을거라 생각했기 때문이다. 새로운 서비스 어카운트를 생성하고 파드에 어플리케이션을 띄울때 해당 서비스 어카운트를 이용하도록 변경하였다.
kubectl create serviceaccount {이름}
이제 해당 서비스 어카운트가 롤을 이용할 수 있도록 롤과 롤바인딩을 생성해주자. 간단히 롤은 리소스에 수행할 수 있는 것들 ( 수정, 조회등 ) 지정하는 것이며 롤 바인딩은 누가 이 룰을 사용할 수 있는지를 지정하는 것이다.
1. 롤 생성
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: {이름} namespace: default rules: - verbs: - '*' apiGroups: - '' resources: - configmaps - deployments
2. 롤 바인딩
kubectl create rolebinding {롤 바인딩 이름} --role={ 롤 이름 } --serviceaccount={네임스페이스:서비스 어카운트 이름}
에러 해결후 정상적으로 configMap 이 생성되었다. 그런데 deployment 생성시 롤을 추가해도 동일한 에러가 발생하였다.
io.kubernetes.client.openapi.ApiException: Message: HTTP response code: 403 HTTP response body: { "kind":"Status", "apiVersion":"v1", "metadata":{}, "status":"Failure", "message":"deployments.apps is forbidden: User \"system:serviceaccount:default:keyword\" cannot list resource \"deployments\" in API group \"apps\" in the namespace \"default\"", "reason":"Forbidden", "details":{"group":"apps","kind":"deployments"}, "code":403 }
cluster-admin 클러스터 롤을 해당 서비스 어카운트에 클러스터 롤 바인딩 시켜 해결
kubectl create clusterrolebinding {클러스터 롤 바인딩 이름} --clusterrole=cluster-admin --serviceaccount=default:{서비스 어카운트 이름}
참고
- 쿠버네티스 인 액션
- https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
'DevOps > Kubernetes' 카테고리의 다른 글
k8s service 에서 label 을 바꿀때의 다운타임? (0) 2022.04.25 Deployment의 파드가 서비스의 대상이 되려면 (0) 2022.03.30 clusterRole, clusterRoleBinding (0) 2021.10.29 Kubernetes 인그레스 요청 흐름 (0) 2021.07.19 kubernetes Tutorials 4. 서비스를 사용해서 App을 공개하기 (0) 2020.05.06