我一直在尝试遵循EKS的入门指南。
当我试图调用kubectl获取服务时,我收到了消息:错误:您必须登录到服务器(未经授权)
这就是我做的:
1.创建EKS集群
2.按如下方式创建配置文件:
columns.Command(command => {
command.Custom("Edit").Click("ItempopUpManager.btnAddClicked")
.HtmlAttributes(new {
@class = "btn btn-default"
});
}).Width(130)
.Title(Resources.GetString(Constants.Edit));
当我运行heptio-authenticator-aws令牌时,我可以得到一个令牌-r arn:aws:iam :: **********:role / ********* -i我的集群,AME 但是,当我尝试访问群集时,我一直收到错误:您必须登录到服务器(未授权)
知道如何解决这个问题吗?
答案 0 :(得分:26)
创建Amazon EKS集群后,创建集群的IAM实体(用户或角色)将以管理员身份添加到Kubernetes RBAC授权表中。最初,只有该IAM用户可以使用kubectl调用Kubernetes API服务器。
因此,首先要添加对其他 aws 用户的访问权限 您必须编辑ConfigMap才能将IAM用户或角色添加到Amazon EKS集群。
您可以通过执行以下操作来编辑ConfigMap文件:
kubectl edit -n kube-system configmap/aws-auth
,之后您将被授予用于映射新用户的编辑器。
apiVersion: v1
data:
mapRoles: |
- rolearn: arn:aws:iam::555555555555:role/devel-worker-nodes-NodeInstanceRole-74RF4UBDUKL6
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes
mapUsers: |
- userarn: arn:aws:iam::111122223333:user/ops-user
username: ops-user
groups:
- system:masters
mapAccounts: |
- "111122223333"
请注意要在其中添加 ops-user 的mapUsers
和mapAccounts
标签,该标签将 AWS 用户帐户与用户名Kubernetes集群。
但是,仅此操作不会在RBAC中提供任何权限;您仍必须在集群中创建角色绑定以提供这些实体权限。
正如亚马逊文档(iam-docs)所述,您需要在kubernetes集群上为ConfigMap中指定的用户创建角色绑定。您可以通过执行休闲命令(kub-docs)来做到这一点:
kubectl create clusterrolebinding ops-user-cluster-admin-binding --clusterrole=cluster-admin --user=ops-user
将集群管理员ClusterRole
授予整个集群中名为 ops-user 的用户。
答案 1 :(得分:11)
我确定问题已经解决,但是我将在此处提供更多信息,因此,如果还有其他人仍然面临与以下任何设置相关的问题,那么他们可能不会像我一样浪费时间并使用这些步骤。
当我们通过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 CLI上正确设置了IAM用户凭据
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集群的访问权限,您也可以为上述用户使用相同的命令集。
答案 2 :(得分:6)
如果您使用eksctl来管理AWS eks部署,则可以使用以下命令将用户添加到配置映射中:
eksctl create iamidentitymapping --cluster <cluster-name> --arn arn:aws:iam::<id>:user/<user-name> --group system:masters --username ops-user
答案 3 :(得分:4)
另外,请确保您的用户位于aws-auth k8s ConfigMap:
中https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html
答案 4 :(得分:2)
我有同样的问题。您可能正在使用root帐户。看来根帐户被阻止担任所需角色。如果您使用过期的密钥,则有时可以掩盖此错误。
答案 5 :(得分:2)
我注释掉了配置文件的最后两行
PatrolID int (PK)
location_id int NULL FK
assign_no int NULL FK
officer_id int NULL FK
虽然我不知道为什么
但它有效答案 6 :(得分:1)
就我而言,这是AWS配置文件问题,请确保使用aws sts get-caller-identity
来验证IAM用户。
答案 7 :(得分:1)
您需要在通过AWS cli访问它的同一个IAM配置文件下创建集群。
另一方面,在~/.aws/credentials
内,访问kubectl 的配置文件必须与用于创建群集的完全相同的IAM 匹配。
我的建议是使用AWS cli来创建群集,因为从GUI创建可能比有用更令人困惑。 Getting Started指南是您启动和运行的最佳选择。
答案 8 :(得分:1)
问题在于为创建的角色添加的策略。我们必须有 AWSEKSCNI 策略。
最好使用以下命令创建 eks:
eksctl 创建集群 --name ekscluster --version 1.19 --with-oidc
--vpc-public-subnets=subnet-08c6b0b0166abc1d1,subnet-02822a142bb5a802a
--vpc-private-subnets=subnet-09bbf4871902ee64c,subnet-0926c224909b5a811
这将使用 cloudformation 自动创建和分配策略。
答案 9 :(得分:1)
对我而言,问题是我设置了具有不同的、无效的 AWS 凭证的环境变量(可能很久以前,忘记了)。在运行 aws configure list
并看到凭据与我对 aws configure list --profile default
的预期不同后,我意识到了这一点。查找并删除那些无效的环境变量解决了这个问题,现在我可以运行 kubectl get svc
。
答案 10 :(得分:0)
我刚刚调试了这个问题。我有个问题。您是否在公司wifi网络上运行此程序?如果是,是否可以创建EC2实例,然后测试是否能够执行kubectl get svc
?
也请尝试此命令是否有效
kubectl get svc ---insecure-skip-tls-verify
答案 11 :(得分:0)
我在minikube上的本地环境中也发生了这种情况,独立于EKS。我的问题与以下问题有关:https://github.com/kubernetes/kubernetes/issues/76774
我采用的解决方案是删除kubectl的缓存目录:rm -rf ~/.kube/{cache,http-cache}
。我猜这是撰写本文时唯一的解决方法。
答案 12 :(得分:0)
我遇到了同样的问题,我的CLI的AWS凭证经常更改。这些步骤解决了问题:
export AWS_ACCESS_KEY_ID="***************"
export AWS_SECRET_ACCESS_KEY="*************"
export AWS_SESSION_TOKEN="************************"
答案 13 :(得分:0)
当我使用eks控制台的根目录创建eks集群时遇到此错误。我使用IAM用户重新创建了eks集群,并使用访问键更新了AWS配置。有效。现在,您可以添加其他IAM用户来发出kubectl命令。
答案 14 :(得分:0)
我试图创建一个带有私有端点的 EKS 集群。多次阅读此线程以及对我有用的内容:
最后 2 个命令是从同一 VPC 的 ec2 实例部分执行的。
答案 15 :(得分:0)
我遇到了同样的问题。我尝试使用访问密钥和秘密密钥直接配置 AWS CLI 并且成功了。
无法担任角色应该是错误。尝试设置 cli 并进行测试。
答案 16 :(得分:0)
就我而言,情况是,我更换了一名 DevOps 人员,并在 aws 上创建了所有基础设施。他有自己的 IAM 用户(所以是的,没有 root 访问案例,但也可能适用),拥有所有 AWS 权限,而我拥有自己的 IAM 用户,也拥有所有可用的 AWS 权限。
所以,他离开了公司,这就是问题所在,因为我没有任何访问集群的权限,而集群默认只共享给创建者……事实上,我所有访问集群的方法都失败了,即使事实上我拥有所有权限。
好消息是,我替换的那个人仍然有他的 IAM 用户可用(未删除)。而我所做的,我只是在他的账户下生成了新的 AWS 访问对,并将它们设置为我的 ubuntu 主机上的默认 aws 凭证(我试图从中访问集群)。重要的部分是确保在运行 aws sts get-caller-identity
命令后,它意味着 HIS 帐户出现在输出中。在那种情况下,我已经能够在没有 error You must be logged in to the server (Unauthorized)
消息的情况下运行我想要的所有 kubectl 命令。
所以解决方案是 - 幸运地找到集群创建者凭据并使用它们! (不过听起来像是犯罪……)