创建KOPS集群后遇kubectl未授权错误,寻求排查方案
先把你遇到的错误日志贴出来方便参考:
INFO! KUBECONFIG env var set to /home/user/scripts/kube/kubeconfig.yaml
INFO! Testing kubectl connection....
error: You must be logged in to the server (Unauthorized)
ERROR! Test Failed, AWS role might not be recongized by cluster
结合你说的同一环境其他集群正常、KUBECONFIG配置没问题、能获取令牌这些信息,我给你整理几个针对性的排查步骤:
先确认IAM角色的RBAC映射是否生效
虽然你能通过aws-iam-authenticator拿到令牌,但得确认令牌里的身份信息被集群的RBAC规则认可。你可以解码令牌看看里面的username和groups字段:aws-iam-authenticator token -i <你的集群名称> | jq -r '.status.token' | cut -d. -f2 | base64 -d如果解码后看不到
system:masters这类有权限的组,那大概率是集群没把你的IAM角色映射到对应的K8s权限组。你可以用kops edit cluster <集群名>查看集群配置,看看spec.awsIAM.additionalIAMRoles里有没有添加你的IAM角色ARN;或者检查kube-system下的aws-authConfigMap,确认里面有你的角色映射:kubectl get configmap aws-auth -n kube-system -o yaml要是没有对应的条目,手动加一个类似下面的配置:
mapRoles: - rolearn: arn:aws:iam::123456789012:role/your-used-iam-role username: your-preferred-username groups: - system:masters检查节点的IAM角色信任关系
KOPS的集群节点需要能信任你的认证角色,所以得确认节点实例的IAM角色信任策略里,包含你当前使用的IAM角色的ARN。比如节点角色的信任策略里应该有类似这样的语句:{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/your-used-iam-role" }, "Action": "sts:AssumeRole" }再次确认KUBECONFIG的上下文和用户配置
虽然你说配置没问题,但还是快速核对一下:当前kubectl用的上下文是不是这个有问题的集群?kubectl config current-context另外,检查KUBECONFIG里该集群的用户配置,确保是用
exec方式调用aws-iam-authenticator,而不是硬编码的令牌(毕竟你用的是IAM认证),配置大概是这样:users: - name: your-cluster-name user: exec: apiVersion: client.authentication.k8s.io/v1alpha1 command: aws-iam-authenticator args: - token - -i - your-cluster-name核对AWS区域一致性
有时候区域不匹配也会导致认证失败,你可以分别检查CLI配置的区域和集群所在区域:aws configure get region kops get cluster <集群名> -o yaml | grep region如果不一样,切换到集群对应的区域再试试。
重启集群内的aws-iam-authenticator组件
要是上面都没问题,可能是aws-iam-authenticator的pod缓存了旧配置,重启一下试试:kubectl rollout restart deployment aws-iam-authenticator -n kube-system
内容的提问来源于stack exchange,提问作者Ching Kast

