Amazon web services AWS ALB入口控制器出现IRSA授权错误

Amazon web services AWS ALB入口控制器出现IRSA授权错误,amazon-web-services,kubernetes,kubernetes-ingress,amazon-eks,Amazon Web Services,Kubernetes,Kubernetes Ingress,Amazon Eks,我正在尝试使用该方法而不是kube2iam设置AWS ALB入口控制器。然而,由于缺少一些文档,所以我走到了死胡同 到目前为止我所做的: 为我的群集配置了OIDC提供程序 eksctl utils关联iam oidc提供程序--群集devops--批准 通过使用创建适当的策略 创建了将由入口控制器使用并与策略关联的IAM服务帐户 eksctl创建iamserviceaccount——名称alb ingress——命名空间默认值——集群devops——附加策略arn arn:aws:iam

我正在尝试使用该方法而不是kube2iam设置AWS ALB入口控制器。然而,由于缺少一些文档,所以我走到了死胡同

到目前为止我所做的:

  • 为我的群集配置了OIDC提供程序
eksctl utils关联iam oidc提供程序--群集devops--批准

  • 通过使用创建适当的策略

  • 创建了将由入口控制器使用并与策略关联的IAM服务帐户

eksctl创建iamserviceaccount——名称alb ingress——命名空间默认值——集群devops——附加策略arn arn:aws:iam::112233445566:policy/eks-ingressController-iam-policy-ingressController-1111111——批准

  • 提供了部署所需的rbac规则
kubectl apply-f rbac role.yaml

  • 使用部署AWS入口控制器。已引起注意,因此
    服务帐户
    与我先前创建的服务帐户匹配
这里的一切都很好。现在我尝试部署我的入口服务,但我得到了这个错误(在控制器日志中)

显然,该节点没有创建ALB的适当权限,我想如果我将策略附加到日志中所述的角色,它就会工作。但这违背了IRSA方法的全部目的,对吗


我希望入口控制器pod需要适当的权限(通过使用服务帐户)来创建ALB,而不是节点。我在这里遗漏了什么吗?

所以,万一有人遇到同样的问题

解决方案是,在创建rbac角色时,从rbac-role.yaml(如提供的)注释掉创建服务帐户的最后一部分


由于我们已经使用eksctl创建了一个服务帐户,并将aws策略附加到该帐户,因此我们还可以将rbac权限附加到该服务帐户。然后,该服务帐户可以在入口控制器pod中正常使用,以发挥其神奇作用。

根据文档,需要CRUD ALB的许可。如果您想尝试只给ALB驱动程序Pod一个具有权限的角色,您可以创建ALB,但我还没有测试它,并且我不确定这是否重要,如果您的整个计划程序已被授予使用ALB驱动程序/Pod在AWS上创建这些对象的权限

我并没有使用EKS的3.0集群创建工具,相反,我有自己的CFT,因为我的组织有额外的安全要求,我用它来创建工人

