【发布时间】:2021-01-25 02:16:29
【问题描述】:
我在我们的 K8s 集群中有一个 python 脚本,它每隔几分钟作为 k8s Cronjob 运行。该脚本检查集群中的节点,如果一个节点不健康超过 5 分钟,它将终止该节点。 要连接到 AWS,我使用 Boto3。 需求.txt
boto3==1.16.11
botocore==1.19.11
权限作为 pod 注释传递。
Annotations: iam.amazonaws.com/role: arn:aws:iam::123456789:role/k8s-nodes-monitoring-role
IAM 角色具有arn:aws:iam::aws:policy/AmazonEC2FullAccess 策略和有效的信任策略。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789:role/nodes.my-domain.com"
},
"Action": "sts:AssumeRole"
}
]
}
我面临的问题是,在某些情况下脚本会抛出 NoCredentialsError('Unable to locate credentials') 错误。此行为不一致,因为在大多数情况下,脚本已成功终止运行状况不佳的节点,我可以对照 AWS CloudTrail 事件对其进行交叉检查。
我可以在 kub2iam 日志中看到 Get 请求收到 200,但 Put 请求收到 403。
ime="2020-12-21T12:50:16Z" level=info msg="GET /latest/meta-data/iam/security-
credentials/k8s-nodes-monitoring-role (200) took 47918.000000 ns" req.method=GET
req.path=/latest/meta-data/iam/security-credentials/k8s-nodes-monitoring-role
req.remote=100.116.203.13 res.duration=47918 res.status=200
time="2020-12-21T12:52:16Z" level=info msg="PUT /latest/api/token (403) took 19352999.000000
ns" req.method=PUT req.path=/latest/api/token req.remote=100.116.203.14
res.duration=1.9352999e+07 res.status=40
任何有关如何调试此问题的帮助或想法将不胜感激。
【问题讨论】:
-
有一些与IMDSv2有关的剧集in #241;您是否有比这更新的版本,并且您已经按照他们的故障排除步骤进行操作了吗?
标签: python amazon-web-services kubernetes boto3 amazon-iam