授予开发人员访问EKS Kubernetes集群

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

在上一篇文章中,我们涵盖了Amazon云平台中EKS群集的安装步骤。
Amazon Elastic Kubernetes服务(亚马逊EAKS)是一个完全管理的Kubernetes服务,它占据了来自Sysadmin的etcd的控制平面管理的头痛。
单击按钮可以轻松完成升级群集。
在此简短教程中,我将通过IAM策略和Kubernetes Native RBAC授予开发人员访问Kubernetes命名空间的过程。

对于本教程,支持应勾选的一些准备工作是:一个工作EKS群集:检查EKSworking AWS CLI配置的eks的安装:在Linuxiam用户上安装和使用AWS Web控制台的AWS CLI。
可以在CLI中完全完成相同的操作,但我们将使用两者。

在你开始之前

确认我们可以从本地计算机或者堡垒服务器列出群集,可以访问EKS控制平面。

$eksctl get cluster
NAME			REGION
prod-eks-cluster	eu-west-1

或者使用AWS命令。

$aws eks list-clusters

如果命令不会返回任何输出检查是否使用正确的凭据和区域。

来自Web控制台:

默认情况下,只有Amazon EAKS群集的创建者具有系统:Masters权限,解锁所有Kubernetes群集操作要从Kubect执行。
要扩展函数,因此其他用户可以访问群集,将修改AWS-Auth ConfigMap。

我们需要使用AWS安全令牌服务(STS)权限创建IAM角色,允许用户请求临时限制权限凭据。

第1步:创建IAM角色

接下来是在IAM>角色>创建角色上创建一个角色。

选择"另一个AWS帐户"作为可信实体类型:

不附上任何许可

添加适当的标记。

为一个角色一个名称并使用底部的"创建角色"按钮创建它。
我将被称为K8S-Devs-角色,这是在策略创建中设置的名称。

第2步:使用STS创建IAM策略假设角色权限

登录AWS Web控制台并导航到IAM>策略>创建策略> JSON和粘贴下面的JSON内容替换<AccountID>与AWS帐户ID和K8S-Devs-角色以及我们创建的角色的名称。

{
    "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": "*"
        }
    ]
}

为策略提供名称并点击"创建"按钮。

第3步:创建IAM用户组

创建一个名为K8S-Devs的IAM组

附上第2步中创建的策略。

查看策略和完整的创建过程。

第4步:将IAM用户添加到组

我们的最后一步是加入需要访问Kubernetes集群的IAM用户,我们刚刚创建的组。

转到IAM>组> K8S-DEVS>将用户添加到组中将用户添加到该组。

添加要授予访问权限的所有其他用户。

第5步:为开发人员创建Kubernetes RBAC

基于角色的访问控制(RBAC)是根据组织内的各个用户的角色来调节对计算机或者网络资源的访问的方法。
RBAC API声明了四种Kubernetes对象:角色,ClusterRole,Regbinding和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-action的群集角色,其列表文件如下所示:

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

第6步:编辑Kubernetes AWS-Auth ConfigMap

要授予额外的AWS用户或者角色与群集交互的函数,我们必须编辑 aws-auth在Kubernetes中的ConfigMap。

检查我们是否已应用AWS-Auth ConfigMap。

$kubectl describe configmap -n kube-system aws-auth

将IAM用户或者角色添加到Amazon EKS群集

我们将通过编辑AWS-Auth ConfigMap在步骤1中创建的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

替换:<AccoundID>使用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>

第7步:为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

下面的例子是用于群集名为eu-west-1区域创建的prod-eks群集,账户ID 293759796572

$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