'데이터 엔지니어'로 성장하기

정리하는 걸 좋아하고, 남이 읽으면 더 좋아함

기타/K8S

kubernetes) k8s dashboard limited acess 설정하기_readonly

MightyTedKim 2023. 4. 23. 12:57
728x90
반응형

k8s dashboard를 제공하기는 해야하는데, 읽기 권한만 부여하고 싶을 때가 있어요.

예를 들어, spark on k8s 환경의 경우 분석가 분들이 pod의 memory/cpu 사용량을 봐야할 때가 있겠네요.

사용량이나 로그를 봐야지 executor와 memory를 늘릴지 말지 판단할 수 있기 때문이에요.

 

제가 참고한 코드는 fabianlee의 블로그에요

 https://fabianlee.org/2022/08/05/kubernetes-accessing-the-kubernetes-dashboard-with-least-privilege/

 

Kubernetes: accessing the Kubernetes Dashboard with least privilege | Fabian Lee : Software Engineer

The Kubernetes Dashboard provides a convenient web interface for viewing cluster resources.  However, if you are logged using a token tied to the ‘cluster-admin’ role, you will have privileges beyond what are typically necessary. In this article, I wi

fabianlee.org

 

그러기 위해서는 총 4개의 yaml 파일이 필요합니다.

  • limited-binding.yaml 
  • limited-clusterrole.yaml  
  • limited-ns-role.yaml  
  • limited-user-sa.yaml

먼저 service account로 접근하기 때문에 사용자를 만들어줘야해요

# limited-user-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: limited-user
  namespace: kubernetes-dashboard

그러고서는, resources에 명시된 내용들만 접근할 수 있도록 clusterrole을 부여해요.

# limited-clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
  name: limited-clusterrole
  namespace: default
rules:
- apiGroups:
  - ""
  resources: ["namespaces","pods", "configmaps", "services", "pods/log"]
  verbs:
  - get
  - list
  - watch

+ 만약 특정 namespace에 있는 resource를 보게하고 싶으면, cluster role이 아닌 role을 만들면되요.

# limited-ns-role.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
  name: limited-ns-role
  namespace: default
rules:
- apiGroups:
  - ""
  resources: ["secrets"]
  verbs:
  - get
  - list
  - watch

 

이렇게 service account, cluster role, role 3가지를 만들고 연결을 해줍니다.

아래 yaml에는 각가 cluster role /role 을 service account에 묶는 작업이 있어요.

# limited-binding.yaml 
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: limited-binding
roleRef:
  kind: ClusterRole
  name: limited-clusterrole
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: limited-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: limited-ns-binding
roleRef:
  kind: Role
  name: limited-ns-role
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: limited-user

이렇게 만들어진 user는 limited user의 token 값을 이용해서 접근하면 끝이 납니다

service_acct=limited-user
kubectl describe sa -n kubernetes-dashboard $service_acct
secret_name=$(kubectl get sa -n kubernetes-dashboard $service_acct -o=jsonpath="{.secrets[*].name}")

kubectl get secret -n kubernetes-dashboard $secret_name
limited_token=$(kubectl get secret -n kubernetes-dashboard $secret_name -o=jsonpath="{.data.token}" | base64 -d)

 

 

참고

 

https://github.com/fabianlee/blogcode/tree/master/k8s-dashboard

https://fabianlee.org/2022/08/05/kubernetes-accessing-the-kubernetes-dashboard-with-least-privilege/

 

 

728x90
반응형