配置 Amazon VPC CNI plugin for Kubernetes 将 IAM 角色用于服务账户
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 Kubernetes 容器组(pod)
-
删除并重新创建任何与服务账户关联的现有 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
IAM policy ,而且您已另行创建了一个 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 policy
如果您创建了使用 IPv6
系列的 1.21
版或更高版本的集群,并且集群配置了 1.10.1
版或更高版本的 Amazon VPC CNI plugin for Kubernetes 附加组件,则需要创建一个 IAM policy,您可以将其分配给 IAM 角色。如果您现有的 1.21
版或更高版本的集群在创建时没有使用 IPv6
系列进行配置,则必须创建一个新集群才能使用 IPv6
。有关集群使用 IPv6
的详细信息,请参阅 教程:将 IPv6 地址分配给 pods 和 services。
-
复制以下文本并将其保存到名为
的文件。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 policy。
aws iam create-policy --policy-name
AmazonEKS_CNI_IPv6_Policy
--policy-document file://vpc-cni-ipv6-policy.json