Email Doanh NghiệpSSLFirewall Anti DDoS

NỘI DUNG

Banner blog lễ 30.4 và 1.5

Khắc phục lỗi “user cannot list resource pods in API group” chi tiết

Hưng Nguyễn

Đã kiểm duyệt nội dung

Ngày đăng:25/04/2026
Lượt xem

Quy trình sản xuất nội dung

Đánh giá

[esi kkstarratings cache="private" ttl="3"]

Lỗi “user cannot list resource pods in API group” là thông báo Forbidden thường gặp trong Kubernetes/OpenShift, xuất hiện khi một user hoặc service account cố gắng list resource pods nhưng không có quyền tương ứng trong RBAC. Bài viết này được mình đúc kết từ kinh nghiệm xử lý các lỗi 403 trong cụm Kubernetes thực tế, tập trung vào cách đọc message, kiểm tra quyền, rà soát Role/ClusterRole và RoleBinding/ClusterRoleBinding, từ đó cấp quyền list pods một cách an toàn và kiểm soát hơn.

Những điểm chính

  • Quan điểm của mình: Đừng bao giờ vì muốn khắc phục lỗi nhanh chóng mà gán thẳng quyền cluster-admin cho một ứng dụng hoặc người dùng. Việc tuân thủ nguyên tắc đặc quyền tối thiểu là bắt buộc để bảo vệ cụm Kubernetes của bạn khỏi các thảm họa bảo mật.
  • Khái niệm: Hiểu rõ đây là một lỗi phân quyền (Forbidden 403), giúp bạn nhanh chóng xác định nguyên nhân sự cố đến từ việc thiếu quyền truy cập thay vì lỗi hệ thống.
  • Cơ chế hoạt động: Nắm vững cơ chế phân quyền RBAC, giúp bạn hiểu rõ gốc rễ của lỗi và các thành phần cần kiểm tra như Role, ClusterRole và RoleBinding.
  • Nguyên nhân phổ biến: Nắm vững các nguyên nhân thường gặp từ việc thiếu Role/RoleBinding đến truy cập sai namespace, giúp bạn có một danh sách kiểm tra hiệu quả để khoanh vùng và chẩn đoán sự cố.
  • Cách chẩn đoán: Nắm vững các lệnh kubectl cần thiết, giúp bạn thu thập thông tin và xác định chính xác quyền nào đang bị thiếu cho user hoặc service account cụ thể.
  • Cách khắc phục: Tìm hiểu các giải pháp hiệu quả, giúp bạn có những hành động cụ thể để tạo và gán quyền (Role/RoleBinding) một cách chính xác, giải quyết triệt để sự cố.
  • Lưu ý bảo mật: Nắm được các phương pháp hay nhất như nguyên tắc đặc quyền tối thiểu, giúp bạn khắc phục lỗi một cách an toàn mà không tạo ra các lỗ hổng bảo mật không cần thiết.
  • Giới thiệu Vietnix: Nhận biết Vietnix là nhà cung cấp nền tảng Cloud Server uy tín, giúp bạn có một nền tảng hạ tầng đáng tin cậy để triển khai các giải pháp Kubernetes.
  • Câu hỏi thường gặp: Giải đáp các thắc mắc liên quan đến lỗi “user cannot list resource pods in API group”.
những điểm chính

Lỗi “user cannot list resource pods in API group” là gì?

Lỗi “user cannot list resource pods in API group” là thông báo từ hệ thống phân quyền của Kubernetes (RBAC), cho biết tài khoản hoặc ServiceAccount của bạn không có quyền thực thi list các Pod trong cụm. Thông điệp thường có dạng đầy đủ như pods is forbidden: User "<tên user hoặc service account>" cannot list resource "pods" in API group "" in the namespace "<tên_namespace>". Đây chính là cơ chế bảo vệ mặc định của hệ thống nhằm đảm bảo rằng chỉ những ai được cấp quyền hợp lệ mới có thể xem thông tin các máy chủ ứng dụng bên trong hệ thống.