我已经为需要创建ALB的员工创建并附加了bellow管理策略,并且它可以正常工作

  ALBPolicy:
    Type: "AWS::IAM::ManagedPolicy"
    Properties:
      Description: Allows workers to CRUD alb's
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Action:
              - "acm:DescribeCertificate"
              - "acm:ListCertificates"
              - "acm:GetCertificate"
            Resource: "*"
          -
            Effect: "Allow"
            Action:
              - "ec2:AuthorizeSecurityGroupIngress"
              - "ec2:CreateSecurityGroup"
              - "ec2:CreateTags"
              - "ec2:DeleteTags"
              - "ec2:DeleteSecurityGroup"
              - "ec2:DescribeAccountAttributes"
              - "ec2:DescribeAddresses"
              - "ec2:DescribeInstances"
              - "ec2:DescribeInstanceStatus"
              - "ec2:DescribeInternetGateways"
              - "ec2:DescribeNetworkInterfaces"
              - "ec2:DescribeSecurityGroups"
              - "ec2:DescribeSubnets"
              - "ec2:DescribeTags"
              - "ec2:DescribeVpcs"
              - "ec2:ModifyInstanceAttribute"
              - "ec2:ModifyNetworkInterfaceAttribute"
              - "ec2:RevokeSecurityGroupIngress"
            Resource: "*"
          -
            Effect: "Allow"
            Action:
              - "elasticloadbalancing:AddListenerCertificates"
              - "elasticloadbalancing:AddTags"
              - "elasticloadbalancing:CreateListener"
              - "elasticloadbalancing:CreateLoadBalancer"
              - "elasticloadbalancing:CreateRule"
              - "elasticloadbalancing:CreateTargetGroup"
              - "elasticloadbalancing:DeleteListener"
              - "elasticloadbalancing:DeleteLoadBalancer"
              - "elasticloadbalancing:DeleteRule"
              - "elasticloadbalancing:DeleteTargetGroup"
              - "elasticloadbalancing:DeregisterTargets"
              - "elasticloadbalancing:DescribeListenerCertificates"
              - "elasticloadbalancing:DescribeListeners"
              - "elasticloadbalancing:DescribeLoadBalancers"
              - "elasticloadbalancing:DescribeLoadBalancerAttributes"
              - "elasticloadbalancing:DescribeRules"
              - "elasticloadbalancing:DescribeSSLPolicies"
              - "elasticloadbalancing:DescribeTags"
              - "elasticloadbalancing:DescribeTargetGroups"
              - "elasticloadbalancing:DescribeTargetGroupAttributes"
              - "elasticloadbalancing:DescribeTargetHealth"
              - "elasticloadbalancing:ModifyListener"
              - "elasticloadbalancing:ModifyLoadBalancerAttributes"
              - "elasticloadbalancing:ModifyRule"
              - "elasticloadbalancing:ModifyTargetGroup"
              - "elasticloadbalancing:ModifyTargetGroupAttributes"
              - "elasticloadbalancing:RegisterTargets"
              - "elasticloadbalancing:RemoveListenerCertificates"
              - "elasticloadbalancing:RemoveTags"
              - "elasticloadbalancing:SetIpAddressType"
              - "elasticloadbalancing:SetSecurityGroups"
              - "elasticloadbalancing:SetSubnets"
              - "elasticloadbalancing:SetWebACL"
            Resource: "*"
          -
            Effect: "Allow"
            Action:
              - "iam:CreateServiceLinkedRole"
              - "iam:GetServerCertificate"
              - "iam:ListServerCertificates"
            Resource: "*"
          -
            Effect: "Allow"
            Action:
              - "cognito-idp:DescribeUserPoolClient"
            Resource: "*"
          -
            Effect: "Allow"
            Action:
              - "waf-regional:GetWebACLForResource"
              - "waf-regional:GetWebACL"
              - "waf-regional:AssociateWebACL"
              - "waf-regional:DisassociateWebACL"
            Resource: "*"
          -
            Effect: "Allow"
            Action:
              - "tag:GetResources"
              - "tag:TagResources"
            Resource: "*"
          -
            Effect: "Allow"
            Action:
              - "waf:GetWebACL"
            Resource: "*"

使用此控制器的v1.1.8版时,我遇到了类似的错误(不完全相同):

kubebuilder/控制器“msg”=“对账器
获取失败的错误“=” 用于负载平衡器的WAFv2 webACL arn:aws:ElasticLoadBalancement:…: AccessDeniedException:用户: arn:aws:sts:::假定角色/eks节点组角色/ 未授权对资源执行:wafv2:GetWebACLForResource: arn:aws:wafv2:us-east-2::区域/webacl/*\n\t状态代码: 400,请求id:…“
“控制器”=“alb入口控制器” “请求”={“名称空间”:“默认”,“名称”:“aws alb入口”}

我将添加它,因为我认为它可以帮助那些在相同错误消息下搜索的人

上述错误的原因是节点组角色中此控制器的版本不正确

(!)请注意,即使未使用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安装,请在helm upgrade命令中添加
--设置外部参数。“功能门”='waf=false'


请注意,这个需求已经在工具中实现了(也在中进行了审查)


额外的

{
  "Effect": "Allow",
  "Action": [
    "wafv2:GetWebACL",
    "wafv2:GetWebACLForResource",
    "wafv2:AssociateWebACL",
    "wafv2:DisassociateWebACL"
  ],
  "Resource": "*"
}