在 Kubernetes 中为 kubectl 创建用户
Posted
技术标签:
【中文标题】在 Kubernetes 中为 kubectl 创建用户【英文标题】:Create user in Kubernetes for kubectl 【发布时间】:2017-12-10 10:27:51 【问题描述】:我需要创建用户以使用 RBAC 为他们分配权限,我创建它们的方式如下:
echo -n "lucia" | base64
bHVjaWE=
echo -n "pass" | base64
cGFzcw==
apiVersion: v1
kind: Secret
metadata:
name: lucia-secret
type: Opaque
data:
username: bHVjaWE=
password: cGFzcw==
或创建:
kubectl create secret generic lucia-secret --from-literal=username='lucia',password='pass'
我不知道如何继续
USER_NICK=lucia
kubectl config set-credentials $USER_NICK \
--username=lucia \
--password=pass
kubectl get secret lucia-secret -o json | jq -r '.data["ca.crt"]' | base64 -d > ca.crt
endpoint=`kubectl config view -o jsonpath=".clusters[?(@.name == \"$name\")].cluster.server"`
kubectl config set-cluster cluster-for-lucia \
--embed-certs=true \
--server=$endpoint \
--certificate-authority=./ca.crt
kubectl config set-context context-lucia \
--cluster=cluster-for-lucia \
--user=$USER_NICK \
--namespace=default
ca.crt 为空
感谢您的帮助!
【问题讨论】:
【参考方案1】:作为 kubernetes docs 和 Articles 使用证书为 kubectl 客户端创建或验证用户。但是,使用 ServiceAccount 有一种简单的方法可以做到这一点。可以使用 ServiceAccount 作为一个组来提供 RBAC 控制身份验证,它非常简单且具有描述性。以下是步骤。
我正在执行的所有步骤都在default
命名空间中。我将创建一个 pod 只读用户,它可以获取、列出、监视所有命名空间中的任何 pod。
创建一个 ServiceAccount,比如“readonlyuser”。
kubectl create serviceaccount readonlyuser
创建集群角色,例如“readonlyuser”。
kubectl create clusterrole readonlyuser --verb=get --verb=list --verb=watch --resource=pods
创建集群角色绑定,比如“readonlyuser”。
kubectl create clusterrolebinding readonlyuser --serviceaccount=default:readonlyuser --clusterrole=readonlyuser
现在从我们之前创建的 ServiceAccount 的 secret 中获取令牌。我们将使用此令牌对用户进行身份验证。
TOKEN=$(kubectl describe secrets "$(kubectl describe serviceaccount readonlyuser | grep -i Tokens | awk 'print $2')" | grep token: | awk 'print $2')
现在在 kube 配置文件中设置用户的凭据。我使用“vikash”作为用户名。
kubectl config set-credentials vikash --token=$TOKEN
现在创建一个上下文说 podreader。我在这里使用我的集群名称“kubernetes”。
kubectl config set-context podreader --cluster=kubernetes --user=vikash
最后使用上下文。
kubectl config use-context podreader
就是这样。现在可以执行kubectl get pods --all-namespaces
。也可以通过执行给定的方式来检查访问:
~ : $ kubectl auth can-i get pods --all-namespaces
yes
~ : $ kubectl auth can-i create pods
no
~ : $ kubectl auth can-i delete pods
no
【讨论】:
这种方法有没有可用的文档??【参考方案2】:在本指南中,您可以了解如何为您的集群配置用户:https://docs.bitnami.com/kubernetes/how-to/configure-rbac-in-your-kubernetes-cluster/#use-case-1-create-user-with-limited-namespace-access
长话短说:
为用户创建证书 创建证书签名请求 使用集群证书颁发机构签署证书 为您的用户创建配置 为此用户或其组添加 RBAC 规则关于ca.crt
,你需要在你的master主机中找到它。
已编辑:如果是 GKE,请在此处查看 https://cloud.google.com/container-engine/docs/iam-integration
【讨论】:
感谢您的回答,我知道那个条目,但问题是我找不到 ca.key,我正在使用 GKE 和 container-vm。是文件--client-ca-file=XXXX? 我唯一找不到的是集群 GKE 中的 ca.key。 在 GKE 的情况下,它似乎是这样工作的:cloud.google.com/container-engine/docs/iam-integration @JavierSalmeron 我已经在牧场主上设置了 kubernetes。你能帮我找到 ca.crt 吗?【参考方案3】:对我有用的更新有点晚。 我还需要按命名空间过滤,让开发人员只读访问主要应用程序资源,而不是节点、机密、入口控制器、入口或其他命名空间。
修改并应用以下 YAML:
apiVersion: v1
kind: ServiceAccount
metadata:
name: sa-reader
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: reader-cr
rules:
- verbs: ["get", "list", "watch"]
resources:
- namespaces
- services
- endpoints
- pods
- deployments
- configmaps
- jobs
- cronjobs
- daemonsets
- statefulsets
- replicasets
- persistentvolumes
apiGroups: ["","apps","batch"]
- verbs: ["create", "delete"]
resources: ["pods"]
apiGroups: [""]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-tuxerrante-pods-rb
namespace: tuxerrante
subjects:
- kind: ServiceAccount
name: sa-reader
namespace: default
roleRef:
kind: ClusterRole
name: reader-cr
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-tuxerrante-round-pods-rb
namespace: tuxerrante-round
subjects:
- kind: ServiceAccount
name: sa-reader
namespace: default
roleRef:
kind: ClusterRole
name: reader-cr
apiGroup: rbac.authorization.k8s.io
# THIS WILL APPEND CONFIGURATIONS TO YOUR CURRENT KUBECONFIG
$ TOKEN=$(kubectl describe -n default secrets "$(kubectl describe -n default serviceaccount sa-reader | grep -i Tokens | awk 'print $2')" | grep token: | awk 'print $2')
$ kubectl config set-credentials reader-user --token=$TOKEN
$ kubectl config set-context cluster-reader --cluster=cluster-svil --user=reader-user
# I PREFER TO COPY THE PREVIOUS NEW CONFIG IN A NEW FILE AND THEN USE IT
#
$ export KUBECONFIG=~/.kube/tuxerrante-reader.kubeconfig
$ kubectl config use-context cluster-reader
$ kubectl auth can-i get pods --all-namespaces
$ kubectl auth can-i create pods
$ kubectl auth can-i delete pods
$ kubectl -n tuxerrante get pods
【讨论】:
以上是关于在 Kubernetes 中为 kubectl 创建用户的主要内容,如果未能解决你的问题,请参考以下文章
在windows电脑上配置kubectl远程操作kubernetes