使用curl和CA证书调用EKS API服务器遇未授权错误求助
问题与解决方案
问题详情
通过IAM用户创建EKS集群(system:creator为该IAM用户),AWS CLI和kubectl均可正常使用,但执行以下curl调用Kubernetes API时返回401未授权:
curl -v https://abc.gr7.us-east-1.eks.amazonaws.com/api/v1/namespaces/kube-system/pods?limit=500 --header "Authorization: Bearer $TOKEN" --cacert test.crt
其中TOKEN通过以下命令获取:
TOKEN=$(aws eks get-token --cluster-name test-clus --profile default)
test.crt文件直接存储了EKS集群详情页提供的证书颁发机构字符串的base64内容,返回错误如下:
{ "kind": "Status", "apiVersion": "v1", "metadata": {}, "status": "Failure", "message": "Unauthorized", "reason": "Unauthorized", "code": 401 }
环境信息:
- EKS版本:1.24
- AWS CLI版本:aws-cli/2.9.15
- kubectl版本:客户端v1.26.0,服务端v1.24.8-eks-ffeb93d(存在版本偏移警告)
原因分析
- Token提取错误:
aws eks get-token返回的是完整JSON结构,而非直接的token字符串,直接赋值给$TOKEN会导致Authorization头携带整个JSON内容,而非有效token。 - 证书文件格式错误:EKS控制台提供的CA字符串是base64编码的PEM证书,需解码后保存为
.crt文件,直接存储base64字符串会导致TLS验证异常(虽错误提示为未授权,但证书问题可能间接引发权限验证失败)。
解决方案
1. 正确提取有效Token
使用jq工具从JSON结果中提取token字段(需提前安装jq):
TOKEN=$(aws eks get-token --cluster-name test-clus --profile default | jq -r '.status.token')
若无jq,可改用grep和awk替代:
TOKEN=$(aws eks get-token --cluster-name test-clus --profile default | grep -o '"token": "[^"]*"' | awk -F '"' '{print $4}')
2. 修复证书文件格式
将EKS集群详情页的CA字符串进行base64解码后保存为test.crt:
# 假设CA字符串已复制到变量CA_B64中 echo "$CA_B64" | base64 -d > test.crt
或直接复制控制台的CA字符串后解码写入:
echo "复制的CA base64字符串" | base64 -d > test.crt
3. 验证调用
重新执行curl命令,此时应能正常获取pod列表。若仍有问题,可通过kubectl确认token有效性:
# 查看当前kubectl使用的token kubectl config view --raw -o jsonpath='{.users[?(@.name=="arn:aws:eks:us-east-1:ACCOUNT_ID:cluster/test-clus")].user.token}'
将该token替换到curl命令的$TOKEN中测试,若能正常访问,则说明aws eks get-token的提取逻辑仍有问题。
4. 处理kubectl版本偏移(可选)
虽然版本偏移不是本次未授权的直接原因,但为避免后续其他问题,建议将kubectl版本降级到1.25或1.24版本(与EKS服务端版本保持±1的偏移范围)。
内容的提问来源于stack exchange,提问作者user2315104
相关产品推荐
相关产品推荐

