kubernetes) k8s dashboard limited acess 설정하기_readonly
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/
그러기 위해서는 총 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/