user cannot list resource pods in api group 01
Lỗi “user cannot list resource pods” là thông báo cho biết ServiceAccount không có quyền thực thi list các Pod trong cụm

Dịch vụ Enterprise Cloud mang đến cụm tài nguyên độc lập mạnh mẽ với CPU AMD EPYC và hệ thống lưu trữ 100% NVMe Enterprise siêu tốc. Nhờ khả năng quản trị linh hoạt qua API tiêu chuẩn, nền tảng này giúp doanh nghiệp tự do khởi tạo máy chủ ảo, dễ dàng triển khai và mở rộng các cụm Kubernetes hiệu năng cao mà không lo gặp tình trạng nghẽn cổ chai tài nguyên.

Cơ chế quyền truy cập trong Kubernetes/OpenShift

Để hiểu rõ tận gốc rễ của nguyên nhân gây lỗi, bạn cần nắm bắt cơ chế kiểm soát truy cập dựa trên vai trò mà hệ thống Kubernetes và OpenShift đang sử dụng. Cơ chế này hoạt động dựa trên các thành phần chính yếu sau đây:

  • Subject: Đây là các thực thể đưa ra yêu cầu truy cập, bao gồm User (người dùng thực), Group (nhóm người dùng) hoặc ServiceAccount (tài khoản hệ thống dành cho ứng dụng chạy bên trong Pod).
  • Resource: Đây là các đối tượng vật lý hoặc logic được quản lý trong cụm Kubernetes, ví dụ như pods, deployments, services hoặc configmaps.
  • Verb: Đây là các thao tác mà chủ thể muốn thực thi trên các tài nguyên, bao gồm các hành động cơ bản như get, list, watch, create, update, patch, delete.
  • Role/ClusterRole: Thành phần này có nhiệm vụ định nghĩa một tập hợp các quy tắc cho phép thực hiện những hành động nhất định trên các tài nguyên cụ thể. Role chỉ có phạm vi giới hạn trong một Namespace, trong khi ClusterRole sẽ được áp dụng cho toàn bộ cụm.
  • RoleBinding/ClusterRoleBinding: Đây là cơ chế dùng để gán một Role hoặc ClusterRole cho một Subject cụ thể, từ đó hệ thống máy chủ mới xác định được chính xác ai được phép làm thao tác gì.

Khi một lệnh như kubectl get pods hoặc API request được gửi đi, Kubernetes kiểm tra xem subject đứng sau request có bất kỳ RoleBinding/ClusterRoleBinding nào cho phép thao tác list trên pods trong namespace mục tiêu hoặc ở cluster scope. Nếu không tìm thấy rule phù hợp trong Role/ClusterRole, hệ thống trả về lỗi Forbidden với thông báo kiểu pods is forbidden: User "<principal" cannot list resource "pods" in API group "", phản ánh kết quả của bước authorization chứ không phải lỗi cấu hình API server.

Cơ chế quyền truy cập trong Kubernetes/OpenShift
Cơ chế quyền truy cập trong Kubernetes/OpenShift

Thiếu quyền trong Role hoặc ClusterRole

Một nguyên nhân phổ biến là user không được gán bất kỳ Role hoặc ClusterRole nào cho phép thao tác list trên tài nguyên pods trong namespace liên quan. Khi user chạy lệnh như kubectl get pods hoặc oc get pods, RBAC không tìm được policy cho phép list pods, nên trả về lỗi Forbidden với thông báo “user cannot list resource pods in API group”.

Service account thiếu quyền truy cập pods

Trong nhiều trường hợp, Pod sử dụng một service account nhưng service account này chưa được gán Role/ClusterRole có quyền trên pods. Khi ứng dụng bên trong Pod gọi Kubernetes API để list pods, request được thực hiện dưới danh nghĩa service account đó và bị từ chối nếu không có RoleBinding/ClusterRoleBinding tương ứng, dẫn đến thông báo User "system:serviceaccount:…" cannot list resource "pods".

