将 AWS IAM Authenticator 部署到 kops

阅读数:73 2019 年 10 月 7 日 16:16

将 AWS IAM Authenticator 部署到 kops

管理身份验证协议通常是一项繁重的任务,需要管理员去维护可接受用户的列表、持续验证每个用户的权限、删除不需要访问权限的用户,甚至定期对令牌和基于证书的访问权限进行回收再利用。需要管理的系统越多,这些任务就越复杂。正因如此,Amazon 合作伙伴网络中的 AWS 合作伙伴 Heptio 与 AWS 联手开发了 AWS IAM Authenticator,它支持您使用 AWS Identity and Access Management (IAM) 进行联合身份验证。

开始使用

要开始使用,您需要一个 Kubernetes 集群,使之启动并运行的最简单方法是使用 kops。首先,安装 kops 二进制文件(kops 文档对各种安装选项进行了解释说明)。如果您使用的是 macOS,可以运行以下命令:

复制代码
brew update && brew install kops

安装完毕后,请运行以下命令进行验证:

复制代码
$ kops version
Version 1.11.1 (git-0f2aa8d30)

此外,您还需要 Kubernetes 命令行工具 kubectl;您同样可以使用 Homebrew 进行安装:

复制代码
brew install kubernetes-cli

接下来,您需要一个具有以下权限的 IAM 用户:

复制代码
AmazonEC2FullAccess
AmazonRoute53FullAccess
AmazonS3FullAccess
IAMFullAccess
AmazonVPCFullAccess

或者,您可以创建一个新的 IAM 用户,并按照设置 [kops] 环境中的说明附加策略。

您需要安装的最后一个依赖项是 aws-iam-authenticator。目前,最简单的安装方法是使用 go get,前提是已在您的计算机上安装 Golang。如果尚未安装,请按照适用于您的操作系统的 Go 安装说明执行操作。安装 Golang 后,便可安装 Authenticator:

复制代码
go get -u -v sigs.k8s.io/aws-iam-authenticator

请通过尝试运行二进制文件确保 aws-iam-authenticator 位于您的 $PATH 中:

复制代码
aws-iam-authenticator help

如果此操作失败,并显示 -bash: aws-iam-authenticator: command not found,则需要 export 包含 $GOPATH/bin 目录的 PATH(否则,继续执行下面的创建集群操作):

复制代码
export PATH=${PATH}:$GOPATH/bin

创建集群

现在,您已经安装所有依赖项,让我们为您的 kops 集群创建一个支架。只需运行一个命令即可:

复制代码
export ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
export NAME=authenticator.$(cat /dev/random | LC_ALL=C tr -dc "[:alpha:]" | tr '[:upper:]' '[:lower:]' | head -c 10).k8s.local
export KOPS_STATE_STORE=s3://${NAME}
aws s3 mb $KOPS_STATE_STORE
kops create cluster \
--zones us-west-1a \
--name ${NAME}

如果您想将集群部署其他区域中(而非 us-west-1),请确保将 --zones 密钥更改为您所在区域的可用区。

这些命令将创建可用于存储桶和集群的随机 $NAME,创建用于存储集群状态的 Amazon S3 存储桶,并将集群清单写入存储桶。

现在,您已拥有集群清单,可以对其进行修改以自动部署 aws-iam-authenticator。为此,您需要运行 kops edit cluster:

复制代码
kops edit cluster --name ${NAME}

此命令将打开 $EDITOR 会话,显示存储在 Amazon S3 中的集群清单。在此,我们可以在 spec, authorization.rbac 和 authentication.aws 下添加两个密钥。应用后,这将配置控制平面以自动配置 Kubernetes RBAC 并部署 AWS IAM Authenticator。

复制代码
# ...
spec:
# ...
authentication:
aws: {}
authorization:
rbac: {}

现在,保存并关闭此文件。保存后,您需要使用 kops update cluster 创建 kops 集群:

复制代码
kops update cluster ${NAME} --yes

完成后,您可以通过运行 validate 命令来验证集群的状态:

复制代码
kops validate cluster

此过程可能需要五到十分钟。您最终会收到一条如下所示的错误消息:

