【问题标题】:How to Add Users to Kubernetes (kubectl)?如何将用户添加到 Kubernetes (kubectl)?
【发布时间】:2017-06-29 10:49:06
【问题描述】:

我已经使用kops 在 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

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

另外,只分享cluster.certificate-authority-data 是否安全?

【问题讨论】:

  • 看起来你想要service accounts
  • 我已经阅读了有关服务帐户的文档,这些文档表明它们很容易创建和检索 ca.crttoken,但这对于设置 kubeconfig 来说是不够的或正确的。如果你知道如何配置 kubeconfig,请告诉。

标签: kubernetes kubectl kops


【解决方案1】:

有关身份验证的完整概述,请参阅AuthenticationAuthorization 上的官方 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

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

    kubectl create sa alice
    
  2. 获取相关秘密

    secret=$(kubectl get sa alice -o json | jq -r .secrets[].name)
    
  3. 从秘密中获取ca.crt(使用OSX base64-D 标志进行解码)

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

    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(通过她的服务帐户)仅对默认命名空间中的所有资源拥有只读权限。

【讨论】:

  • 虽然,最好使用 ChatOps 提供只读访问、日志传送和通过 CI 系统管理部署。唯一烦人的部分是,如何让开发人员轻松访问控制台...
  • 仪表板访问使用 kubectl proxy & 并指向 locahost:8001 api/v1/proxy - kubernetes-dashboard 服务在 kube-system 命名空间
  • 完美。这就是我一直在寻找的。不过需要澄清一下:步骤 3 创建一个 ca.crt 文件,但步骤 6.2 正在寻找一个 ca.pem 文件。是否需要一些翻译,或者这只是一个错字?
  • 还请注意,您可以在您的机器上使用 export KUBECONFIG=alice-config 生成单个 alice-config 文件(嵌入证书)并将其发送给 alice(告诉她将其复制到 ~ /kube/config) - 但如果她需要管理多个集群和上下文,这会使她的任务复杂化
  • @VincentDeSmet 你说“对用户对象的更好支持仍在进行中”,你知道从那以后有什么变化吗?也许在 kubernetes/kubernetes 中有 RFC 或未解决的 PR/问题?
【解决方案2】:

你说:

我需要让其他用户也可以管理。

但是根据documentation

假定普通用户由外部独立服务管理。分发私钥的管理员、Keystone 或 Google 帐户等用户存储,甚至是包含用户名和密码列表的文件。在这方面,Kubernetes 没有代表普通用户帐户的对象。普通用户无法通过 API 调用添加到集群中。

您必须为此使用第三方工具。

== 编辑 ==

一种解决方案是在kubeconfig file 中手动创建用户条目。来自documentation

# 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

【讨论】:

  • 我在文档中也读到过,但问题是我使用 Kops 创建了集群并创建了初始管理员用户,因此必须有一种方法可以创建另一个。
  • 是的,在集群中创建用户后,您将使用 kubectl config 命令和 set-clusterset-credentialsset-context 指令,正如我在原始问题中提到的那样。但是如何在集群中创建实际用户呢?您从哪里获得与这些说明一起提供的实际证书?
  • 嗨@peterl,我也有同样的疑问……你有没有解决过这个问题?
  • 是的,我使用了 Vincent De Smet 的解决方案,效果很好。
【解决方案3】:

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

【讨论】:

  • 你不是说 RBAC 吗?你能澄清一下吗,这只是边界链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 2019-04-09
  • 2010-10-28
  • 1970-01-01
  • 2021-06-03
相关资源
最近更新 更多