Anonymous user bị giới hạn quyền mặc định

Nhiều trường hợp lỗi phát sinh do hệ thống nhận diện sai danh tính người dùng hoặc Token truy cập đã hết hạn. Nếu file kubeconfig chứa thông tin cũ hoặc bạn đang đứng dưới danh nghĩa system:anonymous, Kubernetes sẽ mặc định áp dụng các quyền hạn tối thiểu (thường là không có quyền gì). Điều này dẫn đến việc bị chặn truy cập dù trước đó bạn vẫn thực hiện thao tác bình thường.

Anonymous user bị giới hạn quyền mặc định
Anonymous user bị giới hạn quyền mặc định

Sai phạm vi Namespace

Một số lỗi xuất hiện khi user hoặc service account có quyền list pods trong một namespace cụ thể nhưng lại thực hiện lệnh ở namespace khác hoặc ở cluster scope. Ví dụ, user có RoleBinding trong namespace my-project nhưng chạy kubectl get pods -n default hoặc kubectl get pods --all-namespaces, trong khi Role/ClusterRole hiện tại không cho phép list pods ở các phạm vi đó, nên request bị từ chối với thông báo Forbidden.

Sai phạm vi Namespace
Sai phạm vi Namespace

Chưa liên kết quyền bằng RoleBinding

Trong nhiều trường hợp, người quản trị đã tạo sẵn Role với đầy đủ các quyền cần thiết nhưng lại quên tạo RoleBinding để gán vai trò đó cho User hoặc ServiceAccount đang sử dụng. Vì Role chưa được gắn kết với chủ thể thực thi lệnh, tài khoản của bạn trên thực tế vẫn là một tài khoản trắng quyền và hoàn toàn không thể xem danh sách Pods.

Xác định thông điệp lỗi và principal liên quan

Bạn dùng lại lệnh gây lỗi (ví dụ kubectl get pods, oc get pods hoặc truy vấn API) và ghi nhận đầy đủ thông báo lỗi Forbidden. Cần chú ý phần User "<principal>", resource (pods), namespace và phạm vi (namespace cụ thể hay cluster scope) để biết chính xác principal nào đang bị từ chối và ở đâu. Ở đây mình thêm “--as=john” để demo kết quả khi một user/principle nhận lỗi Forbidden.

Xác định thông điệp lỗi và principal liên quan
Xác định thông điệp lỗi và principal liên quan

Kiểm tra RoleBinding trong namespace

Trong namespace đang thao tác, bạn dùng lệnh như kubectl get rolebinding -n <namespace> hoặc oc get rolebinding --namespace <namespace> để liệt kê các RoleBinding hiện có. Sau đó, bạn sử dụng kubectl describe rolebinding <tên> -n <namespace> hoặc oc describe rolebinding để xem Role/ClusterRole nào được bind và danh sách subject (user, group, service account) được gán, từ đó xác định principal gặp lỗi có được map vào bất kỳ RoleBinding phù hợp hay không.

Kiểm tra RoleBinding trong namespace
Kiểm tra RoleBinding trong namespace

Kiểm tra ClusterRoleBinding ở phạm vi cluster

Nếu thao tác ở cluster scope (ví dụ --all-namespaces), bạn cần kiểm tra các ClusterRoleBinding bằng kubectl get clusterrolebinding hoặc oc get clusterrolebinding. Với kubectl/oc describe clusterrolebinding <tên>, có thể xem principal nào được gán vào các ClusterRole và những ClusterRole đó có policy cho phép list trên pods hay không.

Xem chi tiết Role/ClusterRole để nắm quyền trên pods

