如何将用户添加到 Kubernetes (kubectl) ?

我已经用 警察在 AWS 上创建了一个 Kubernetes 集群,并且可以在本地机器上通过 kubectl成功地管理它。

我可以用 kubectl config view查看当前配置,也可以直接访问 ~/.kube/config上的存储状态,例如:

apiVersion: v1
clusters:
- cluster:
certificate-authority-data: REDACTED
server: https://api.{CLUSTER_NAME}
name: {CLUSTER_NAME}
contexts:
- context:
cluster: {CLUSTER_NAME}
user: {CLUSTER_NAME}
name: {CLUSTER_NAME}
current-context: {CLUSTER_NAME}
kind: Config
preferences: {}
users:
- name: {CLUSTER_NAME}
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
password: REDACTED
username: admin
- name: {CLUSTER_NAME}-basic-auth
user:
password: REDACTED
username: admin

我需要使其他用户也管理。这个 用户指南描述了如何在另一台用户机器上定义这些凭据,但是没有描述如何在集群本身内实际创建用户凭据。你是怎么做到的?

还有,共享 cluster.certificate-authority-data安全吗?

91998 次浏览

你说:

我需要使其他用户也管理。

但根据 文件

普通用户被认为是由一个外部的、独立的服务来管理的。管理员分发私人密钥,像 Keystone 或 Google 帐户这样的用户商店,甚至包含用户名和密码列表的文件。在这方面,Kubernetes 没有代表普通用户帐户的对象。无法通过 API 调用将普通用户添加到集群中。

您必须使用第三方工具。

= = 编辑 = =

一种解决方案是在 Kubeconfig 文件中手动创建一个用户条目:

# create kubeconfig entry
$ kubectl config set-cluster $CLUSTER_NICK \
--server=https://1.1.1.1 \
--certificate-authority=/path/to/apiserver/ca_file \
--embed-certs=true \
# Or if tls not needed, replace --certificate-authority and --embed-certs with
--insecure-skip-tls-verify=true \
--kubeconfig=/path/to/standalone/.kube/config


# create user entry
$ kubectl config set-credentials $USER_NICK \
# bearer token credentials, generated on kube master
--token=$token \
# use either username|password or token, not both
--username=$username \
--password=$password \
--client-certificate=/path/to/crt_file \
--client-key=/path/to/key_file \
--embed-certs=true \
--kubeconfig=/path/to/standalone/.kube/config


# create context entry
$ kubectl config set-context $CONTEXT_NAME \
--cluster=$CLUSTER_NICK \
--user=$USER_NICK \
--kubeconfig=/path/to/standalone/.kube/config

有关身份验证的完整概述,请参阅 认证授权上的官方 Kubernetes 文档

对于用户,理想情况下使用 Kubernetes 的 Identity 提供程序(OpenIDConnect)。

如果您使用的是 GKE/ACS,则需要集成相应的身份和访问管理框架

如果您自己主持 kubernetes (当您使用 kops 时就是这种情况) ,那么您可以使用 Coreos/Dex与 LDAP/OAuth2身份提供程序集成-一个很好的参考是这篇详细的 Kubernetes 的 SSO文章的第2部分。

Kops (1.10 +)现在有内置的 身份验证支持,如果您使用 AWS,它可以简化与作为身份提供者的 AWS IAM 的集成。

对于 Dex 来说,有一些开源的 cli 客户端如下:

如果你正在寻找一个快速和容易(不是最安全和容易管理的长期)的方式开始,你可能会滥用 serviceaccounts-有两个专门的政策选项来控制访问。(见下文)

注意,强烈建议使用1.6基于角色的访问控制! 这个答案不包括 RBAC 设置

编辑 : 很好,但是过时了(2017-2018) ,也可以在 用 RBAC 设置用户上看到 Bitnami 的指南。

Steps to enable service account access are (depending on if your cluster configuration includes RBAC or ABAC policies, these accounts may have full Admin rights!):

这是一个自动创建服务帐户的 bash 脚本——参见下面的步骤

  1. 为用户 Alice创建服务帐户

    kubectl create sa alice
    
  2. 得到相关的秘密

    secret=$(kubectl get sa alice -o json | jq -r .secrets[].name)
    
  3. 从 secret 获取 ca.crt(使用带有 -D标志的 OSXbase64进行解码)

    kubectl get secret $secret -o json | jq -r '.data["ca.crt"]' | base64 -D > ca.crt
    
  4. 从 secret 获取服务帐户令牌

    user_token=$(kubectl get secret $secret -o json | jq -r '.data["token"]' | base64 -D)
    
  5. 从 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}")
    
  6. 在一台新机器上,遵循以下步骤(给定上面检索到的 ca.cert$endpoint信息:

    1. 安装 kubectl

       brew install kubectl
      
    2. 设置集群(在存储 ca.crt的目录中运行)

       kubectl config set-cluster cluster-staging \
      --embed-certs=true \
      --server=$endpoint \
      --certificate-authority=./ca.crt
      
    3. 设置用户凭据

       kubectl config set-credentials alice-staging --token=$user_token
      
    4. 定义 alice 用户与临时集群的组合

       kubectl config set-context alice-staging \
      --cluster=cluster-staging \
      --user=alice-staging \
      --namespace=alice
      
    5. 为用户将当前上下文切换到 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 (通过其服务帐户)仅读取默认名称空间中所有资源的权限。

Bitnami 指南对我很有用,即使你使用 minikube。最重要的是你的集群支持 RBAC。 Https://docs.bitnami.com/kubernetes/how-to/configure-rbac-in-your-kubernetes-cluster/