亚马逊AWS官方博客

将 AWS IAM Authenticator 部署到 kops

Authenticator 流程

本博文是将 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.rbacauthentication.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 的文章。

本篇作者

Chris Hein

Chris Hein

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