亚马逊AWS官方博客
将 AWS IAM Authenticator 部署到 kops
本博文是将 Heptio Authenticator 部署到 kops 的更新版本。Heptio Authenticator 已捐赠给 Kubernetes 特殊兴趣组 (SIG) AWS,以支持用户针对相关项目开展协作。现在,您可以使用
kops
原语在创建集群时自动部署 Authenticator,而无需进行手动配置。本博文描述了这一更新、更简单的流程。
管理身份验证协议通常是一项繁重的任务,需要管理员去维护可接受用户的列表、持续验证每个用户的权限、删除不需要访问权限的用户,甚至定期对令牌和基于证书的访问权限进行回收再利用。需要管理的系统越多,这些任务就越复杂。正因如此,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
此过程可能需要五到十分钟。您最终会收到一条如下所示的错误消息:
使用 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 来验证用户的身份:
清除
如果您想继续使用此集群,可以让它一直运行。如果您想关闭实例,可以通过调用 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 的文章。