Cấu hình RBAC cho kubernetes cluster

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