Cấu hình RBAC cho kubernetes cluster
Một trong những chức năng cơ bản của kubernetes là cho phép thao tác CRUD ( Create, Read, Update, Delete) trên các tài nguyên, ví dụ:
Với các thao tác như:
- create
- get
- delete
- list
- update
- edit
- watch
- exec
Để quản lý Role-based Access Control, chúng ta cần hiểu rõ các thành phần sau:
- Rules: Một rule là 1 tập thao tác (verbs) có thể được thực hiện trên 1 nhóm tài nguyên.
- Roles và Cluster role: cả hai đều bao gồm rule. Khác là Role thì phạm vi của nó chỉ trong 1 namespace, còn Cluster Role thì phạm vi trong 1 cluster.
- Subjects: Là những đối tượng dựa vào Rule đã cấp để thao tác trong cluster. Có 3 loại:
- User Account: Có thể là quản trị viên hoặc các process chạy ngoài cluster.
- Service Account: Là các account đã được đánh namespace, các process chạy trong pods, cần authen với API.
- Groups: Được dùng để tham chiếu tới nhiều account. Ví dụ 1 số group được tạo mặc định là cluster-admin.
- RoleBinding và ClusterRoleBinding: Đơn giản là cái tên dùng để tham chiếu từ các subject tới roles.
Ví dụ:
Tạo 1 user account:
username: user1
group: test
Tạo namespace tên là "test":
kubectl create namespace test
Tạo private key cho user "user1":
openssl genrsa -out user1.key 2048
Tạo cert sign request với private key vừa tạo trên:
openssl req -new -key user1.key -out user1.csr -subj "/CN=user1/O=test"
Tạo ra file cert cuối cùng user1.crt với CA k8s cluster - mình thì CA k8s được đặt trong thư mục "/etc/kubernetes/ssl/":
openssl x509 -req -in user1.csr -CA /etc/kubernetes/ssl/ca.pem -CAkey /etc/kubernetes/ssl/ca-key.pem -CAcreateserial -out user1.crt -days 500
Bước cuối là ịn vào trong k8s cluster của bạn:
kubectl config set-credentials user1 --client-certificate=/home/user1/.certs/user1.crt --client-key=/home/user1/.certs/user1.key
kubectl config set-context user1-context --cluster=minikube --namespace=test --user=user1
và thao tác get pod theo lệnh như ví dụ dưới đây:
kubectl --context=user1-context get pods
Tạo file role-deployment-manager.yaml:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: test
name: deployment-manager
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["deployments", "replicasets", "pods"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
kubectl create -f role-deployment-manager.yaml
Tạo file rolebinding-deployment-manager.yaml:
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: deployment-manager-binding
namespace: test
subjects:
- kind: User
name: user1
apiGroup: ""
roleRef:
kind: Role
name: deployment-manager
apiGroup: ""
kubectl create -f rolebinding-deployment-manager.yaml
Test:
kubectl --context=user1-context get pods