在群集

时间:2018-05-28 15:22:43

标签: kubernetes kubectl kubernetes-helm

我已经启动并运行了Kubernetes 1.10群集。使用以下命令,我在集群中创建一个运行bash的容器:

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

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

./kubectl get pods

但收到以下错误:

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

这是否意味着,kubectl检测到它在群集内运行并自动连接到该群集?如何允许serviceaccount列出pod?我的最终目标是在容器内运行helm。根据我发现的文档,只要kubectl工作正常,这应该可以正常工作。

2 个答案:

答案 0 :(得分:7)

  

这是否意味着,kubectl检测到它在集群内部运行并自动连接到该集群?

是的,它使用KUBERNETES_SERVICE_PORT和KUBERNETES_SERVICE_HOST envvars来查找API服务器,并使用自动注入的/var/run/secrets/kubernetes.io/serviceaccount/token文件中的凭据进行身份验证。

  

如何允许serviceaccount列出pod?

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

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

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

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

答案 1 :(得分:0)

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"}

您可以在How to run kubectl commands inside a container?上查看我的答案,以获取 RoleBinding RBAC