配置 Amazon VPC CNI plugin for Kubernetes 将 IAM 角色用于服务账户(IRSA)
Amazon VPC CNI plugin for Kubernetes
-
需要 Amazon Identity and Access Management(IAM)权限。 权限在
AmazonEKS_CNI_Policy
Amazon 托管策略中指定。您可以将该策略附加到 Amazon EKS 节点 IAM 角色或单独 IAM 角色。我们建议您按照本主题中的详细说明,将其分配给一个单独的角色。 -
在部署时创建并配置为使用名为
aws-node
的 Kubernetes 服务账户。服务账户绑定到被分配了所需的 Kubernetes 权限的名为aws-node
的 Kubernetesclusterrole
。
注意
Amazon VPC CNI plugin for Kubernetes 的 Pods 有权访问分配给 Amazon EKS 节点 IAM 角色的权限,除非您阻止对 IMDS 的访问。有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
先决条件
-
现有 Amazon EKS 集群。要部署一个角色,请参阅 开始使用 Amazon EKS。
-
集群的现有 Amazon Identity and Access Management IAM OpenID Connect (OIDC) 提供商。要确定您是否已经拥有一个或是否要创建一个,请参阅 为集群创建 IAM OIDC 提供商。
步骤 1:创建 Amazon VPC CNI plugin for Kubernetes IAM 角色
创建 IAM 角色
-
创建 IAM 角色。您可以使用
eksctl
或kubectl
和 Amazon CLI 以创建 IAM 角色。 (可选)配置您的 Kubernetes 服务账户使用的 Amazon Security Token Service 端点类型。有关更多信息,请参阅 配置服务账户的 Amazon Security Token Service 端点。
步骤 2:重新部署 Amazon VPC CNI plugin for KubernetesPods
-
删除并重新创建任何与服务账户关联的现有 Pods,以应用凭证环境变量。注释未应用于目前在没有注释的情况下运行的 Pods。以下命令删除现有的
aws-node
DaemonSet Pods 并使用服务账户注释部署它们。kubectl delete Pods -n kube-system -l k8s-app=aws-node
-
确认 Pods 已全部重新启动。
kubectl get pods -n kube-system -l k8s-app=aws-node
-
描述 Pods 之一并确保
AWS_WEB_IDENTITY_TOKEN_FILE
和AWS_ROLE_ARN
环境变量存在。将cpjw7
替换为上一步输出中返回的其中一个 Pods 的名称。kubectl describe pod -n kube-system aws-node-
cpjw7
| grep 'AWS_ROLE_ARN:\|AWS_WEB_IDENTITY_TOKEN_FILE:'示例输出如下。
AWS_ROLE_ARN: arn:aws:iam::
111122223333
:role/AmazonEKSVPCCNIRole
AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token AWS_ROLE_ARN: arn:aws:iam::111122223333
:role/AmazonEKSVPCCNIRole
AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token由于 Pod 包含两个容器,因此会返回两组重复的结果。两个容器具有相同的值。
如果您的 Pod 正在使用Amazon Web Services 区域端点,之前的输出中也将返回以下行。
AWS_STS_REGIONAL_ENDPOINTS=regional
步骤 3:从节点 IAM 角色中删除 CNI 策略
如果您的 Amazon EKS 节点 IAM 角色当前附加有 AmazonEKS_CNI_Policy
IAMpolicy,而且您已另行创建了一个 IAM 角色,并已将该策略附加到该 IAM 角色并将其分配给了 aws-node
Kubernetes 服务账户,那么我们建议您使用与您的集群的 IP 系列匹配的 Amazon CLI 命令从节点角色中删除该策略。将
替换为您的节点角色的名称。AmazonEKSNodeRole
-
IPv4
aws iam detach-role-policy --role-name
AmazonEKSNodeRole
--policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy -
IPv6
将
替换为您的账户 ID,并将111122223333
替换为您的AmazonEKS_CNI_IPv6_Policy
IPv6
策略名称。aws iam detach-role-policy --role-name
AmazonEKSNodeRole
--policy-arn arn:aws:iam::111122223333
:policy/AmazonEKS_CNI_IPv6_Policy
为使用 IPv6
系列的集群创建 IAM 策略
如果您创建了使用 IPv6
系列的集群,并且集群配置了 1.10.1
版或更高版本的 Amazon VPC CNI plugin for Kubernetes 附加组件,则需要创建一个 IAM 策略,您可以将其分配给 IAM 角色。如果您现有的集群在创建时没有使用 IPv6
系列进行配置,则必须创建一个新集群才能使用 IPv6
。有关集群使用 IPv6
的详细信息,请参阅 集群、Pods 和 services 的 IPv6 地址。
-
复制以下文本并将其保存到名为
的文件。vpc-cni-ipv6-policy
.json{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssignIpv6Addresses", "ec2:DescribeInstances", "ec2:DescribeTags", "ec2:DescribeNetworkInterfaces", "ec2:DescribeInstanceTypes" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": [ "arn:aws:ec2:*:*:network-interface/*" ] } ] }
创建 IAM 策略。
aws iam create-policy --policy-name
AmazonEKS_CNI_IPv6_Policy
--policy-document file://vpc-cni-ipv6-policy.json