Sử dụng kubectl describe role <role-name> -n <namespace> hoặc kubectl describe clusterrole <clusterrole-name> (tương tự với oc describe) để xem PolicyRule. Bạn cần kiểm tra xem resources có chứa podsverbs có bao gồm list (và có thể get, watch) hay không, nhằm xác định Role/ClusterRole hiện tại có cấp đủ quyền cho principal truy cập pods.

Xem chi tiết Role/ClusterRole để nắm quyền trên pods
Xem chi tiết Role/ClusterRole để nắm quyền trên pods

Xác minh trường hợp anonymous và cấu hình authentication

Nếu thông báo lỗi đề cập tới User "system:anonymous", bạn cần kiểm tra lại cấu hình authentication của API server, bao gồm file AuthenticationConfiguration và các feature gates liên quan. Mục tiêu là xác định endpoint nào cho phép anonymous authentication và nhận diện rằng phần authentication chỉ xác định được user anonymous, còn authorization vẫn cần RBAC riêng để cho phép hoặc từ chối thao tác list pods.

Quan điểm của mình: Trong thực tế vận hành, bạn nên bám sát các bước “đọc kỹ thông điệp lỗi > rà RoleBinding/ClusterRoleBinding > kiểm tra chi tiết Role/ClusterRole > xử lý trường hợp anonymous” để khoanh vùng nguyên nhân nhanh và giảm nguy cơ “vá quyền” bằng cách gán role quá rộng, vốn rất dễ tạo lỗ hổng bảo mật về sau trong cụm Kubernetes.

Để khắc phục lỗi “cannot list resource pods” bạn cần tập trung vào việc điều chỉnh cấu hình RBAC cho đúng principal và đúng phạm vi.

Thiết lập RoleBinding để gán quyền cho chủ thể

Trước hết, bạn cần đăng nhập bằng một tài khoản có quyền đủ cao như admin hoặc cluster-admin để có thể tạo hoặc chỉnh sửa Role/ClusterRole và RoleBinding/ClusterRoleBinding:

  • Với user chỉ cần quyền trong một namespace cụ thể: Bạn tạo Role hoặc sử dụng sẵn ClusterRole như view hoặc basic-user, sau đó tạo RoleBinding gắn user hoặc group tương ứng với Role/ClusterRole đó trong namespace mục tiêu, ví dụ oc create rolebinding my-view-only --clusterrole view --group my_group.
  • Nếu user cần liệt kê pods ở nhiều namespace hoặc ở phạm vi toàn cluster: Bạn tạo ClusterRoleBinding gắn user với ClusterRole thích hợp, hoặc dùng lệnh tiện ích như oc adm policy add-cluster-role-to-user basic-user john.doe để cấp quyền list pods trên phạm vi rộng hơn.

Tạo Role hoặc ClusterRole cấp quyền truy cập Pods

Đối với lỗi liên quan tới system:serviceaccount:<namespace>:<tên-sa>, bạn cần bảo đảm service account được gán Role/ClusterRole có quyền trên pods. Cách triển khai thường là tạo Role (hoặc dùng ClusterRole hiện có như view) chứa quyền get, list, watch đối với pods, sau đó tạo RoleBinding trong namespace, gắn Role/ClusterRole đó với service account đang được Pod sử dụng. Khi RoleBinding đã được tạo đúng, các request từ Pod thông qua service account này tới Kubernetes API để list pods trong namespace đó sẽ được authorization cho phép thay vì trả về Forbidden.

Khắc phục lỗi cho ứng dụng chạy bên trong Pod

Nếu thông báo lỗi phát sinh từ mã nguồn ứng dụng đang chạy bên trong cụm Kubernetes, bạn phải gắn ServiceAccount đã được cấp quyền vào trực tiếp Pod đó. Cụ thể, bạn cần chỉnh sửa file Deployment và thêm dòng serviceAccountName: vào phần thông số cấu hình của Pod. Cuối cùng, bạn hãy áp dụng lại cấu hình bằng lệnh kubectl apply để hệ thống tự động tái tạo lại ứng dụng với đầy đủ quyền hạn.