将 AWS IAM Authenticator 部署到 kops

使用 kubectl describe pod 进行检查:

复制代码
kubectl describe po -n kube-system -l k8s-app=aws-iam-authenticator

这将显示您有一个集群运行,但无法启动 aws-iam-authenticator pod:该 pod 正在等待创建 ConfigMap 以便启动。现在,我们将创建 AWS IAM 策略、角色和 ConfigMap。

创建策略

在向任何人授予对集群的访问权限之前,您首先需要为其他 admin 用户创建 AWS IAM 角色和信任策略。您可以通过 AWS 控制台或使用 AWS CLI 执行此操作:

复制代码
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query 'Account')
export POLICY=$(echo -n '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::'; echo -n "$ACCOUNT_ID"; echo -n ':root"},"Action":"sts:AssumeRole","Condition":{}}]}')
aws iam create-role \
--role-name KubernetesAdmin \
--description "Kubernetes administrator role (for AWS IAM Authenticator for AWS)." \
--assume-role-policy-document "$POLICY" \
--output text \
--query 'Role.Arn'

现在,您可以创建一个 ConfigMap,用于定义拥有集群访问权限的 AWS IAM 角色:

复制代码
cat >aws-auth.yaml <<EOF
---
apiVersion: v1
kind: ConfigMap
metadata:
namespace: kube-system
name: aws-iam-authenticator
labels:
k8s-app: aws-iam-authenticator
data:
config.yaml: |
clusterID: ${NAME}
server:
mapRoles:
- roleARN: arn:aws:iam::${ACCOUNT_ID}:role/KubernetesAdmin
username: kubernetes-admin
groups:
- system:masters
EOF

创建此文件后,您现在可以 apply 此配置:

复制代码
kubectl apply -f aws-auth.yaml

部署完成后,您需要在 kubeconfig 中创建一个新用户。为此,您可以使用自己常用的编辑器打开 ~/. kube/config。创建一个用户,将 ${NAME} 替换为您的集群名称,并将 ${ACCOUNT_ID} 替换为您的账户 ID。

复制代码
# ...
users:
- name: ${NAME}.exec
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
command: aws-iam-authenticator
args:
- "token"
- "-i"
- "${NAME}"
- "-r"
- "arn:aws:iam::${ACCOUNT_ID}:role/KubernetesAdmin"

然后,您需要修改 context 以引用此新用户:

kubectl config set-context $NAME --user=$NAME.exec
完成所有这些操作后,您可以测试针对您的集群的身份验证:

复制代码
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-172-20-53-49.us-west-1.compute.internal Ready node 1h v1.11.7
ip-172-20-54-14.us-west-1.compute.internal Ready node 1h v1.11.7
ip-172-20-62-94.us-west-1.compute.internal Ready master 1h v1.11.7

如果您看到集群节点已列出,则说明 Authenticator 已正确部署,并且正在使用 STS 来验证用户的身份:
将 AWS IAM Authenticator 部署到 kops

清除

如果您想继续使用此集群,可以让它一直运行。如果您想关闭实例,可以通过调用 kops delete cluster 命令来完成:

复制代码
kops delete cluster --name ${NAME} --yes

小结

借助 AWS IAM Authenticator,您能将 Kubernetes apiserver 身份验证与 AWS IAM 联合,从而使您能设置基于 IAM 角色的精细组,这些组会允许精细的 Kubernetes RBAC 规则。您无需发出复杂的命令来管理密钥和证书即可授予 kubectl 访问权限。

感谢 Peter Rifel 最初撰写的关于 AWS IAM Authenticator 的文章。

作者介绍:

Chris Hein
Chris Hein 是一位资深的开发者,倡导 Amazon Web Services 的 Kubernetes/EKS。加入 Amazon 之前,Chris 曾就职于众多规模不等的公司,如 GoPro、Sproutling 和 Mattel。有关 Chris 的更多信息,请访问 https://aws.amazon.com/blogs/opensource/author/heichris/,并通过 @christopherhein 关注他

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/deploying-aws-iam-authenticator-kubernetes-kops/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布