Thông báo lỗi
Bạn đang trong quá trình làm việc, chuẩn bị kiểm tra các pod hoặc triển khai một dịch vụ, thì terminal bất ngờ gặp lỗi. Bạn chạy một lệnh kubectl tiêu chuẩn và nhận được thông báo này:
error: You must be logged in to the server (Unauthorized)
Tại sao lỗi này xảy ra?
Lỗi 'Unauthorized' nổi tiếng là ít thông tin chi tiết. Trong thế giới của Amazon EKS, nó hiếm khi có nghĩa là bạn thiếu quyền hạn. Thay vào đó, nó thường có nghĩa là cluster không nhận diện được bạn là ai. Điều này thường xảy ra vì bốn lý do sau:
- Thông tin xác thực AWS hết hạn: Phiên SSO của bạn đã hết thời gian chờ hoặc các token IAM tạm thời đã hết hạn. Các phiên SSO thường mặc định có giới hạn 8 hoặc 12 giờ.
- Sai lệch Profile: AWS CLI của bạn đang trỏ vào profile 'staging', nhưng
kubeconfigcủa bạn lại đang tìm kiếm 'production'. - Ánh xạ IAM Role: Danh tính IAM của bạn chưa được thêm vào danh sách khách nội bộ của cluster. Việc này được xử lý bởi
aws-authConfigMap hoặc EKS Access Entries. - Kubeconfig lỗi thời: File
~/.kube/configcủa bạn đang cố gắng sử dụng một API xác thực cũ mà EKS không còn hỗ trợ.
Bước 1: Xác minh danh tính AWS của bạn
Bước đầu tiên thực chất không phải là một lệnh Kubernetes. Bạn cần xác nhận chính xác bạn là ai trong mắt AWS. Hãy chạy lệnh này:
aws sts get-caller-identity
Hãy quan sát kỹ Arn trong kết quả trả về. Nó có khớp với IAM role hoặc người dùng có quyền truy cập cluster không? Nếu bạn sử dụng AWS SSO, phiên làm việc của bạn có thể đã hết hạn một cách âm thầm. Hãy chạy aws sso login để chắc chắn.
Bạn đang quản lý nhiều môi trường? Hãy đảm bảo rằng bạn đã export đúng profile cho phiên terminal hiện tại:
export AWS_PROFILE=my-eks-profile
aws sts get-caller-identity
Bước 2: Làm mới Kubeconfig của bạn
Các file Kubeconfig có thể trở nên cũ kỹ. Điều này thường xảy ra nếu cluster vừa được cập nhật hoặc nếu bạn đã sửa đổi cấu hình AWS cục bộ. Xóa sạch và tạo lại file thường là cách khắc phục nhanh nhất.
Chạy lệnh sau, thay thế vùng (region) và tên cluster:
aws eks update-kubeconfig --region us-east-1 --name my-cluster-name
Nếu bạn dựa vào một profile cụ thể, hãy thêm nó vào lệnh để đảm bảo cấu hình sử dụng đúng thông tin xác thực:
aws eks update-kubeconfig --region us-east-1 --name my-cluster-name --profile my-eks-profile
Lệnh này sẽ cập nhật file ~/.kube/config của bạn. Nó thiết lập lệnh aws eks get-token để tự động xử lý việc xác thực.
Bước 3: Kiểm tra ánh xạ IAM trong EKS
Ngay cả với thông tin xác thực AWS hợp lệ, cluster vẫn có thể từ chối bạn. Theo mặc định, EKS chỉ cấp quyền truy cập cho thực thể IAM cụ thể đã tạo ra cluster ban đầu.
Cách A: EKS Access Entries (Khuyến nghị cho EKS 1.23+)
Các cluster hiện đại sử dụng Access Entries. Kiểm tra trên AWS Console tại mục EKS > Clusters > [Cluster của bạn] > Access. Xác minh rằng IAM Role hoặc User của bạn có trong danh sách. Nó nên được gắn một policy như AmazonEKSClusterAdminPolicy.
Cách B: aws-auth ConfigMap
Các cluster cũ hơn dựa vào aws-auth ConfigMap. Vì hiện tại bạn đang bị lỗi 'Unauthorized', bạn không thể tự kiểm tra điều này. Bạn sẽ cần người tạo cluster hoặc quản trị viên chạy lệnh này:
kubectl get configmap aws-auth -n kube-system -o yaml
Kết quả trả về nên bao gồm ARN của role của bạn trong phần mapRoles:
mapRoles: |
- groups:
- system:masters
rolearn: arn:aws:iam::123456789012:role/my-admin-role
username: my-admin-role
Nếu role của bạn thiếu trong danh sách này, bạn sẽ vẫn bị lỗi unauthorized bất kể quyền hạn AWS của bạn là gì.
Bước 4: Gỡ lỗi Exec Plugin
Mở file ~/.kube/config và tìm phần users:. Nó sẽ trông như thế này:
users:
- name: my-cluster-user
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
command: aws
args: ["eks", "get-token", "--cluster-name", "my-cluster"]
Nếu bạn thấy aws-iam-authenticator là lệnh thực thi, hãy chuyển sang aws. AWS CLI v2 hỗ trợ token EKS gốc. Nó nhanh hơn và ổn định hơn đáng kể so với công cụ authenticator cũ.
Xác minh
Sau khi bạn đã làm mới thông tin xác thực và cấu hình, hãy kiểm tra kết nối bằng một lệnh kiểm tra ủy quyền đơn giản:
kubectl auth can-i '*' '*'
Nếu kết quả là yes, bạn đã được xác thực hoàn toàn. Nếu kết quả là no, lỗi 'Unauthorized' đã hết, nhưng IAM role của bạn thiếu các quyền RBAC cần thiết bên trong cluster.
Cuối cùng, hãy liệt kê các pod để xác nhận mọi thứ đang hoạt động:
kubectl get pods -A
Mẹo nhanh
- Lệch đồng hồ (Clock Skew): Các yêu cầu AWS sẽ thất bại nếu đồng hồ hệ thống của bạn bị lệch quá 300 giây (5 phút). Hãy đồng bộ hóa đồng hồ của bạn qua NTP.
- Ghi đè biến môi trường: Các biến như
AWS_ACCESS_KEY_IDsẽ ghi đè file~/.aws/credentialscủa bạn. Hãy gỡ bỏ (unset) chúng nếu bạn nghi ngờ có xung đột. - Sự tương đồng phiên bản: Đảm bảo AWS CLI của bạn từ phiên bản 2.10 trở lên. Phiên bản
kubectlcủa bạn nên nằm trong phạm vi một phiên bản phụ (minor version) so với cluster (ví dụ: dùng 1.29 cho cluster 1.30).

