运行 集群内的 kubectl

Run kubectl inside a cluster

我有一个 Kubernetes 1.10 集群,运行正在运行。使用以下命令,我在集群中创建了一个容器 运行ning bash:

kubectl run tmp-shell --rm -i --tty --image centos -- /bin/bash

我在 运行ning 容器中下载了正确版本的 kubectl,使其可执行并尝试 运行

./kubectl get pods

但出现以下错误:

Error from server (Forbidden): pods is forbidden:
User "system:serviceaccount:default:default" cannot
list pods in the namespace "default"

这是否意味着 kubectl 检测到它 运行ning 在一个集群中并且自动连接到那个集群?如何允许服务帐户列出 pods?我的最终目标将是 运行 helm 容器内。根据我发现的文档,一旦 kubectl 正常工作,这应该可以正常工作。

Does this mean, that kubectl detected it is running inside a cluster and is automatically connecting to that one?

是的,它使用 KUBERNETES_SERVICE_PORT 和 KUBERNETES_SERVICE_HOST 环境变量来定位 API 服务器,并使用自动注入的 /var/run/secrets/kubernetes.io/serviceaccount/token 文件中的凭据来验证自己。

How do I allow the serviceaccount to list the pods?

这取决于您使用的授权模式。如果您使用的是 RBAC(这是典型的),则可以通过创建 RoleBinding 或 ClusterRoleBinding 对象向该服务帐户授予权限。

有关详细信息,请参阅 https://kubernetes.io/docs/reference/access-authn-authz/rbac/#service-account-permissions

我认为 helm 需要广泛的权限(基本上是集群上的超级用户)。第一步是确定哪个服务帐户 helm 是 运行(检查 helm pods 中的 serviceAccountName)。然后,要向该服务帐户授予超级用户权限,运行:

kubectl create clusterrolebinding helm-superuser \
  --clusterrole=cluster-admin \
  --serviceaccount=$SERVICEACCOUNT_NAMESPACE:$SERVICEACCOUNT_NAME

True kubectl 将尝试获取向主服务器进行身份验证所需的一切。

但是使用 ClusterRole 和“cluster-admin”,您将为该 pod 的所有名称空间授予无限权限,听起来有点有风险。

对我来说,在我的 Kubernetes 容器中为 kubectl 客户端添加额外的 43MB 有点烦人,但替代方案是使用其中一个 SDK 用于实现更基本的客户端。 kubectl 更容易进行身份验证,因为客户端将从 /var/run/secrets/kubernetes.io/serviceaccount 获得所需的令牌,而且我们可以根据需要使用清单文件。我认为对于大多数常见的 Kubernetes 设置,你不应该添加任何额外的环境变量或附加任何卷秘密,如果你有正确的 ServiceAccount 就会工作。

然后你可以测试是否正在使用类似的东西:

$ kubectl exec -it <your-container-with-the-attached-privs> -- /kubectl get pods -n <YOUR_NAMESPACE>
NAME.        READY   STATUS    RESTARTS   AGE
pod1-0       1/1     Running   0          6d17h
pod2-0       1/1     Running   0          6d16h
pod3-0       1/1     Running   0          6d17h
pod3-2       1/1     Running   0          67s

或权限被拒绝:

$ kubectl exec -it <your-container-with-the-attached-privs> -- /kubectl get pods -n kube-system
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:spinupcontainers" cannot list resource "pods" in API group "" in the namespace "kube-system"
command terminated with exit code 1

测试于:

$ kubectl exec -it <your-container-with-the-attached-privs> -- /kubectl versionClient Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:20:10Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:12:17Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}

您可以在 查看我对 RoleBindingRBAC.

的回答