amazon-web-services - 带有 IRSA 授权错误的 AWS ALB 入口控制器
问题描述
我正在尝试使用IRSA方法而不是 kube2iam 设置 AWS ALB 入口控制器。然而,缺少一些文档,所以我走到了死胡同。
到目前为止我做了什么:
- 为我的集群配置了 OIDC 提供程序
eksctl utils associate-iam-oidc-provider --cluster devops --approve
创建了将由 Ingress Controller 使用并关联策略的 IAM 服务账户
eksctl create iamserviceaccount --name alb-ingress --namespace default --cluster devops --attach-policy-arn arn:aws:iam::112233445566:policy/eks-ingressController-iam-policy-IngressControllerPolicy-1111111111 --approve
- 提供部署所需的 rbac 规则
kubectl apply -f rbac-role.yaml
- 使用此模板部署了 AWS Ingress Controller 。注意
ServiceAccount
匹配我之前创建的服务帐户。
到这里为止的一切都部署得很好。现在我尝试部署我的 Ingress 服务,但出现此错误(在控制器日志中)
kubebuilder/controller "msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to failed to get AWS tags. Error: AccessDeniedException: User: arn:aws:sts::1122334455:assumed-role/eksctl-devops-nodegroup-ng-1-work-NodeInstanceRole-J08FDJHIWPI7/i-000000000000 is not authorized to perform: tag:GetResources\n\tstatus code: 400, request id: 94d614a1-c05d-4b92-8ad6-86b450407f6a" "Controller"="alb-ingress-controller" "Request"={"Namespace":"superset","Name":"superset-ingress"}
显然,该节点没有创建 ALB 的适当权限,我想如果我将我的策略附加到日志中所述的角色,它将起作用。但这违背了使用 IRSA 方法的全部目的,对吗?
我期望 Ingress Controller pod 需要适当的权限 - 通过使用服务帐户 - 来创建 ALB 而不是节点。我在这里错过了什么吗?
解决方案
使用此控制器的 v1.1.8 版本时,我遇到了类似的错误(不完全相同):
kubebuilder/controller "msg"="Reconciler
error"="failed get WAFv2 webACL for load balancer arn:aws:elasticloadbalancing:...: AccessDeniedException: User: arn:aws:sts:::assumed-role/eks-node- group-role/ 无权执行:wafv2:GetWebACLForResource 资源:arn:aws:wafv2:us-east-2::regional/webacl/*\n\tstatus 代码:400,请求 ID:..."
" controller"="alb-ingress-controller" "request"={"Namespace":"default","Name":"aws-alb-ingress"}
我会添加它,因为我认为它可以帮助在相同错误消息下搜索的人。
上述错误的原因是该控制器的v1.1.7版本需要节点组角色策略中的新 IAM 权限。 *PolicyALBIngress
(!) 请注意,即使不使用 wafv2 注释,也需要新的 IAM 权限。
解决方案 1
将wafv2
允许操作部分添加到策略中:
{
"Effect": "Allow",
"Action": [
"wafv2:GetWebACL",
"wafv2:GetWebACLForResource",
"wafv2:AssociateWebACL",
"wafv2:DisassociateWebACL"
],
"Resource": "*"
}
解决方案 2
WAFV2 支持可以通过这里提到的控制器标志来禁用。
A) 如果您通过 kubectl 安装它,请添加- --feature-gates=waf=false
到该spec -> containers -> args
部分。
B) 如果通过 helm 安装,请添加--set extraArgs."feature-gates"='waf=false'
helm upgrade 命令。
请注意,此要求已在 eksctl工具中进行了更新(也可在此处查看)。
附加参考。
推荐阅读
- python - Python从查询创建嵌套的html表
- javascript - admin.auth().currentUser; 在云函数中返回未定义
- css - CSS 通过“react-scripts build”命令破坏部署
- javascript - 在包含复杂嵌套数组的 javascript 对象中查找项目
- diameter-protocol - 直径最终单位指示 avp 可以通过 Gx 接口使用吗?
- android - 如何验证电子邮件地址的特定域?
- c++ - 同一图像中的反转文本和背景颜色
- javafx - 如何改进 MediaView 使其可以播放更多视频扩展 JavaFX
- python - .cumsum() 令人费解的效果
- python - 为什么“test”.count('') 返回 5?