向开发人员授予对EKS Kubernetes集群的访问权限
在上一篇文章中,我们介绍了在Amazon Cloud平台上安装EKS群集的步骤。 Amazon Elastic Kubernetes服务(Amazon EKS)是一项完全托管的Kubernetes服务,它消除了包括SysAdmin的etcd在内的控制平面管理的麻烦。只需单击一个按钮,即可轻松升级集群。在本简短教程中,我将逐步指导我们使用IAM策略和Kubernetes本机RBAC向开发人员授予对Kubernetes命名空间的访问权限。
为了使本教程对我们有所帮助,应勾选以下一些准备工作:工作的EKS集群:检查EKS集群的安装工作的AWS CLI配置:在LinuxIAM上安装和使用AWS CLI具有必需的管理权限的用户访问AWS Web Console进行管理。可以在CLI中完全完成相同的操作,但请同时使用两者。
开始之前
确认我们可以列出可以访问EKS控制平面的本地计算机或者堡垒服务器上的群集。
$eksctl get cluster NAME REGION prod-eks-cluster eu-west-1
或者使用aws命令。
$aws eks list-clusters
如果命令未返回任何输出,请检查我们是否使用了正确的凭据和区域。
从Web控制台:
默认情况下,只有Amazon EKS集群的创建者才具有system:masters权限,该权限可解锁要从kubectl执行的所有Kubernetes集群操作。为了扩展功能以便其他用户可以访问群集,将修改aws-authConfigMap。
非常需要创建一个具有AWSSecurity令牌服务(STS)权限的IAM角色,该权限允许用户请求临时的受限特权凭证。
建立IAM角色
接下来是在IAM>角色>创建角色上创建角色。
选择另一个AWS账户作为受信任实体的类型:
不要附上任何许可
添加适当的标签。
为角色命名,然后使用底部的"创建角色"按钮进行创建。我的将被称为k8s-devs-role,这与创建策略时设置的名称相同。
使用STS创建IAM策略承担角色权限
登录到AWS Web控制台并导航到IAM>策略>创建策略> JSON并粘贴在json内容下方,将<accountid>替换为AWS账户ID,并将k8s-devs-role替换为我们创建的角色的名称。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::<accountid>:role/k8s-devs-role" }, { "Effect": "Allow", "Action": [ "eks:DescribeCluster", "eks:ListClusters" ], "Resource": "*" } ] }
帐户ID 293759796572的示例
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::293759796572:role/k8s-devs-role" }, { "Effect": "Allow", "Action": [ "eks:DescribeCluster", "eks:ListClusters" ], "Resource": "*" } ] }
为策略命名,然后点击"创建"按钮。
建立IAM使用者群组
创建一个名为k8s-devs的IAM组
添加在中创建的策略。
查看策略并完成创建过程。
将IAM用户添加到组
我们的最后一步是将需要访问Kubernetes Cluster的IAM用户添加到我们刚刚创建的组中。
转到IAM>组> k8s-devs>将用户添加到组以将用户添加到组。
添加我们要授予访问权限的所有其他用户。
为开发人员创建Kubernetes RBAC
基于角色的访问控制(RBAC)是一种根据组织内各个用户的角色来调节对计算机或者网络资源的访问的方法。 RBAC API声明了四种Kubernetes对象:Role,ClusterRole,RoleBinding和ClusterRoleBinding。
首先,创建三个使开发人员可以访问的命名空间:prod,uat和dev
$kubectl create namespace prod namespace/prod created $kubectl create namespace uat namespace/uat created $kubectl create namespace dev namespace/dev created
列出所有名称空间以确认创建。
$kubectl get ns NAME STATUS AGE default Active 25d dev Active 9s istio-operator Active 14d istio-system Active 14d kube-node-lease Active 25d kube-public Active 25d kube-system Active 25d monitoring Active 17d prod Active 40s uat Active 26s
创建集群角色
恶意创建一个名为dev-full-access的群集角色,其列表文件如下所示:
kubectl apply -f - <<EOF kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: dev-full-access rules: - apiGroups: ["", "extensions", "apps"] resources: ["*"] verbs: ["*"] - apiGroups: ["batch"] resources: - jobs - cronjobs verbs: ["*"] - apiGroups: ["autoscaling"] resources: ["*"] verbs: ["*"] EOF
预期产量:
clusterrole.rbac.authorization.k8s.io/dev-full-access created
确认设置:
$kubectl get clusterroles dev-full-access -o yaml
创建角色绑定
接下来是为我们的开发人员创建组角色绑定。
$vim k8s-access.sh
该组称为k8s-devs
# Access to Prod namespace NAMESPACE="prod" CLUSTERROLE="dev-full-access" kubectl apply -f - <<EOF kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: dev-full-access namespace: $NAMESPACE subjects: - kind: Group name: "k8s-devs" apiGroup: rbac.authorization.k8s.io namespace: $NAMESPACE roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: $CLUSTERROLE EOF
应用配置:
sh k8s-access.sh
类似的配置用于允许访问其他名称空间:
# Access to UAT namespace NAMESPACE="uat" CLUSTERROLE="dev-full-access" kubectl apply -f - <<EOF kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: dev-full-access namespace: $NAMESPACE subjects: - kind: Group name: "k8s-devs" apiGroup: rbac.authorization.k8s.io namespace: $NAMESPACE roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: $CLUSTERROLE EOF # Access to dev namespace NAMESPACE="dev" CLUSTERROLE="dev-full-access" kubectl apply -f - <<EOF kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: dev-full-access namespace: $NAMESPACE subjects: - kind: Group name: "k8s-devs" apiGroup: rbac.authorization.k8s.io namespace: $NAMESPACE roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: $CLUSTERROLE EOF
编辑Kubernetes aws-auth ConfigMap
要授予其他AWS用户或者角色与集群进行交互的能力,我们必须在Kubernetes中编辑aws-authConfigConfigMap。
检查是否已经应用了aws-auth ConfigMap。
$kubectl describe configmap -n kube-system aws-auth
将IAM用户或者角色添加到Amazon EKS集群
通过编辑aws-auth ConfigMap,可以将在中创建的IAM角色添加到EKS集群中。
$kubectl edit -n kube-system configmap/aws-auth
更新data.mapRoles部分以授权使用IAM角色和Kubernetes RBAC组的访问。
apiVersion: v1 data: mapRoles: | - groups: - k8s-devs rolearn: arn:aws:iam::<accountid>:role/k8s-devs-role username: developer
将<accountid>替换为AWS账户的账户ID。
这是我的配置的屏幕截图:
如果要授予特定用户"主管理员"访问权限,请添加如下内容。
mapUsers: | - groups: - system:masters userarn: arn:aws:iam::<accountid>:user/<username> username: arn:aws:iam::<accountid>:user/<username>
或者只是访问前面在角色绑定中设置的特定名称空间:
mapUsers: | - groups: - k8s-devs userarn: arn:aws:iam::<accountid>:user/<username> username: arn:aws:iam::<accountid>:user/<username>
为Amazon EKS创建kubeconfig(作为开发人员)
开发人员将需要首先安装AWS CLI并配置其凭证。
$aws configure
设置凭据后,请使用以下命令进行确认:
$aws sts get-caller-identity
预期产量:
{ "UserId": "<returnedid>", "Account": "<acocuntid>", "Arn": "arn:aws:iam::<acocuntid>:user/<username>" }
开发人员将使用AWS CLI update-kubeconfig命令为集群创建或者更新kubeconfig:
aws eks --region <regioncode> update-kubeconfig --name <clustername> --role-arn arn:aws:iam::<accountid>:role/k8s-devs-role
以下示例是针对在帐户ID 293759796572的eu-west-1区域中创建的名为prod-eks-cluster的集群的
$aws eks --region eu-west-1 update-kubeconfig --name prod-eks-cluster --role-arn arn:aws:iam::293759796572:role/k8s-devs-role
命令输出:
Added new context arn:aws:eks:eu-west-1:293759796572:cluster/prod-eks-cluster to /var/root/.kube/config
尝试列出群集作用域资源,我们将收到"禁止"错误消息:
$kubectl get nodes Error from server (Forbidden): nodes is forbidden: User "developer" cannot list resource "nodes" in API group "" at the cluster scope
但是我们应该能够列出名称空间作用域资源:
$kubectl get all -n prod No resources found in prod namespace. $kubectl get all -n uat No resources found in prod namespace. $kubectl get all -n dev No resources found in prod namespace.
部署测试应用程序:
$kubectl run nginx-example --image=nginx --replicas=2 -n dev deployment.apps/nginx-example created $kubectl get pods -n dev NAME READY STATUS RESTARTS AGE nginx-example-79c476f965-jqm6f 1/1 Running 0 29s nginx-example-79c476f965-lkzll 1/1 Running 0 29s $kubectl delete deploy nginx-example -n dev deployment.apps "nginx-example" deleted