在Kubernetes中为kubectl创建用户

20

我需要创建用户并使用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 为空

谢谢你的帮助!

3个回答

44

在kubernetes docs和文章中,使用证书创建或验证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

  • 现在创建一个Context,例如podreader。我在这里使用我的集群名称“kubernetes”。
  • kubectl config set-context podreader --cluster=kubernetes --user=vikash

  • 最后使用该context。
  • 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

这种方法有没有可用的文档? - knowledge20

22

本指南介绍如何为您的集群配置用户: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,您需要在主机上找到它。

更新:在GKE的情况下,请查看此处:https://cloud.google.com/container-engine/docs/iam-integration


1
谢谢您的回答,我知道那个入口,但问题是我找不到ca.key文件,我正在使用带有容器VM的GKE。这个文件是--client-ca-file=XXXX吗? - jbelenus
1
我在我的 GKE 集群中找不到的唯一东西是 ca.key。 - jbelenus
在GKE的情况下,它似乎是这样工作的:https://cloud.google.com/container-engine/docs/iam-integration - Javier Salmeron
@JavierSalmeron 我在Rancher上架设了Kubernetes。您能帮我找到ca.crt文件吗? - Swapnil Pandey

0
这是关于我的一点晚更新。
我还需要按命名空间进行过滤,以便为开发人员提供对主应用程序资源的只读访问权限,但不包括节点、秘密、入口控制器、入口或其他命名空间。

修改并应用以下 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接