有关身份验证的完整概述,请参阅Authentication 和 Authorization 上的官方 Kubernetes 文档
对于用户,理想情况下您使用 Kubernetes 的身份提供程序 (OpenID Connect)。
如果您使用 GKE / ACS,您将与各自的身份和访问管理框架集成
如果您自托管 kubernetes(使用 kops 时就是这种情况),您可以使用 coreos/dex 与 LDAP / OAuth2 身份提供者集成 - 一个很好的参考是这篇详细的 2 部分 SSO for Kubernetes 文章。
kops (1.10+) 现在有内置的authentication support,如果您在 AWS 上,它可以简化与作为身份提供商的 AWS IAM 的集成。
对于 Dex,有几个开源的 cli 客户端如下:
如果您正在寻找一种快速且简单(从长远来看不是最安全且易于管理)的入门方式,您可能会滥用 serviceaccounts - 有 2 个选项用于控制访问的专用策略。 (见下文)
强烈建议从 1.6 开始注意基于角色的访问控制!此答案不包括 RBAC 设置
编辑:很棒,但已经过时(2017-2018),Bitnami 在User setup with RBAC 上的指南也可用。
启用服务帐户访问权限的步骤是(取决于您的集群配置是否包含 RBAC 或 ABAC 策略,这些帐户可能拥有完整的管理员权限!):
编辑:Here is a bash script to automate Service Account creation - see below steps
-
为用户Alice创建服务帐号
kubectl create sa alice
-
获取相关秘密
secret=$(kubectl get sa alice -o json | jq -r .secrets[].name)
-
从秘密中获取ca.crt(使用OSX base64 和-D 标志进行解码)
kubectl get secret $secret -o json | jq -r '.data["ca.crt"]' | base64 -D > ca.crt
-
从密钥中获取服务帐户令牌
user_token=$(kubectl get secret $secret -o json | jq -r '.data["token"]' | base64 -D)
-
从您的 kubectl 配置(当前上下文、服务器..)中获取信息
# get current context
c=$(kubectl config current-context)
# get cluster name of context
name=$(kubectl config get-contexts $c | awk '{print $3}' | tail -n 1)
# get endpoint of current context
endpoint=$(kubectl config view -o jsonpath="{.clusters[?(@.name == \"$name\")].cluster.server}")
-
在新机器上,按照以下步骤操作(鉴于上面检索到的 ca.cert 和 $endpoint 信息:
-
安装kubectl
brew install kubectl
-
设置集群(在存储ca.crt的目录下运行)
kubectl config set-cluster cluster-staging \
--embed-certs=true \
--server=$endpoint \
--certificate-authority=./ca.crt
-
设置用户凭据
kubectl config set-credentials alice-staging --token=$user_token
-
定义 alice 用户与暂存集群的组合
kubectl config set-context alice-staging \
--cluster=cluster-staging \
--user=alice-staging \
--namespace=alice
-
为用户将当前上下文切换为alice-staging
kubectl config use-context alice-staging
要使用策略控制用户访问(使用ABAC),您需要创建一个policy 文件(例如):
{
"apiVersion": "abac.authorization.kubernetes.io/v1beta1",
"kind": "Policy",
"spec": {
"user": "system:serviceaccount:default:alice",
"namespace": "default",
"resource": "*",
"readonly": true
}
}
在每个主节点上提供此 policy.json 并将 --authorization-mode=ABAC --authorization-policy-file=/path/to/policy.json 标志添加到 API 服务器
这将允许 Alice(通过她的服务帐户)仅对默认命名空间中的所有资源拥有只读权限。