Cập nhật và đồng bộ lại Kubeconfig

Nếu lỗi do xác thực, bạn cần làm mới thông tin đăng nhập trong file cấu hình cá nhân. Đối với các môi trường Managed Kubernetes (như EKS, GKE, AKS), hãy sử dụng lệnh CLI của nhà cung cấp (ví dụ: aws eks update-kubeconfig) để ghi đè thông tin xác thực mới nhất. Việc xóa cache của kubectl thông qua thư mục ~/.kube/cache cũng là một cách hiệu quả để đảm bảo các yêu cầu không bị gửi đi với thông tin định danh cũ.

Quan điểm của mình: Khi xử lý lỗi “user cannot list resource pods in API group”, mình luôn ưu tiên chỉnh đúng Role/RoleBinding cho từng user hoặc service account, thay vì gán tạm các quyền rộng như cluster-admin, vì cách chữa cháy đó chỉ giải quyết trước mắt nhưng về lâu dài sẽ làm mất kiểm soát bề mặt tấn công và rất khó audit lại hệ thống RBAC.

Lưu ý bảo mật khi cấp quyền trên pods

Khi xử lý lỗi “user cannot list resource pods in API group”, việc cấp quyền trên pods cần tuân theo các nguyên tắc an toàn để tránh mở rộng quyền truy cập ngoài phạm vi cần thiết.

  • Hạn chế cấp quyền cho anonymous: Việc cho phép system:anonymous có quyền list pods cần được cân nhắc kỹ vì thao tác này cho phép bất kỳ ai xem thông tin tài nguyên trong cluster, dễ dẫn đến rò rỉ thông tin nhạy cảm về workload và cấu trúc hệ thống.
  • Ưu tiên Role/ClusterRole tối thiểu cần thiết: Khi tạo Role hoặc ClusterRole, chỉ nên khai báo các verbs cần dùng (như get, list, watch) trên pods cho đúng principal và đúng namespace, tránh gán các role rộng như admin hoặc cluster-admin cho user chỉ cần quyền đọc.
  • Sử dụng RoleBinding thay vì ClusterRoleBinding khi có thể: Với các quyền chỉ phục vụ một namespace cụ thể, nên gắn user/service account với Role/ClusterRole thông qua RoleBinding trong namespace đó, thay vì ClusterRoleBinding ở phạm vi cluster, để giới hạn phạm vi tác động nếu có sự cố hoặc lạm dụng.
  • Rà soát và mô tả Role/ClusterRole định kỳ: Cần thường xuyên dùng kubectl/oc describe role hoặc describe clusterrole để kiểm tra các rule trên pods và các resource nhạy cảm khác, bảo đảm không tồn tại ClusterRoleBinding hoặc RoleBinding cấp quyền rộng cho nhóm user không còn nhu cầu sử dụng.
Những lưu ý bảo mật khi cấp quyền trên pods
Những lưu ý bảo mật khi cấp quyền trên pods

Vietnix – Nền tảng Cloud Server mạnh mẽ cho mọi giải pháp Kubernetes

Nếu bạn đang cần một môi trường hạ tầng để vận hành hệ thống container hóa quy mô lớn, Vietnix Enterprise Cloud chính là sự lựa chọn chiến lược. Dịch vụ cung cấp cho bạn một cụm tài nguyên đám mây độc lập, kết hợp cùng tính năng Mạng riêng ảo và cấu trúc sẵn sàng cao. Nền tảng này có khả năng tự động phục hồi ngay lập tức khi xảy ra sự cố phần cứng, đảm bảo các cụm Kubernetes luôn duy trì hoạt động mượt mà liên tục. Bên cạnh đó, đội ngũ chuyên gia giàu kinh nghiệm của Vietnix sẽ luôn đồng hành và hỗ trợ kỹ thuật 24/7 cho doanh nghiệp.

