namespace가 다른 pod 끼리의 통신 1
현재 o-ran sc에 구축되어있는 kubeflow에서 kfp library를 이용하여 pipeline 관련 정보를 받아오는 pod를 생성해보려고 한다. 이를 위해 여기저기 검색을 해보니 가장 먼저 고려해야 하는 것은 내가 만들 pod가 kubeflow namespace가 아니기 때문에 BRAC를 설정 해주어야 한다는 것이었다.
RBAC(Role-Based Access Control) 설정은 사용자, 그룹에 대한 리소스 접근 권한을 제어하는 데 사용되는 방법으로, kubernetes에서는 namespace 단위로 격리된 환경을 제공한다. 그렇기 때문에 서로 다른 namespace에서 pod 간의 접근 권한을 가지지 않는다. BRAC의 종류에는 다음과 같다.
- Role : 사용자가 특정 namespace에서 파드를 생성, 조회, 수정, 삭제할 수 있는 권한.
- Cluster Role : cluster 수준의 리소스(node)에 대한 접근 권한이나 네임스페이스를 생성하는 권한.
- Role Binding : 특정 사용자, 그룹 또는 서비스 어카운트를 역할에 연결시켜 해당 역할에서 정의한 권한을 사용자에게 부여함.
- Cluster Role Binding : 클러스터 전체에 걸쳐 사용자, 그룹 또는 서비스 어카운트에 할당하고, 할당된 역할의 권한을 클러스터 전체에서 사용.
즉, kubernetes에서 ServiceAccount에 rolebinding이나 cluster rolebinding을 통해 role이나 cluster role을 연결해주면, 해당 serviceaccount가 적용된 pod에 적절한 권한을 부여할 수 있다!!!
.
.
.
.
연결하고자하는 pod에 어떤 role이 설정되어 있는지 확인하는 절차를 밟아보자.
가장 먼저 ml-pipeline-ui pod가 사용 중인 ServiceAccount 확인해보자.
ServiceAccount란?
pod가 해당 ServiceAccount를 사용해서 kubernetes 리소스에 접근하거나 API 요청을 수행한다. 즉, pod가 외부 리소스 정보에 접근하려고 할 때, 이 계정이 필요하고 해당 계정에 다양한 role을 적용함으로써 외부 리소스에 접근할 수 있는 권한을 가질 수 있다.
kubeflow
namespace에 있는 ml-pipieline-ui
를 사용하고 싶기 때문에
kubectl get po -n kubeflow ml-pipeline-ui-76bc4d6c99-9pc7l -o yaml
명령어로 yaml file을 확인한다.
serviceAccountName: ml-pipeline-ui
.
.
.
그 다음으로, ServiceAccount에 binding된 RoleBinding/ClusterRoleBinding 확인해보자.
RoleBinding과 ClusterRoleBinding은 kubernetes의 resource여서 get을 통해 다음과 같이 검색할 수 있다.
k get rolebindings.rbac.authorization.k8s.io -n kubeflow
k get clusterrolebindings.rbac.authorization.k8s.io
또한, 다음 처럼 field-selector를 사용하면 좀 더 쉽게 해당 Binding을 찾을 수 있다.
.
.
.
마지막으로, ServiceAccount에 binding된 Role/ClusterRole 확인해보자.
2번에서 찾은 rolebinding/clusterrolebinding의 yaml에서 “roleRef”를 확인하면 이를 확인할 수 있다.
다음 세부 사항에서 rlues를 보면, apigroup마다 접근 가능한 resource와, 접근 가능한 verb들이 나열되어 있는 것을 확인할 수 있다.
.
.
.
.
근데 문제가 생겼다…. 왜 kubeflow ml-pipeline-ui 관련된 clusterrole이 없다… 더 자세히 알아보니까 kubernetes api에 접근할 때만 필요하다고 한다. 쉽게 말하면, pod가 kubernetes 기본 resource(pod와 같은)를 수정, 조회, 삭제할 때 kubernetes api에 해당 동작을 해달라고 하는데, 이 때 role이 인증 되어 있어야한다는 것이다.
.
.
결과적으로 두 파드끼리 api로 값만 주고 받을 때는 이와 같은 설정을 해줄 필요가 없다… 시간 낭비했다……..