Hướng dẫn tạo và phân quyền người dùng với kubectl.
Vấn đề
Hãy tưởng tượng ta gặp trường hợp như sau. Công ty ta có một Kubernetes Cluster với hai môi trường pro
và dev
. Với pro
cho môi trường sản phẩm thực tế và dev
dùng để phát triển sản phẩm. Trước giờ bạn chỉ làm một mình và có toàn bộ quyền để quản lý Kubernetes Cluster, mỗi lần Developer muốn làm gì đều phải thông qua bạn, kể cả xem logs. Sếp bạn thấy vậy hơi bất tiện nên kêu bạn tìm cách làm thế nào để mấy bạn Developer có thể tự liệt kê ứng dụng và xem logs ở dưới môi trường dev
.
Giải pháp
Ta dùng Role-based access control (RBAC) để giải quyết vấn đề trên. Các bước thực hiện như sau.
Tạo tệp tin pod-logs-sa.yaml
cho Service Account:
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-logs
namespace: dev
secrets:
- name: pod-logs
---
apiVersion: v1
kind: Secret
metadata:
name: pod-logs
namespace: dev
annotations:
kubernetes.io/service-account.name: pod-logs
type: kubernetes.io/service-account-token
kubectl apply -f pod-logs-sa.yaml
Tạo tệp tin pod-logs-role.yaml
:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-logs
namespace: dev
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list"]
kubectl apply -f pod-logs-role.yaml
Tạo RoleBinding:
kubectl -n dev create rolebinding pod-logs --serviceaccount=dev:pod-logs --role=pod-logs
Tiếp theo ta sẽ tạo người dùng và cho họ đăng nhập với Token lấy từ Service Account là pod-logs
. Lấy Token:
kubectl -n dev describe secrets "$(kubectl -n dev describe serviceaccount pod-logs | grep -i Tokens | awk '{print $2}')" | grep token: | awk '{print $2}'
Các bạn lưu ý chạy kubectl với namespace chính xác. Trong ví dụ này là -n dev
.
Gán giá trị trên vào biến TOKEN
:
TOKEN=$(kubectl -n dev describe secrets "$(kubectl -n dev describe serviceaccount pod-logs | grep -i Tokens | awk '{print $2}')" | grep token: | awk '{print $2}')
Tạo người dùng với tên bất kì:
kubectl config set-credentials devopsvn --token=$TOKEN
User "devopsvn" set.
Chuyển Cluster hiện tại sang người dùng là devopsvn
:
kubectl config set-context $(kubectl config current-context) --user=devopsvn
Tới bước này thì các bạn đã tạo người dùng thành công. Chạy các câu lệnh sau để kiểm tra quyền:
$ kubectl auth can-i get pods --namespace=dev
yes
$ kubectl auth can-i get pods --namespace=pro
no
Tiếp theo các bạn mở tệp tin ~/.kube/config
ra và xóa những người dùng khác và các thông tin không cần thiết, chỉ để lại người dùng devopsvn
. Ví dụ:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: ...
server: ...
name: devopsvn-cluster
contexts:
- context:
cluster: devopsvn-cluster
user: devopsvn
name: devopsvn-cluster
kind: Config
preferences: {}
users:
- name: devopsvn
user:
token: ...
Sau đó ta gửi tệp tin này qua cho các bạn Developer.
Kết luận
Hiện tại có rất nhiều giải pháp để ta có thể giải quyết vấn đề được đưa ra ở bài này, tuy nhiên các giải pháp khác lại hơi lằng nhằng và phức tạp. Đây là cách thủ công nhưng lại đơn giản và dễ làm nhất, phù hợp cho bạn mới. Các bạn có thể tham khảo giải pháp khác phức tạp hơn là ArgoCD: Quản lý user và phân quyền trên ArgoCD.
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?