Thông tin liên hệ:

  • Website: https://vietnix.vn/
  • Hotline: 1800 1093
  • Email: sales@vietnix.com.vn
  • Địa chỉ: 265 Hồng Lạc, Phường Bảy Hiền, Thành Phố Hồ Chí Minh

Câu hỏi thường gặp

Lệnh kubectl auth can-i có tác dụng gì và tại sao lại hữu ích?

Lệnh kubectl auth can-i cho phép bạn kiểm tra xem người dùng hiện tại (hoặc một người dùng được chỉ định) có quyền thực hiện một hành động cụ thể trên một tài nguyên hay không (ví dụ: kubectl auth can-i get pods). Nó rất hữu ích để gỡ lỗi các vấn đề về quyền truy cập và xác minh các chính sách RBAC đã được áp dụng đúng cách hay chưa.

Nếu tôi muốn cấp quyền cho một người dùng chỉ để xem (get, list, watch) các tài nguyên trong một namespace cụ thể, tôi nên sử dụng Role hay ClusterRole?

Bạn nên sử dụng một Role trong namespace đó. Vì yêu cầu chỉ giới hạn trong một namespace, việc sử dụng Role và RoleBinding là phù hợp với nguyên tắc đặc quyền tối thiểu, tránh cấp các quyền không cần thiết trên toàn bộ cluster.

Sự khác biệt chính giữa Role/RoleBinding và ClusterRole/ClusterRoleBinding trong RBAC của Kubernetes là gì?

Role/RoleBinding có phạm vi trong một Namespace cụ thể. Role định nghĩa các quyền, và RoleBinding gán các quyền đó cho user/group/service account trong Namespace đó.
ClusterRole/ClusterRoleBinding có phạm vi toàn bộ cluster. ClusterRole định nghĩa các quyền có thể áp dụng cho các tài nguyên cluster-wide (như nodes) hoặc tất cả các Namespace, và ClusterRoleBinding gán các quyền đó trên toàn bộ cluster.

Lỗi “user cannot list resource pods in API group” là một phần quan trọng của cơ chế bảo mật Kubernetes, báo hiệu rằng việc phân quyền trong K8s đang hoạt động đúng cách để ngăn chặn các truy cập không được phép. Việc tuân thủ các nguyên tắc bảo mật, đặc biệt là nguyên tắc đặc quyền tối thiểu, sẽ là chìa khóa để xây dựng một môi trường Kubernetes không chỉ mạnh mẽ, linh hoạt mà còn an toàn và dễ quản lý.

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Đánh giá mức độ hữu ích của bài viết

icon 1 sao

Thất vọng

icon 2 sao

Chưa hữu ích

icon 3 sao

Bình thường

icon 4 sao

Hữu ích

icon 5 sao

Rất hữu ích

Hưng Nguyễn

Co-Founder
tại

Kết nối với mình qua

Kết nối với mình qua

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

kien-thuc-dich-vu

kien-thuc-kubernetes

text
icon popup single post

CẢM ƠN BẠN ĐÃ ĐÁNH GIÁ BÀI VIẾT

Vietnix sẽ luôn cố gắng cải thiện chất lượng dịch vụ mỗi ngày

ĐÓNG

Đánh giá mức độ hữu ích của bài viết

icon 1 sao

Thất vọng

icon 2 sao

Chưa hữu ích

icon 3 sao

Bình thường

icon 4 sao

Hữu ích

icon 5 sao

Rất hữu ích

Icon
ĐĂNG KÝ NHẬN TÀI LIỆU THÀNH CÔNG
Cảm ơn bạn đã đăng ký nhận tài liệu mới nhất từ Vietnix!
ĐÓNG

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1
Icon
XÁC NHẬN ĐĂNG KÝ DÙNG THỬ THÀNH CÔNG
Cảm ơn bạn đã đăng ký thông tin thành công. Đội ngũ CSKH sẽ liên hệ trực tiếp để kích hoạt dịch vụ cho bạn nhanh nhất!
ĐÓNG