发布于 2026-01-06 0 阅读
0

调试 Kubernetes:使用服务帐户执行 kubectl 命令 需要什么? 是什么? 如何操作? 结论

调试 Kubernetes:使用服务帐户执行 kubectl 命令

需要

为什么?

什么?

如何?

结论

正如您所知,Kubernetes 并非易事。它是一项强大的云技术,但调试或排查问题可能既耗时又费力,而且需要了解多种解决方案。

正因如此,我创作了很多关于 Kubernetes 的技术草图笔记,你可以在“以可视化的方式理解 Kubernetes”中看到它们。我还创作了一系列新的视频,将草图笔记和音频内容结合起来。现在我的新想法是发表一篇专注于一个问题/一个需求的文章。

需要

在本文中,我们将重点关注一个需求:
通常当我连接到集群时,我拥有所有权限(集群管理员),那么如何以普通用户身份(作为用户ServiceAccount)连接到 Kubernetes 集群并执行 kubectl 命令呢?

为什么?

在许多情况下,您都可能需要这种功能。
假设您有一个(或多个)Kubernetes 集群,每个集群namespace(例如每个团队项目)都有隔离级别,并且集群中的用户拥有不同的权限ClusterRole

当您想要添加或编辑用户权限并测试其行为时,您需要以用户身份进行测试。

什么?

替代文字

本文中,我们需要在 Kubernetes 集群中以具有特定权限的用户身份执行 kubectl 命令ClusterRole。该用户应该只对特定文件中的密钥拥有只读权限namespace

如何?

在这个用例中,您的集群中已经存在 `<T>`Roles和 `<T>` ClusterRoles,因为您想测试它们^^,但如果您还没有 `<T>`ClusterRole并且想要测试此基于角色的访问控制 (RBAC)设置,则以下步骤允许您创建一个 `<T>` ClusterRole

  • 0. 创建一个权限,授予集群中ClusterRole所有成员读取密钥的权限namespaces
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]
Enter fullscreen mode Exit fullscreen mode

以下是创建 Kubernetes 资源的步骤列表,允许namespace您在此命名空间中添加一些权限,生成 kubeconfig 文件,并以ServiceAccount具有您要测试的权限的用户身份在 Kubernetes 集群中执行命令。

  • 1. 创建namespace“test-ns”
$ kubectl create ns test-ns
Enter fullscreen mode Exit fullscreen mode
  • ServiceAccount2.在此创建一个名为“my-sa-test”的文件夹namespace
$ kubectl create serviceaccount my-sa-test -n test-ns
Enter fullscreen mode Exit fullscreen mode
  • 3. 创建一个RoleBinding授予 my-sa-test 秘密读取权限的记录
$ kubectl create rolebinding read-pods -n test-ns --clusterrole=secret-reader --serviceaccount=test-ns.my-sa-test
Enter fullscreen mode Exit fullscreen mode
  • 4. 为创建的ServiceAccount“my-sa-test”创建一个kubeconfig文件
$ export SECRET_NAME_SA=`kubectl get sa my-sa-test -n test-ns -ojsonpath="{ .secrets[0].name }"`
$ export TOKEN_SA=`kubectl get secret $SECRET_NAME_SA -n test-ns -ojsonpath='{.data.token}' | base64 -d`
$ kubectl config view --raw --minify > kubeconfig.txt
$ kubectl config unset users --kubeconfig=kubeconfig.txt
$ kubectl config set-credentials ${SECRET_NAME_SA} --kubeconfig=kubeconfig.txt --token=${TOKEN_SA}
$ kubectl config set-context --current --kubeconfig=kubeconfig.txt --user=${SECRET_NAME_SA}
Enter fullscreen mode Exit fullscreen mode
  • 5. 在集群中以管理员身份执行 kubectl 命令ServiceAccount
$ kubectl --kubeconfig=kubeconfig.txt get secrets -n test-ns
Enter fullscreen mode Exit fullscreen mode

或者,您可以kubectl直接使用 ServiceAccount 令牌执行命令(无需创建另一个 kubeconfig 文件):

$ export NAMESPACE_SA=test-ns
$ export TEAM_SA=my-sa-test

$ export TOKEN=$(kubectl get $(kubectl get secret -o name -n ${NAMESPACE_SA} |grep  ${TEAM_SA} ) -o jsonpath='{.data.token}' -n ${NAMESPACE_SA} | base64 -d)

$ kubectl --token=${TOKEN} get ns
Enter fullscreen mode Exit fullscreen mode

太棒了!
现在我只需要拥有我这个用户的权限,就可以模拟我的用户的行为了!:-)

结论

我希望这一系列包含具体示例和用例的文章能够帮助您更好地理解 Kubernetes。

文章来源:https://dev.to/stack-labs/debugging-kubernetes-execute-kubectl-commands-with-a-service-account-1k44