我已使用AWS控制台创建了EKS集群,同时在创建集群时使用了预先创建的VPC和子网,同时创建了一个角色eks-role
,该角色具有AmazonEKSClusterPolicy
和AmazonEKSServicePolicy
附加到它。
我使用以下方法添加了kubeconfig
文件:
aws eks update-kubeconfig --name eks-cluster --role-arn "arn:aws:iam::############:role/eks-role"
当我使用kubectl get svc
命令时,出现以下错误:
调用AssumeRole操作时发生错误(AccessDenied):访问被拒绝
我不知道这可能是什么问题。
在我的用户中,我添加了以下策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::############:role/eks-role"
}
]
}
在这个角色中,我添加了信任关系:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::############:user/test"
},
"Action": "sts:AssumeRole"
}
]
}
我的~/.aws/credentials
文件如下:
**[default]**
aws_access_key_id = ##############
aws_secret_access_key = #############################
region=us-west-1
**[test]**
aws_access_key_id = ###########
aws_secret_access_key = #############################
region=ap-southeast-1
**[eks]**
role_arn = arn:aws:iam::##########:role/eks-role
source_profile = test
答案 0 :(得分:6)
我确定问题已经解决,但是我将在此处提供更多信息,因此,如果还有其他人仍在面对问题,那么他们可能不会像我一样浪费时间并使用这些步骤。
当我们通过CloudFormation / CLI / EKSCTL通过任何方法创建EKS集群时,创建集群的IAM角色/用户将自动绑定到默认的kubernetes RBAC API组system:masters
(https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles),并且这样,集群的创建者将获得对集群的管理员访问权限。尽管我们始终可以使用aws-auth文件将访问权限授予其他IAM用户/角色,但是为此,我们必须使用创建集群的IAM用户/角色。
要验证EKS集群的角色/用户,我们可以在cloudtrail上搜索CreateCluster"
Api调用,它将在sessionIssuer
部分的字段{{1中告诉我们集群的创建者}}(https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)。
当我们使用IAM角色或IAM用户创建集群时,使用我们的角色与用户比较创建集群时,为EKS集群设置访问权限将变得很困难。
在设置对EKS群集的访问权限时,我将介绍针对每种不同方法可以遵循的步骤。
确认已通过运行命令arn
aws sts get-caller-identity
之后,使用以下命令更新kubeconfig文件
$ aws sts get-caller-identity
{
"Account": "xxxxxxxxxxxx",
"UserId": "xxxxxxxxxxxxxxxxxxxxx",
"Arn": "arn:aws:iam::xxxxxxxxxxx:user/eks-user"
}
将配置文件附加到通过上述命令更新后的外观。除非有必要,否则请不要直接编辑此文件。
aws eks --region region-code update-kubeconfig --name cluster_name
完成上述设置后,您应该可以运行kubectl命令。
$ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: CERT
server: https://xxxxxxx.sk1.us-east-1.eks.amazonaws.com
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
contexts:
- context:
cluster: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
current-context: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- --region
- us-east-1
- eks
- get-token
- --cluster-name
- eks-cluster
command: aws
在通过IAM角色创建群集时,主要有四种通过cli设置访问的方法。
1。直接在kubeconfig文件中设置角色。
在这种情况下,我们不必在运行kubectl命令之前通过cli手动进行任何角色api调用,因为这将由kube配置文件中设置的 $ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP xxx.xx.x.x <none> 443/TCP 12d
自动完成。
让我们现在说,我们正在尝试为用户aws/aws-iam-authenticator
设置访问权限,首先要确保用户确实具有承担角色eks-user
的权限
向eks-role
eks-user
编辑角色上的信任关系,以便允许{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::xxxxxxxxxxx:role/eks-role"
}
]
}
担任角色。
eks-user
确认已通过运行命令{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxxx:user/eks-user"
},
"Action": "sts:AssumeRole"
}
]
}
在创建集群的AWS cli上正确设置了IAM用户凭证。请记住,重要的是应该向我们显示IAM用户ARN,而不是IAM假定的角色ARN。
aws sts get-caller-identity
之后,使用以下命令更新kubeconfig文件
$ aws sts get-caller-identity
{
"Account": "xxxxxxxxxxxx",
"UserId": "xxxxxxxxxxxxxxxxxxxxx",
"Arn": "arn:aws:iam::xxxxxxxxxxx:user/eks-user"
}
将配置文件附加到通过上述命令更新后的外观。除非有必要,否则请不要直接编辑此文件。
aws eks --region region-code update-kubeconfig --name cluster_name --role-arn arn:aws:iam::xxxxxxxxxxx:user/eks-role
完成上述设置后,您应该可以运行kubectl命令。
$ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: CERT
server: https://xxxxxxx.sk1.us-east-1.eks.amazonaws.com
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
contexts:
- context:
cluster: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
current-context: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- --region
- us-east-1
- eks
- get-token
- --cluster-name
- eks-cluster
- --role
- arn:aws:iam::xxxxxxx:role/eks-role
command: aws
2。如果您已在CLI上设置了AWS配置文件(https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html),并且想与kube配置一起使用。
确认配置文件设置正确,以便它可以使用 $ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP xxx.xx.x.x <none> 443/TCP 12d
的凭据
eks-user
配置文件配置完成后,请运行命令 $ cat ~/.aws/config
[default]
output = json
region = us-east-1
[eks]
output = json
region = us-east-1
[profile adminrole]
role_arn = arn:aws:iam::############:role/eks-role
source_profile = eks
$ cat ~/.aws/credentials
[default]
aws_access_key_id = xxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[eks]
aws_access_key_id = xxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws sts get-caller-identity --profile eks
之后,使用配置文件中的以下命令更新kubeconfig文件,请确保我们不在此处使用该角色。
$ aws sts get-caller-identity --profile eks
{
"Account": "xxxxxxxxxxxx",
"UserId": "xxxxxxxxxxxxxxxxxxxxx",
"Arn": "arn:aws:iam::xxxxxxxxxxx:user/eks-user"
}
将配置文件附加到通过上述命令更新后的外观。除非有必要,否则请不要直接编辑此文件。
aws eks update-kubeconfig --name devel --profile eks
完成上述设置后,您应该可以运行kubectl命令。
$ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: CERT
server: https://xxxxx.sk1.us-east-1.eks.amazonaws.com
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
contexts:
- context:
cluster: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
current-context: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- --region
- us-east-1
- eks
- get-token
- --cluster-name
- eks-cluster
command: aws
env:
- name: AWS_PROFILE
value: eks
3。可以通过其他任何方式承担角色,例如,我们可以将IAM角色直接附加到实例。
如果角色直接附加到实例配置文件,那么在方案1中为IAM用户设置访问权限时,我们可以遵循与步骤类似的步骤
验证我们已将正确的角色附加到EC2实例上,并且由于此实例配置文件将成为最低优先级,因此此步骤还将验证实例上是否没有任何其他凭据设置。
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP xxx.xx.x.x <none> 443/TCP 12d
之后,使用以下命令更新kubeconfig文件
[ec2-user@ip-xx-xxx-xx-252 ~]$ aws sts get-caller-identity
{
"Account": "xxxxxxxxxxxx",
"UserId": "xxxxxxxxxxxxxxxxxxxxx:i-xxxxxxxxxxx",
"Arn": "arn:aws:sts::xxxxxxxxxxxx:assumed-role/eks-role/i-xxxxxxxxxxx"
}
将配置文件附加到通过上述命令更新后的外观。除非有必要,否则请不要直接编辑此文件。
aws eks --region region-code update-kubeconfig --name cluster_name
完成上述设置后,您应该可以运行kubectl命令。
$ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: CERT
server: https://xxxxxxx.sk1.us-east-1.eks.amazonaws.com
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
contexts:
- context:
cluster: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
current-context: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- --region
- us-east-1
- eks
- get-token
- --cluster-name
- eks-cluster
command: aws
4。通过 $ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP xxx.xx.x.x <none> 443/TCP 12d
命令手动承担IAM角色。
通过运行cli命令手动设置角色aws sts assume-role
。
eks-role
然后,使用上面输出中的值设置所需的环境变量,以便我们可以使用从会话生成的正确凭据。
aws sts assume-role --role-arn arn:aws:iam::xxxxxxxxxxx:role/eks-role --role-session-name test
{
"AssumedRoleUser": {
"AssumedRoleId": "xxxxxxxxxxxxxxxxxxxx:test",
"Arn": "arn:aws:sts::xxxxxxxxxxx:assumed-role/eks-role/test"
},
"Credentials": {
"SecretAccessKey": "xxxxxxxxxx",
"SessionToken": xxxxxxxxxxx",
"Expiration": "xxxxxxxxx",
"AccessKeyId": "xxxxxxxxxx"
}
}
在那之后,通过运行命令export AWS_ACCESS_KEY_ID=xxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxx
export AWS_SESSION_TOKEN=xxxxxxxxxx
验证我们是否承担了IAM角色。
$ aws sts get-caller-identity { “帐户”:“ xxxxxxxxxx”, “ UserId”:“ xxxxxxxxxx:test”, “ Arn”:“ arn:aws:sts :: xxxxxxxxxx:假定角色/ eks角色/测试” }
之后,使用以下命令更新kubeconfig文件
aws sts get-caller-identity
将配置文件附加到通过上述命令更新后的外观。除非有必要,否则请不要直接编辑此文件。
aws eks --region region-code update-kubeconfig --name cluster_name
完成上述设置后,您应该可以运行kubectl命令。
$ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: CERT
server: https://xxxxxxx.sk1.us-east-1.eks.amazonaws.com
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
contexts:
- context:
cluster: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
current-context: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
kind: Config
preferences: {}
users:
- name: arn:aws:eks:us-east-1:xxxxxxx:cluster/eks-cluster
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
args:
- --region
- us-east-1
- eks
- get-token
- --cluster-name
- eks-cluster
command: aws
注意:
我已经在这里尝试介绍主要用例,但是在我们需要设置对群集的访问权限的情况下,可能还会有其他用例。
此外,以上测试主要针对首次设置EKS集群,并且上述方法均未涉及aws-auth configmap。 但是,一旦您通过aws-auth(https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html)文件授予了其他IAM用户/角色对EKS群集的访问权限,您也可以为这些用户使用同一组命令。