向开发人员授予对EKS Kubernetes集群的访问权限

时间:2020-02-23 14:31:31  来源:igfitidea点击:

在上一篇文章中,我们介绍了在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