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

pet*_*erl 62 kubernetes kubectl kops

我在AWS上使用kops创建了一个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
Run Code Online (Sandbox Code Playgroud)

我需要让其他用户也能管理.本用户指南介绍了如何在其他用户计算机上定义这些用户指南,但未描述如何在群集本身内实际创建用户凭据.你怎么做到这一点?

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

Vin*_*met 86

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

对于用户,理想情况下,您使用Kubernetes(OpenID Connect)的身份提供程序.

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

如果您自行托管kubernetes(使用kops时就是这种情况),您可以使用coreos/dex与LDAP/OAuth2身份提供程序集成 - 这是Kubernetes文章的详细2部分SSO的一个很好的参考.

kops(1.10 +)现在具有内置身份验证支持,如果您使用AWS,则可以简化与AWS IAM作为身份提供程序的集成.

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

如果您正在寻找快速简便(从长远来看不是最安全且易于管理)的方式入门,您可能会滥用serviceaccounts- 有2个专用策略选项来控制访问.(见下文)

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

编辑:Bitnami的伟大指南也提供了RBAC的用户设置.

启用服务帐户访问的步骤(取决于您的群集配置是否包含RBAC或ABAC策略,这些帐户可能具有完全管理员权限!):

编辑:这是一个自动创建服务帐户的bash脚本 - 请参阅以下步骤

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

    kubectl create sa alice
    
    Run Code Online (Sandbox Code Playgroud)
  2. 得到相关的秘密

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

    kubectl get secret $secret -o json | jq -r '.data["ca.crt"]' | base64 -D > ca.crt
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从秘密获取服务帐户令牌

    user_token=$(kubectl get secret $secret -o json | jq -r '.data["token"]' | base64 -D)
    
    Run Code Online (Sandbox Code Playgroud)
  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}"`
    
    Run Code Online (Sandbox Code Playgroud)
  6. 在新机器上,请按照以下步骤操作(根据上述检索ca.cert$endpoint信息:

    1. 安装 kubectl

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

      kubectl config set-cluster cluster-staging \
        --embed-certs=true \
        --server=$endpoint \
        --certificate-authority=./ca.crt
      
      Run Code Online (Sandbox Code Playgroud)
    3. 设置用户凭据

      kubectl config set-credentials alice-staging --token=$user_token
      
      Run Code Online (Sandbox Code Playgroud)
    4. 定义alice用户与登台集群的组合

      kubectl config set-context alice-staging \
        --cluster=cluster-staging \
        --user=alice-staging \
        --namespace=alice
      
      Run Code Online (Sandbox Code Playgroud)
    5. 将当前上下文切换alice-staging为用户

      kubectl config use-context alice-staging
      
      Run Code Online (Sandbox Code Playgroud)

要使用策略控制用户访问(使用ABAC),您需要创建一个policy文件(例如):

{
  "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
  "kind": "Policy",
  "spec": {
    "user": "system:serviceaccount:default:alice",
    "namespace": "default",
    "resource": "*",
    "readonly": true
  }
}
Run Code Online (Sandbox Code Playgroud)

policy.json在每个主节点上配置此项--authorization-mode=ABAC --authorization-policy-file=/path/to/policy.json并向API服务器添加标志

这将允许Alice(通过她的服务帐户)只读取默认命名空间中所有资源的权限.