Kubernetes RBAC ve Role, ClusterRole, RoleBinding ve ClusterRoleBinding Nedir?
Kubernetes Role-Based Access Control (RBAC), Kubernetes nesnelerine erişimi kontrol etmek için kullanılan bir izin sistemidir. RBAC, kullanıcılara ve gruplara belirli Kubernetes nesnelerine erişme izni vermek için kullanılır.
RBAC, Kubernetes'te izinleri yönetmenin en güçlü yoludur. RBAC, kullanıcılara ve gruplara Kubernetes nesneleri üzerinde özel izinler vermek için kullanılabilir. RBAC, Kubernetes nesnelerinin yetkisiz kullanıcılar tarafından değiştirilmesini veya silinmesini önlemeye yardımcı olabilir.
RBAC'yi etkinleştirmek için, API Server'ı --authorization-mode parametresini RBAC içererek başlatmanız gerekmektedir. Örnek bir API Server pod manifestini aşağıda görebilirsiniz:
Name: kube-apiserver-minikube
Namespace: kube-system
***
***
Containers:
kube-apiserver:
Image: registry.k8s.io/kube-apiserver:v1.26.1
Command:
kube-apiserver
--advertise-address=192.168.49.2
--allow-privileged=true
--authorization-mode=Node,RBAC
***
***RBAC, Role, ClusterRole, RoleBinding ve ClusterRoleBinding olmak üzere dört adet Kubernetes nesnesine sahiptir. Tıpkı diğer Kubernetes nesneleri gibi, kubectl gibi aracını kullanarak RBAC nesnelerini tanımlayabilir veya değiştirebilirsiniz.

