RBAC는 enterprise 쿠버네티스 환경에서 node 혹은 네트워크 리소스를 접근할때 role을 부여하는 작업이다.
특징
- RBAC는 rbac.authorization.k8s.io API를 사용
- k8s 1.8부터 RBAC mode가 stable함
- RBAC 활성화를 위해 --authorization-mode=RBAC 설정 필요
API 살펴보기
Role and ClusterRole
Role은 쉽게말하면 권한 모음이다. 직관적으로 어떤어떤 권한을 부여 가능.
ClusterRole은 Role과 비슷하지만 cluster기반 권한 부여이므로, node, endpoint, 모든 namespace에 대한 권한 셋팅 가능
example : default라는 이름의 namespace에 pod 읽기권한(get, watch, list)을 부여하여 "pod-reader"라고 정의함
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: pod-reader rules: - apiGroups: [""] # "" indicates the core API group resources: ["pods"] verbs: ["get", "watch", "list"]
example : cluster의 secret에 대한 읽기권한을 부여하고, "secret-reader"라고 정의함
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: # "namespace" omitted since ClusterRoles are not namespaced name: secret-reader rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"]
RoleBinding and ClusterRoleBinding
RoleBinding은 유저, 혹은 팀단위의 권한 부여기능을 담당한다. ClusterRoleBinding은 클러스터 단위의 권한부여.
example : jane이라는 user에게 "pod-reader" 권한을 부여함
# This role binding allows "jane" to read pods in the "default" namespace. kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-pods namespace: default subjects: - kind: User name: jane # Name is case sensitive apiGroup: rbac.authorization.k8s.io roleRef: kind: Role #this must be Role or ClusterRole name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to apiGroup: rbac.authorization.k8s.io
example : manager Group에게 "secret-reader" 권한을 부여함
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace. kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-secrets-global subjects: - kind: Group name: manager # Name is case sensitive apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: secret-reader apiGroup: rbac.authorization.k8s.io
k8s api 호출 권한
GET /api/v1/namespaces/{namespace}/pods/{name}/log
상기와 같은 k8s api를 호출시에 RBAC role에 의해서 접근이 불가할 때가 있다. 아래와 같이 오류가 나타나기 마련..
끔찍한 k8s api 호출 error example - jenkins에서 pod에 대한 정보를 요청할 때 RBAC role에 막혔다!
WARNING: Failed to count the # of live instances on Kubernetes io.fabric8.kubernetes.client.KubernetesClientException: Failure executing: GET at: https://kubernetes.default/api/v1/namespaces/jenkins/pods. Message: Forbidden!Configured service account doesn't have access. Service account may have been revoked. pods is forbidden: User "system:serviceaccount:jenkins:default" cannot list pods in the namespace "jenkins": Unknown user "system:serviceaccount:jenkins:default".
아래와 같이 pod(resource), log(subresource of pods)에 대한 권한을 추가해야한다
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: pod-and-pod-logs-reader rules: - apiGroups: [""] resources: ["pods", "pods/log"] verbs: ["get", "list"]
End of Document
반응형
'DevOps > 쿠버네티스' 카테고리의 다른 글
쿠버네티스 Multi-container pod 종류 및 예제 (931) | 2018.07.08 |
---|---|
쿠버네티스 kubectl 설명 및 예제 모음 (902) | 2018.07.07 |
쿠버네티스 로그 아키텍쳐 개요 및 방법 (1257) | 2018.07.05 |
[쿠버네티스 기초]spring boot rest application POD 배포하기(part2) (1069) | 2018.06.26 |
[쿠버네티스 기초]spring boot rest application POD 배포하기(part1) (1422) | 2018.06.25 |
젠킨스(with 쿠버네티스 플러그인)가 쿠버네티스에서 동작하는 원리, 생명주기, 특징 (955) | 2018.06.24 |