1. Role ve ClusterRole Nedir?
Kubernetes Role ve ClusterRole, Kubernetes nesneleri üzerinde izinler vermek için kullanılan Kubernetes izin sistemindeki iki temel bileşendir.
Role, bir namespace için izinler verir. ClusterRole, tüm namespace'ler genelinde geçerli izinler verir.
Bir Role veya ClusterRole tanımlamak için; rolün adı, rolün sahip olduğu izinler ve rolün hangi kullanıcılara veya gruplara atanacağı belirtilir.
Bir Role tanımlamak için aşağıdaki manifest dosyasını örnek alabilirsiniz:
apiVersion: v1
kind: Role
metadata:
name: my-role
namespace: default
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]veya imperative yöntem ile şu komut sayesinde oluşturabilirsiniz:
kubectl create role pod-reader --verb=get,list,watch --resource=podsBir ClusterRole tanımlamak için aşağıdaki manifest dosyasını örnek alabilirsiniz:
apiVersion: v1
kind: ClusterRole
metadata:
name: my-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create", "update", "delete"]veya imperative yöntem ile şu komut sayesinde oluşturabilirsiniz:
kubectl create clusterrole rs-reader --verb=get,list,watch --resource=rs.appsClusterRole kullanarak;
- Node, PersistentVolume gibi cluster-scoped resource'lara
- Pod, Service gibi namespaced resource'lara tüm namespace'ler genelinde (örneğin:
kubectl get pods --all-namespaces) /healthzgibi non-resource endpointlere,
izinler tanımlayabilirsiniz.
default namespace ayarlanır.Role ve ClusterRole Arasındaki Fark
Role ve ClusterRole arasındaki temel fark, etki alanıdır. Role, bir namespace içinde izinler verir, ClusterRole ise tüm namespace'ler üzerinde izinler verir.
Role veya ClusterRole eklerken nesnenin apiGroups değerini nasıl öğrenebilirim?
Role ve ClusterRole eklerken apiGroups parametresinin alacağı değeri kubectl api-resources -o wide komutundaki APIVERSION sütununda yer alan değerlerden öğrenebilirsiniz. Bu sütundaki değerler apigroup/version formatına sahiptir.
kubectl api-resources -o wide
NAME SHORTNAMES APIVERSION NAMESPACED KIND VERBS CATEGORIES
configmaps cm v1 true ConfigMap create,delete,deletecollection,get,list,patch,update,watch
pods po v1 true Pod create,delete,deletecollection,get,list,patch,update,watch all
daemonsets ds apps/v1 true DaemonSet create,delete,deletecollection,get,list,patch,update,watch all
deployments deploy apps/v1 true Deployment create,delete,deletecollection,get,list,patch,update,watch all
replicasets rs apps/v1 true ReplicaSet create,delete,deletecollection,get,list,patch,update,watch all
statefulsets sts apps/v1 true StatefulSet create,delete,deletecollection,get,list,patch,update,watch all
***
***Örneğin pods için apiGroups "" kullanılırken, deployments için "apps" kullanmalısınız.
Role veya ClusterRole eklerken nesnenin verbs değerini nasıl öğrenebilirim?
Role ve ClusterRole eklerken verbs parametresinin alacabileceği değerleri kubectl api-resources -o wide komutundaki VERBS sütununda yer alan değerlerden öğrenebilirsiniz.
2. RoleBinding ve ClusterRoleBinding Nedir?
Kubernetes RoleBinding ve ClusterRoleBinding, Role ve ClusterRole nesnelerini kullanıcılara ve gruplara atamak için kullanılan iki kavramdır.
RoleBinding, bir Role'u veya ClusterRole'u (evet, ClusterRole'u namespaced bir halde kullanmış olursunuz) bir kullanıcıya, gruba veya service account'a bağlar. Rolebinding nesnesinde, role'un adı, bağlanacağı kullanıcı veya grup veya service account ve role'un hangi namespace'de kullanılacağı belirtilir.

ClusterRoleBinding, bir ClusterRole'u bir kullanıcıya, gruba veya service account'a bağlar. ClusterRoleBinding nesnesinde, ClusterRole'ın adı, rolün bağlanacağı kullanıcı veya grup veya service account ve rolün tüm namespace'ler üzerinde kullanılacağı belirtilir.
RoleBinding ve ClusterRoleBinding arasındaki temel fark, etki alanıdır. RoleBinding, bir namespace içinde izinler verir, ClusterRoleBinding ise tüm namespace'ler üzerinde izinler verir.
Bir RoleBinding tanımlamak için aşağıdaki manifest dosyasını örnek alabilirsiniz:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: my-role-binding
namespace: default
subjects:
- kind: User
name: johndoe
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: developer
apiGroup: rbac.authorization.k8s.io
- kind: ServiceAccount
name: default
namespace: kube-system # sadece belirli bir namespace'deki sa için
- kind: ServiceAccount
name: sa-viewer
apiGroup: rbac.authorization.k8s.io # herhangi bir clusterdaki tüm sa lar için
roleRef:
kind: Role
name: my-role
apiGroup: rbac.authorization.k8s.ioBir ClusterRoleBinding tanımlamak için aşağıdaki manifest dosyasını örnek alabilirsiniz:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: my-clusterrole-binding
subjects:
- kind: Group
name: developer
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: my-clusterrole
apiGroup: rbac.authorization.k8s.io3. RBAC Default ClusterRole ve ClusterRoleBinding'ler
Kubernetes, cluster'ı kurduğunuzda default olarak bazı Role, ClusterRole, RoleBinding ve ClusterRoleBinding nesnelerini otomatik olarak oluşturur. Örneğin bazılarını görelim:
# kubectl get clusterroles | grep -v '^system'
NAME AGE
admin 33h
cluster-admin 33h
edit 33h
view 33hTüm bu default eklenen nesneleri inceleyebilirsiniz fakat özet geçmek gerekirsek:
- Hem
cluster-adminhem deadmin, tüm kaynaklara okuma-yazma erişimi verir. Genel olarak, birini superuser veya cluster root yapmak istiyorsanız, Cluster Role olancluster-adminrolünü kullanın. Tabi bunu yaparken iyi düşünmelisiniz. cluster-admintüm apiGroup, resource ve verblere wildcard (*) ile sahipken,adminClusterRole'ün de tüm bunlar tek tek eklidir. Yani yeni bir resource veya custom resource geldiğinde admin rolü yeni resource'a yetkiye sahip değilken (manual eklenmeli) cluster-admin sahiptir. İncelemek içinkubectl get clusterrole cluster-admin -o yamlvekubectl get clusterrole admin -o yamlkomutlarını kullanabilirsiniz.editrolü, deployments, services veya configmaps gibi normal core kaynakların birçoğunun oluşturulmasına, güncellenmesine ve silinmesine izin verir, ancak RBAC izinlerinin değiştirilmesine izin verilmez.viewrolü, çoğu kaynakta (secretlar dahil olmak üzere) salt okunur erişim içindir.
Ayrıca cluster-admin ClusterRoleBinding nesnesini incelerseniz, system:masters isimli bir gruba atandığını görürsünüz. Bu nedenle cluster'da kullanıcılar oluştururken eğer cluster genelinde admin yetkisi vermek istemiyorsanız, grubunun system:masters ayarlanmadığından emin olmalısınız.
# kubectl get clusterrolebindings/cluster-admin -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: cluster-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:mastersSıradaki yazı ile eğitim serisine devam edebilirsiniz.
